欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7977|回復: 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 來自觸屏版 | 顯示全部樓層
先收藏,以后測試看看
回復

使用道具 舉報

8#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表