久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7857|回復: 3
收起左側

單片機LCD1602字符液晶滾動演示程序(有注釋)

[復制鏈接]
ID:762946 發表于 2020-5-27 22:33 | 顯示全部樓層 |閱讀模式
功能說明:
按下K1按鈕使預先設定好的字符在LCD屏上自動垂直滾動播放
按下K2按鈕使預先設定好的字符在LCD屏上自動水平滾動播放按下K3按鈕暫停/繼續播放#include<reg51.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
void Initialize_LCD();
void DelayMS(uint ms);
void ShowString(uchar,uchar,uchar *);
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
uchar code Prompt[]="Press K1 - K3 ToStart Demo Prog";
//待滾動顯示的信息段落,每行不超過80個字符,共6行
uchar const Line_Count=6;  
uchar code Msg[][80]=
{
       "ManyCAD users dismiss schematic capture as a necessary evil in the ",
       "processof creating PCB layout but we have always disputed this point ",
       "ofview. With PCB layout now offering automation of both component ",
       "canoften be the most time consuming element of the exercise.",
       "Andif you use circuit simulation to develop your ideas, ",
       "youare going to spend even more time working on the schematic."
};
//顯示緩沖(2行)
uchar Disp_Buffer[32];
//垂直滾動顯示
void V_Scroll_Display()
{
       uchari,j,k=0;
       uchar*p=Msg[0];
       uchar*q=Msg[Line_Count]+strlen(Msg[Line_Count]);
       //以下僅使用顯示緩沖的前16字節空間
       while(p<q)
       {
              for(i=0;i<16&&p<q;i++)
              {     //消除顯示緩沖中待顯示行首尾可能出現的空格
                     if((i==0||i==15)&&*p=='') p++;
                     if(*p!='\0')
                     {
                            Disp_Buffer[ i]=*p++;
                     }
                     else
                     {
                            if(++k>Line_Count)break;
                            p=Msg[k];                                  //p指向下一串的首地址
                            Disp_Buffer[ i]=*p++;
                     }
              }
              //不足16個字符時空格補充
              for(j=i;j<16;j++)Disp_Buffer[j]=' ';
              //垂直滾動顯示
              while(F0)DelayMS(5);
              ShowString(0,0,"                 ");
              DelayMS(150);
              while(F0)DelayMS(5);
              ShowString(0,1,Disp_Buffer);
              DelayMS(150);
              while(F0)DelayMS(5);
              ShowString(0,0,Disp_Buffer);
              ShowString(0,1,"                 ");
              DelayMS(150);
       }
       //最后清屏
       ShowString(0,0,"                 ");
       ShowString(0,1,"                 ");
}
//水平滾動顯示
void H_Scroll_Display()
{
       uchari,j,k=0,L=0;
       uchar*p=Msg[0];
       uchar*q=Msg[Line_Count]+strlen(Msg[Line_Count]);
       //將32個字符的顯示緩沖前16個字符設為空格
       for(i=0;i<16;i++)Disp_Buffer[ i]=' ';
       while(p<q)
       {
              //忽略緩沖中首尾可能出現的空格
              if((i==16||i==31)&&*p=='') p++;
              for(i=16;i<32&&p<q;i++)
              {     
                     if(*p!='\0')
                     {
                            Disp_Buffer[ i]=*p++;
                     }
                     else
                     {
                            if(++k>Line_Count)break;
                            p=Msg[k];                                  //p指向下一串的首地址
                            Disp_Buffer[ i]=*p++;
                     }
              }
              //不足32個字符時空格補充
              for(j=i;j<32;j++)Disp_Buffer[j]=' ';
              //水平滾動顯示
              for(i=0;i<=16;i++)
              {
                     while(F0)DelayMS(5);
                     ShowString(0,L,Disp_Buffer+i);
                     while(F0)DelayMS(5);
                     DelayMS(20);
              }
              L=(L==0)?1:0;             //行號在0,1間交替
              DelayMS(300);
       }
       //如果顯示結束時停留在第0行,則清除第1行的內容
       if(L==1)ShowString(0,1,"                ");   
}
//外部中斷0,由K3控制暫停與繼續顯示
void EX_INT0() interrupt 0
{
       F0=!F0;         //暫停與繼續顯示控制標志位
}
//主程序
void main()
{
       uintCount=0;
       IE=0x81;       //允許外部中斷0
       IT0=1;                  //下降沿觸發
       F0=0;                   //暫停與繼續顯示控制標志位
       Initialize_LCD();
       ShowString(0,0,Prompt);
       ShowString(0,1,Prompt+16);
       while(1)
       {
              if(K1==0)
              {
                     V_Scroll_Display();
                     DelayMS(300);
              }
              else
              if(K2==0)
              {     
                     H_Scroll_Display();
                     DelayMS(300);     
              }
       }
}
//LCD1602.c
/*    名稱:液晶控制與顯示程序
       說明:本程序是通用的1602液晶控制程序。
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
//延時
void DelayMS(uint ms)
{
       uchari;
       while(ms--)for(i=0;i<120;i++);
}
//忙檢查
uchar Busy_Check()
{
       ucharLCD_Status;
       RS=0;                          //寄存器選擇
       RW=1;                         //讀狀態寄存器
       EN=1;                         //開始讀
       DelayMS(1);
       LCD_Status=P0;
       EN=0;
       returnLCD_Status;
}
//寫LCD命令
void Write_LCD_Command(uchar cmd)
{
       while((Busy_Check()&0x80)==0x80);       //忙等待
       RS=0;            //選擇命令寄存器
       RW=0;           //寫
       EN=0;   
       P0=cmd;EN=1;DelayMS(1);EN=0;
}
//發送數據
void Write_LCD_Data(uchar dat)
{
       while((Busy_Check()&0x80)==0x80);       //忙等待
       RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;
}
//LCD初始化
void Initialize_LCD()
{
       Write_LCD_Command(0x38);DelayMS(1);
       Write_LCD_Command(0x01);DelayMS(1);       //清屏
       Write_LCD_Command(0x06);DelayMS(1);       //字符進入模式:屏幕不動,字符后移
       Write_LCD_Command(0x0c);DelayMS(1);       //顯示開,光標關
}
//顯示字符串
void ShowString(uchar x,uchar y,uchar *str)
{
       uchari=0;
       if(y==0)Write_LCD_Command(0x80|x);   //設置顯示起始位置
       if(y==1)Write_LCD_Command(0xc0|x);
       for(i=0;i<16;i++)                               //輸出字符串
       {
              Write_LCD_Data(str[ i]);
       }
}




仿真原理圖

仿真原理圖

Keil C.7z

7.95 KB, 下載次數: 83, 下載積分: 黑幣 -5

源程序

1602字符液晶滾動演示程序.zip

9.24 KB, 下載次數: 77, 下載積分: 黑幣 -5

proteus仿真

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1072531 發表于 2023-4-18 18:21 | 顯示全部樓層
我的為什么63個錯誤
回復

使用道具 舉報

ID:1032857 發表于 2023-4-20 11:08 | 顯示全部樓層
好資料,51黑有你更精彩,版主更牛!!!
回復

使用道具 舉報

ID:1073299 發表于 2023-4-22 15:13 來自手機 | 顯示全部樓層
先收藏,以后測試看看
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线网 | 亚洲午夜精品久久久久久app | 欧美日韩国产在线观看 | 中文字幕av一区 | 欧美中文字幕一区 | 日日想夜夜操 | 欧美亚洲视频在线观看 | 亚洲欧美激情视频 | 亚洲精品乱码久久久久久久久 | 国产成人精品一区二区三区在线观看 | 久久综合影院 | 人人亚洲 | 亚洲精品成人网 | 人碰人操| 午夜影院在线观看视频 | 日本免费小视频 | 色网在线看 | 国产精品久久久乱弄 | 亚洲精品久久久久久首妖 | 亚洲国产二区 | 久久久久久久久淑女av国产精品 | 中文字幕观看 | 国产乡下妇女做爰 | 亚洲网站在线 | 人人艹人人 | av黄色片在线观看 | 九九热这里只有精品在线观看 | 福利精品 | 欧美在线视频一区二区 | 中文字幕一区二区三 | 综合成人在线 | 九九久久精品视频 | 久久久久久黄 | 一区二区三区免费在线观看 | 玖玖爱365 | 国内久久 | 国产精品久久久久久久久久免费看 | 国产一区二区三区视频在线观看 | 欧美日韩国产一区二区三区不卡 | 亚洲精品免费观看 | 亚洲国产精品久久 |