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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7821|回復: 3
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:762946 發(fā)表于 2020-5-27 22:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
功能說明:
按下K1按鈕使預先設(shè)定好的字符在LCD屏上自動垂直滾動播放
按下K2按鈕使預先設(shè)定好的字符在LCD屏上自動水平滾動播放按下K3按鈕暫停/繼續(xù)播放#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字節(jié)空間
       while(p<q)
       {
              for(i=0;i<16&&p<q;i++)
              {     //消除顯示緩沖中待顯示行首尾可能出現(xiàn)的空格
                     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個字符設(shè)為空格
       for(i=0;i<16;i++)Disp_Buffer[ i]=' ';
       while(p<q)
       {
              //忽略緩沖中首尾可能出現(xiàn)的空格
              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);
       }
       //如果顯示結(jié)束時停留在第0行,則清除第1行的內(nèi)容
       if(L==1)ShowString(0,1,"                ");   
}
//外部中斷0,由K3控制暫停與繼續(xù)顯示
void EX_INT0() interrupt 0
{
       F0=!F0;         //暫停與繼續(xù)顯示控制標志位
}
//主程序
void main()
{
       uintCount=0;
       IE=0x81;       //允許外部中斷0
       IT0=1;                  //下降沿觸發(fā)
       F0=0;                   //暫停與繼續(xù)顯示控制標志位
       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;                         //讀狀態(tài)寄存器
       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;
}
//發(fā)送數(shù)據(jù)
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);       //顯示開,光標關(guān)
}
//顯示字符串
void ShowString(uchar x,uchar y,uchar *str)
{
       uchari=0;
       if(y==0)Write_LCD_Command(0x80|x);   //設(shè)置顯示起始位置
       if(y==1)Write_LCD_Command(0xc0|x);
       for(i=0;i<16;i++)                               //輸出字符串
       {
              Write_LCD_Data(str[ i]);
       }
}




仿真圖.jpg (173.36 KB, 下載次數(shù): 108)

仿真原理圖

仿真原理圖

Keil C.7z

7.95 KB, 下載次數(shù): 83, 下載積分: 黑幣 -5

源程序

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

9.24 KB, 下載次數(shù): 77, 下載積分: 黑幣 -5

proteus仿真

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1072531 發(fā)表于 2023-4-18 18:21 | 只看該作者
我的為什么63個錯誤
回復

使用道具 舉報

板凳
ID:1032857 發(fā)表于 2023-4-20 11:08 | 只看該作者
好資料,51黑有你更精彩,版主更牛!!!
回復

使用道具 舉報

地板
ID:1073299 發(fā)表于 2023-4-22 15:13 來自手機 | 只看該作者
先收藏,以后測試看看
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久九九九女人毛片 | 欧美日韩在线观看视频网站 | 日韩精品在线视频 | 午夜99| 一区欧美 | 亚洲精品一区二区在线观看 | 欧美一区日韩一区 | 久久精品免费观看 | 日韩午夜影院 | 伊人免费视频二 | 999免费视频 | 毛片1 | 国产成人精品一区二三区在线观看 | 久久国产精品视频 | 精品成人佐山爱一区二区 | 日本三级精品 | 亚洲精品久久久久久久久久久久久 | 国产伦精品一区二区三区高清 | 久久久999国产精品 中文字幕在线精品 | 国产精品三级久久久久久电影 | 国产精品毛片久久久久久久 | 天天精品在线 | 成人国产精品一级毛片视频毛片 | 成人福利在线 | 先锋资源亚洲 | 91精品国产91久久久久久丝袜 | 伊人天堂网| 亚洲综合99 | www.成人久久 | 久久国产精品72免费观看 | 国产成人免费视频 | 国产sm主人调教女m视频 | 91久久精品视频 | 日本网站免费在线观看 | 国产 日韩 欧美 中文 在线播放 | 精品小视频 | 国产一区二区在线播放 | 波多野结衣一二三区 | 特级生活片 | 日韩高清中文字幕 | 久草在线|