如何用lcd1602与单片机连接使得1602显示屏向上滚

基于单片机的dht11温湿度显示在lcd1602上的程序? - 知乎9被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答11 条评论分享收藏感谢收起如何用单片机使得1602显示屏向上滚_百度知道
如何用单片机使得1602显示屏向上滚
我有更好的答案
其实也是可以的啊,怎么会无法实现呢?可以在行列语句中,将行使用一个变量表示,然后通过数据,采用0,1求模,变量使用递加方式,应该是可以的吧,我没有具体去试它,但是应该不是问题。
采纳率:44%
1062无法实现。不过用自定义的字符倒是可以,就是每移动一行改变下自定义的字模,字符不多,实现麻烦,不推荐。
不会,直接用彩屏
好像不能实现
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
单片机的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。查看: 8844|回复: 4
完全解读lcd1602基础接口及C51实现滚动显示
第一次写教程哈,多多包涵/羞射先介绍下lcd1602芯片,LCD1602 分为带背光和不带背光两种,基控制器大部分为 HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别.字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。lcd1602即为1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图所示。正面
LCD1602主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm引脚功能说明LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表所示:各引脚接口
第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。
LCD地址映射图
注释:列,屏幕所能显示的地址为00H~0FH(第一行),40H~4FH(第二行),其他地址可以存储待显示的数据。这就给我们的花样显示提供了条件哈:-D
运行时序图:
注释:这里的读操作指的是C51读1602的总线数据,RS=0,RW=1的时候,E给高电平则可以读到显示屏的状态,这个功能一般用于读忙,除了初始化之外,每次对1602进行读写操作都要读忙检测,当总线最高为STAD7=1则为繁忙,禁止读写操作。
注释:这里指的是C51往1602写数据/命令,通过使能E的高脉冲写入,在E的下降沿就执行写入的命令或者显示写入的数据。
接下来简要介绍下1602的相关指令指令表(详细命令请查阅相关手册)
常用命令& &:0x80+0xdd:dd为地址,这条命令用于设置显示起点坐标& && && && && && & 0x0c& && && && &:开显示,无光标,光标不闪烁 。一般做带键盘输入的才加入光标,如计算器。常用的计量显示不显示光标。& && && && && && &&&0x06& && && &&&:写一个数据,地址指针加1,由1602地址表可以看出,实际上就是设置成从左往右写数据而已。& && && && && && &&&0x38& && && &&&: 设置显示模式,16x2显示 5x7点阵,8位数据接口。端口不够用时,这个命令也可以换用4位数据接口的。& && && && && && &&&0x01& && && &&&:清屏。
电路连接图:这里用的带背光的1602
接下来写相关子程序://写入命令子函数void LcdWriteCom(unsigned char com){&&LCD_RS=0;&&LCD_RW=0;&&LCD_GPIO=&&delay1ms(1);&&LCD_E=1;&&delay1ms(1);&&LCD_E=0; }//写入数据子函数void LcdWriteData(unsigned char dat){&&LCD_RS=1;&&LCD_RW=0;&&LCD_GPIO=&&delay1ms(1);&&LCD_E=1;&&delay1ms(1);&&LCD_E=0;}//读忙子函数bit LCD_bz(void){&&&&LCD_RS=0;&&LCD_RW=1;&&LCD_E=1;&&delay1ms(10);&&P0=0& && && &&&//C51单片机读引脚要先置高电平,原因不赘述,很多资料没有这一步骤,大家格外注意下&&bz=(bit)(LCD_GPIO&0x80);&&LCD_E=0;&&}
//延时子程序void delay1ms(unsigned int t){&&unsigned int i,j;& && && && &&&//节约内存起见,建议用uchar,由于后面要做动态显示,为了满足显示效果,这里用了uint&&for(i=0;i&&{& & for(j=0;j&300;j++);&&}}//初始化显示屏程序void LcdInit(){&&LcdWriteCom(0x38);//显示模式2行16列&&LcdWriteCom(0x0c);//开显示 无光标 不闪烁&&LcdWriteCom(0x06);//写一个指针加1&&LcdWriteCom(0x01);//清屏&&LcdWriteCom(0x80);//设置(0,0)为起点}
主程序://我们要把第一行做成一个16字符固定显示,第二行做成滚动显示25字符//这里采用的是1602指针右移的基础命令而不是整屏右移命令
#include#define LCD_GPIO&&P0void LcdWriteCom(unsigned char); //写入命令子函数声明void LcdWriteData(unsigned char);//写入数据子函数声明void LcdInit();//显示屏初始化子函数声明void delay1ms(unsigned int);//延时函数声明bit LCD_bz(void);//读忙函数声明sbit LCD_RW=P2^5;sbit LCD_RS=P2^6;sbit LCD_E=P2^7;unsigned char displayDate1[]=&& & I'm Cesar& &&;//一共16个字符(包括空格在内)unsigned char displayDate2[]=& Please add QQ&&&;//一共25个字符void main(void){&&unsigned char i=0,j=0,n=0;&&LcdInit();LcdWriteCom(0x80);//设置坐标为第一行第一个字符 for(i=;i&16;i++) {& &LcdWriteData(displayDate1[ i]); }while(1)
&&{ if(LCD_bz())& && &//读忙,结束本次循环
LcdWriteCom(0x80+0x40);//设置第二行第一个字符起点 for(j=n;j&25+n;j++)//我们没有进行整屏右移,但是我们进行了数组右移O(∩_∩)O~ {& &LcdWriteData(displayDate2[j]); }& && &n++;//数组的显示起点右移,这样实现了滚动 if(n&=(25-15))//当显示移到最右边时,停顿片刻,返回起点再次循环& &{& && && &n=0;& && && &delay1ms(2000);& && &&&}& && &delay1ms(600);&&}}下载到C51调试结果:
好了,本次教程结束,写了一个上午,吃饭去了/(ㄒoㄒ)/~~。
共享资料的黑币奖励!
看着很不错,拿来研究下
//读忙子函数
bit LCD_bz(void)
&&LCD_RS=0;
&&LCD_RW=1;
&&LCD_E=1;
&&delay1ms(10);
&&P0=0& && && &&&//C51单片机读引脚要先置高电平,原因不赘述,很多资料没有这一步骤,大家格外注意下
&&bz=(bit)(LCD_GPIO&0x80);
&&LCD_E=0;
这个读忙子函数的作用就是bz=(bit)(LCD_GPIO&0x80),取LCD_GPIO 的最高位,返回给bz?为什么LCD_GPIO的最高位就能反映LCD的忙闲状态呢?
if(LCD_bz())
& && &//读忙,结束本次循环
主程序中,加入这个if(LCD_bz())函数的作用是什么,不加会怎样呢?
跳转到哪里去了?
if(n&=(25-15))//当显示移到最右边时,停顿片刻,返回起点再次循环
请问这句里面的25-15是怎么来的,怎么理解
Powered by单片机中怎么实现显示多个界面的LCD1602? 就是很多不同的内容怎么轮流显示?还有怎么实现滚屏?_百度知道
单片机中怎么实现显示多个界面的LCD1602? 就是很多不同的内容怎么轮流显示?还有怎么实现滚屏?
我有更好的答案
LCD1602有这个功能,只要使用相应的命令就好
采纳率:20%
编程的问题,滚动就是靠程序实现,有点麻烦,但没有高深的技术,只是需要些耐心而已。
有没有这样的程序,发给我一下,谢谢。我的邮箱是
没有。我做过LED滚屏的,汇编程序,给你也看不懂
//可能我和你的单片机型号不一样,拿去自己改改#include &reg52.h&#include &intrins.h&#define uint unsigned int#define uchar unsigned char#define delayNOP() sbit DQ = P3^3;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar code Temp_Disp_Title[]=;uchar Current_Temp_Display_Buffer[]=;uchar code Temperature_Char[8] = {
0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};uchar code df_Table[]={
0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};uchar CurrentT = 0;uchar Temp_Value[]=;uchar Display_Digit[]=;bit DS18B20_IS_OK = 1;void DelayXus(uint x){ while(x--) {
for(i=0;i&200;i++); }}bit LCD_Busy_Check(){ LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN=0;}void Write_LCD_Command(uchar cmd){ while(LCD_Busy_Check()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0;}void Write_LCD_Data(uchar dat){ while(LCD_Busy_Check()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0;}void LCD_Initialise(){
Write_LCD_Command(0x01); DelayXus(5); Write_LCD_Command(0x38); DelayXus(5); Write_LCD_Command(0x0c); DelayXus(5); Write_LCD_Command(0x06); DelayXus(5); }void Set_LCD_POS(uchar pos){
Write_LCD_Command(pos|0x80); }void Delay(uint x){
while(--x);}uchar Init_DS18B20(){ DQ = 1; Delay(8); DQ = 0; Delay(90); DQ = 1; Delay(8); DQ = 1;}uchar ReadOneByte(){
uchar i,dat=0; DQ = 1; _nop_(); for(i=0;i&8;i++) {
dat &&= 1;
dat |= 0X80;
Delay(30);
DQ = 1; }}void WriteOneByte(uchar dat){ for(i=0;i&8;i++) {
DQ = dat& 0x01;
dat &&= 1; }}void Read_Temperature(){
if(Init_DS18B20()==1)
DS18B20_IS_OK=0; else {
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
Temp_Value[0] = ReadOneByte();
Temp_Value[1] = ReadOneByte();
DS18B20_IS_OK=1;
} }void Display_Temperature(){ uchar t = 150, ng = 0; if((Temp_Value[1]&0xf8)==0xf8) {
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
} Display_Digit[0] = df_Table[Temp_Value[0]&0x0f]; CurrentT = ((Temp_Value[0]&0xf0)&&4) | ((Temp_Value[1]&0x07)&&4); Display_Digit[3] = CurrentT/100; Display_Digit[2] = CurrentT%100/10; Display_Digit[1] = CurrentT%10; Current_Temp_Display_Buffer[11] = Display_Digit[0] + &#39;0&#39;; Current_Temp_Display_Buffer[10] = &#39;.&#39;; Current_Temp_Display_Buffer[9]
= Display_Digit[1] + &#39;0&#39;; Current_Temp_Display_Buffer[8]
= Display_Digit[2] + &#39;0&#39;; Current_Temp_Display_Buffer[7]
= Display_Digit[3] + &#39;0&#39;; if(Display_Digit[3] == 0)
Current_Temp_Display_Buffer[7]
= &#39; &#39;; if(Display_Digit[2] == 0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]
= &#39; &#39;; if(ng) {
if(Current_Temp_Display_Buffer[8]
== &#39; &#39;)
Current_Temp_Display_Buffer[8]
= &#39;-&#39;;
else if(Current_Temp_Display_Buffer[7]
== &#39; &#39;)
Current_Temp_Display_Buffer[7]
= &#39;-&#39;;
Current_Temp_Display_Buffer[6]
= &#39;-&#39;; } Set_LCD_POS(0x00); for(i=0;i&16;i++) {
Write_LCD_Data(Temp_Disp_Title[i]);
} Set_LCD_POS(0x40); for(i=0;i&16;i++) {
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
Set_LCD_POS(0x4d); Write_LCD_Data(0x00); Set_LCD_POS(0x4e); Write_LCD_Data(&#39;C&#39;);}void main(){
LCD_Initialise(); Read_Temperature(); Delay(50000); Delay(50000); while(1) {
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();
DelayXus(100);
为您推荐:
其他类似问题
您可能关注的内容
lcd1602的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。液晶驱动电源
寄存器选择
读、写操作
& 数据总线(LSB)
& 数据总线(MSB)
  VO:调整端,接正电源瞄对比度最弱;接地电源时对比度最高。对比度过高时会产生&鬼影&,使用时可以通过&个5k左右的电位器调整对比度。 &RS:寄存器选择,高时选择数据寄存器;低电平时选择指令寄存器。
  R/W:读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址;当Rs为高电平、R/W为低电平时可以写入数据。
  E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 &LCD1602有11个控制指令,其功能见下表。
& & & 指令
& & & & &功能
& & 清DDRAM和AC值
& & AC=0,光标、画面回HOME位
& 输入方式设置
& & 设置光标、画面移动方式
& 显示开关控制
& & 设置显示、光标及闪烁开、关
& 光标、画面位移
& & 光标、画面移动,不影响DDRAM
& & 功能设置
& & 工作方式设置(初始化指令)
& CGRAM地址设置
& & 设置CGRAM地址。A5~A0=0~3FH
& DDRAM地址设置
& & DDRAM地址设置
& & 读BF及AC值
& & 读忙标志BF值和地址计数器Ac值
& & 写数据
& & 数据写入DDRAM或CGRAM内
& & 读数据
& & 从DDRRAM或CGRAM数据读出
  这里只介绍几个编程时经常用到的指令:
  1.清屏(见下表)
&RS& R/W& &
DB7& DB6& DB5& DB4& DB3& DB2& DB1& DB0
&0& & 0& &0& &0& &0& &0& & 0& & 1 &
  2.显示开关控制(见 下表&)。
RS& R/W& &
DB7& DB6& DB5& DB4& DB3& DB2& DB1& DB0
0& & 0& &0& & &0& & 1& & D& & C& & B
  功能:设置显示、光标及闪烁开、关。
  其中:D表示显示开关:D=1为开,D=0为关;
  C表示光标开关:C=1为开,C=0为关,
  B表示闪烁开关:B=1为开,B=O为关。
  3.光标.画面位移(见下表)
  功能:光标、画面移动,不影响DDR_AM。
  其中:S/C=1:画面平移一个字符位;
  S/C=0:光标平移一个字符位;
  R/L=1:右移;R/L:O:左移。
  4助能设置(见下表)
  功能:工作方式设置(初始化指令)。
  其中:DL=1,8位数据接口;DL=0,四位数据接口;
  N=1,两行显示;N=0,一行显示;
  F=1,5&10点阵字符;F=0,5&7点阵字符。
  读写寄存器
  读写寄存器的控制时序见下表。
  1.写命令函数:向寄存器写入控制字
  典型电路
  LCD1602的典型电路连接如下图所示。
  说明:数据线
  DB0~DB7接到单片机的P0口;3条控制线分别接到P1.5、P1.6、P1.7(可以根据具体的硬件电路修改这几条控制线),R1用来调节液晶显示的对比度,可以接一个5k的电位器来调节,电阻R2用来设置背光的亮度,一般情况接一个1k的电阻就可以了,当然也可以接入电位器来调节显示的亮度。技巧:一般在电路设计时,很少把液晶直接做到单片机的电路板上,而是通过一个接口电路来转接,比如在主板上留出来16根线的接口,这样就可以通过一组16根的排线来连接单片机和液晶显示器。
  驱动程序
  这里的驱动程序主要包括:
  1.液晶初始化函数:设置液晶的工作方式
&  2.设置显示坐标:设置字符的显示位置,行、列坐标
  3.写字符函数:向液晶写一个字符
&  4.写字符串函数:向液晶写入字符串
  参数:x-列坐标,y-行坐标,*s-将要显示的字符
  void LCD_write_string(unsigned char x,
  un8igned char y,unsi.gned char*s)
  LCD_set_xy(x,y);//首先设置显示坐标
  while(*s)//判断是否结束
  LCDIO=*s;//循环调用写数据函数
  LCD_en_dat(*s);
&&&&&往下看有更多相关资料
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)

我要回帖

更多关于 lcd1602与单片机连接 的文章

 

随机推荐