欢迎您光临机械网,如有问题请及时联系我们。

lcd1602不显示数据怎么回事?(lcd1602什么都不显示)

作者:机械网
文章来源:本站

  1、检查硬件是否短路/短路

  2、上电测量供电电压是否正常

  3、检查单片机最小系统是否正常工作

  4、检查LCD1602连接的排线是否有断开的线或者接触不良的接口,也有可能是排线损坏引起的原因,用数字万用表的导通测量档位测量排线以及接线是否正常导通

  5、以上硬件都检查正常没有问题的就检查下驱动程序

  #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */ sbit T_IO = P1^5; /*实时时钟数据线引脚 */ sbit T_RST = P1^7; /*实时时钟复位线引脚 */ sbit E=P2^2; //1602使能引脚 sbit RW=P2^1; //1602读写引脚 sbit RS=P2^0; sbit key1=P3^0; sbit key2=P3^1; sbit key3=P3^2; sbit key4=P3^3; sbit key5=P3^4; sbit nz=P3^7; uchar lastkey0=0; uchar lastkey1=0; uchar lastkey2=0; uchar lastkey3=0; uchar lastkey4=0; uchar lastkey5=0; uchar lastkey6=0; uchar lastkey7=0; uchar lastkey8=0; uchar a[8]={0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00}

  ; //代码年 uchar b[8]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00}

  ; //代码月 uchar c[8]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}

  ; //代码日 uchar code d[]="MONTUEWEDTHUFRISTASUN"; uchar code num[]="0123456789"; uchar sec, min, hour, day, mon, year,week; void delay(uint i) //延时误差 0us { uchar a,b,c; for(c=i;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void writecommand(uchar del) { P0 = del; RS = 0; RW = 0; E = 0; delay(1); E = 1; delay(1); } void writedata(uchar del) { P0 = del; RS = 1; RW = 0; E = 0; delay(1); E = 1; delay(1); } void L1602_init(void) { writecommand(0x01); writecommand(0x38); writecommand(0x0c); writecommand(0x06); writecommand(0xd0); } void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; writecommand(a); writedata(sign); } void v_RTInputByte(uchar ucDa) //1302 { uchar i; ACC = ucDa; T_RST = 1; for(i=8; i>0; i--) { T_IO = ACC0; T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } uchar uc_RTOutputByte(void) { uchar i; T_RST = 1; for(i=8; i>0; i--) { ACC = ACC >>1; T_IO=1; ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } void v_W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); // 写地址 _nop_(); _nop_(); v_RTInputByte(ucDa); // 写1Byte数据 T_CLK = 1; T_RST = 0; } uchar uc_R1302(uchar ucAddr) { uchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); //写地址,命令 _nop_(); _nop_(); ucDa = uc_RTOutputByte(); //读1Byte数据 T_CLK = 1; T_RST = 0; return(ucDa); } uchar bcdtodec(uchar bcd) { uchar data1; data1 = bcd & 0x0f; //取BCD低4位 bcd = bcd & 0x70; //剔除BCD的最高位和低4位。 data1 += bcd >> 1; data1 += bcd >> 3; //用位移代替乘法运算 return data1; } void Write_DS1302Init(void) { v_W1302(0x8e,0); v_W1302(0x80,0x48); //写入秒 v_W1302(0x8e,0); v_W1302(0x82,0x22); //写入分 v_W1302(0x8e,0); v_W1302(0x84,0x13); //写入小时 v_W1302(0x8e,0); v_W1302(0x86,0x02); //写入日 v_W1302(0x8e,0); v_W1302(0x88,0x12); //写入月 v_W1302(0x8e,0); v_W1302(0x8a,0x05); //写入星期 v_W1302(0x8e,0); v_W1302(0x8c,0x12); //写入年 } void Run_DS1302(void) { uchar j; v_W1302(0x8f, 0); sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒 v_W1302(0x8f, 0); min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分 v_W1302(0x8f, 0); hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时 v_W1302(0x8f, 0); day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日 v_W1302(0x8f, 0); mon = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月 v_W1302(0x8f, 0); week = bcdtodec(uc_R1302(0x8b)); //读出DS1302中的星期 v_W1302(0x8f, 0); year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年 L1602_char(1, 1,num[year/100] ) ; L1602_char(1, 2,num[year/1000]); L1602_char(2, 1, hour / 10 + 48); //48为符号0 L1602_char(2, 2, hour % 10 + 48); L1602_char(2, 3, ':'); L1602_char(2, 4, min / 10 % 10 + 48); L1602_char(2, 5, min % 10 + 48); L1602_char(2, 6, ':'); L1602_char(2, 7, sec / 10 % 10 + 48); L1602_char(2, 8, sec % 10 + 48); L1602_char(1, 3, year / 10 +48); L1602_char(1, 4, year %10+48); L1602_char(1, 6, mon / 10 % 10 + 48); L1602_char(1, 7, mon % 10 + 48); L1602_char(1, 9, day / 10 % 10 + 48); L1602_char(1, 10, day % 10 + 48); for(j=0;j<3;j++) { L1602_char(1,14+j,d[(week-1)*3+j]);delay(1); } } void displayhanzi(void) //显示中文 {uchar i; writecommand(0x40); //设置CGRAM地址,写指令 for(i=0;i<8;i++) //数据送入CGRAM地址内 {writedata(a[i]); //年 } writecommand(0x84); //写需要显示的位置指令 位置 writedata(0x00); //把CGRAM的0位的数据送向LCD1602,显示数据存储的数据 writecommand(0x48); //每隔一个汉字+8 for(i=0;i<8;i++) {writedata(b[i]);} // 月 writecommand(0x87); writedata(0x01); //把CGRAM的0位的数据送向LCD1602,显示数据存储的数据 writecommand(0x50); for(i=0;i<8;i++) {writedata(c[i]); } writecommand(0x8a) ; writedata(0x02); } void keyscan(void) //按键 { uchar count1; uchar sec1, min1, hour1, day1, mon1, year1,week1,j; if(key1==0) { if(count1==9) count1=1; else count1++; } /**********************************秒操作**********************************/ if(count1==1) { L1602_char(2,10,'S'); {if(key2==0&key2==lastkey2) //秒+ sec++ ; if(sec==60) sec=0; sec1=sec/10*16+sec%10; //16进制化10 v_W1302(0x80,sec1); delay(1); while(!key2) sec1= bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒 L1602_char(2, 7, sec / 10 % 10 + 48); L1602_char(2, 8, sec % 10 + 48); lastkey1=key2; } if(key3==0&key2==lastkey2) //秒- {sec--; if(sec==-1) sec=0; sec1=sec/10*16+sec%10; //16进制化10 v_W1302(0x80,sec1); delay(1); while(!key3) sec1= bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒 L1602_char(2, 7, sec1 / 10 % 10 + 48); L1602_char(2, 8, sec1 % 10 + 48); lastkey1=key3; } if(key4==0) count1=8 ; } /********************************************************************/ /**********************************分操作**********************************/ if(count1==2) {L1602_char(2,10,'m'); if(key2==0) //分+ {min++; if(min==60) min=0; min1=min/10*16+min%10; //16进制化10 v_W1302(0x82,min1); delay(1); while(!key2) sec1= bcdtodec(uc_R1302(0x83)); //读出DS1302中的分 L1602_char(2, 4, min1 / 10 % 10 + 48); L1602_char(2, 5, min1 % 10 + 48); lastkey2=key2; } if(key3==0) //分- {min--; if(min==-1) min=0; while(!key3) min1=min/10*16+min%10; //16进制化10 v_W1302(0x82,min1); delay(1); while(!key3) sec1= bcdtodec(uc_R1302(0x83)); //读出DS1302中的分 L1602_char(2, 4, min / 10 % 10 + 48); L1602_char(2, 5, min % 10 + 48); lastkey2=key3;} if(key4==0) count1=8 ; } /********************************************************************/ /**********************************时操作**********************************/ if(count1==3) { L1602_char(2,10,'H'); if(key2==0) //时+ {hour++; if(hour==24) hour=0; hour1=hour/10*16+hour%10; //16进制化10 v_W1302(0x84,hour1); delay(1); while(!key2) hour1= bcdtodec(uc_R1302(0x85)); //读出DS1302中的时 L1602_char(2, 4, hour1 / 10 % 10 + 48); L1602_char(2, 5, hour1% 10 + 48); lastkey3=key2; } if(key3==0) {hour--; if(hour==-1) hour=0; hour1=hour/10*16+hour%10; //16进制化10 v_W1302(0x84,hour1); delay(1); while(!key3) hour1= bcdtodec(uc_R1302(0x85)); //读出DS1302中的时 L1602_char(2, 4, hour1 / 10 % 10 + 48); L1602_char(2, 5, hour1 % 10 + 48); lastkey3=key3; } if(key4==0) count1=8 ; } /********************************************************************/ /**********************************星期操作**********************************/ if(count1==4) {L1602_char(2,10,'W'); if(key2==0) //星期+ {week++; if(week==8) week=1; week1=week/10*16+week%10; //16进制化10 v_W1302(0x8a,week1); delay(1); while(!key2) week1= bcdtodec(uc_R1302(0x8b)); //读出DS1302中的星期 for(j=0;j<3;j++) { L1602_char(1,14+j,d[(week-1)*3+j]);delay(1); } lastkey4=key2; } if(key3==0) //星期- {week--; if(week==0) week=7; week1=week/10*16+week%10; //16进制化10 v_W1302(0x8a,week1); delay(1); while(!key3) week1= bcdtodec(uc_R1302(0x8b)); //读出DS1302中的时 for(j=0;j<3;j++) { L1602_char(1,14+j,d[(week1-1)*3+j]);delay(1); } lastkey4=key3; } if(key4==0) count1=8 ; } /********************************************************************/ /*********************************日操作***********************************/ if(count1==5) { L1602_char(2,10,'D'); if(key2==0) //日+ { if(mon==1mon==3mon==5mon==7mon==8mon==10mon==12) if(day==31) day=1; else day++; if(mon==4mon==6mon==9mon==11) if(day==30) day=1; else day++; if(year%4==0) {if(mon==2) {if(day==29) day=1; else day++;} } if(year%4!=0) {if(mon==2) {if(day==28) day=1; else day++; } } day1=day/10*16+day%10; //16进制化10 v_W1302(0x86,day1); delay(1); while(!key2) day1= bcdtodec(uc_R1302(0x87)); //读出DS1302中的日 L1602_char(1, 9, day1/ 10 % 10 + 48); L1602_char(1, 10, day1% 10 + 48); lastkey5=key2; } if(key3==0) { if(day==1) day=1; else day--; day1=day/10*16+day%10; //16进制化10 v_W1302(0x86,day1); delay(1); while(!key3) week1= bcdtodec(uc_R1302(0x87)); //读出DS1302中的日 L1602_char(1, 9, day / 10 % 10 + 48); L1602_char(1, 10, day % 10 + 48); lastkey5=key3; } if(key4==0) count1=8 ; } /********************************************************************/ /*******************************月操作*************************************/ if(count1==6) { L1602_char(2,10,'M'); if(key2==0) //月+ {mon++; if(mon==13) mon=1; mon1=mon/10*16+mon%10; //16进制化10 v_W1302(0x88,mon1); delay(1); while(!key2) mon1= bcdtodec(uc_R1302(0x89)); //读出DS1302中的日 L1602_char(1, 6, mon1/ 10 % 10 + 48); L1602_char(1, 7, mon1% 10 + 48); lastkey6=key2; } if(key3==0) //月- {if(mon==1) mon=1; else mon--; mon1=mon/10*16+mon%10; //16进制化10 v_W1302(0x88,mon1); delay(1); while(!key3) mon1= bcdtodec(uc_R1302(0x89)); //读出DS1302中的日 L1602_char(1, 6, mon1/ 10 % 10 + 48); L1602_char(1, 7, mon1% 10 + 48); lastkey6=key3; } if(key4==0) count1=8 ; } /********************************************************************/ /**********************************年操作********************************/ if(count1==7) { L1602_char(2,10,'Y'); if(key2==0) {year++; year1=year/10*16+year%10; //16进制化10 v_W1302(0x8c,year1); delay(1); while(!key2) year1= bcdtodec(uc_R1302(0x8d)); //读出DS1302中的日 L1602_char(1, 3, year1/ 10 % 10 + 48); L1602_char(1, 4, year1% 10 + 48); lastkey7=key2; } if(key3==0) { year--; if(year==0) year=79; year1=year/10*16+year%10; //16进制化10 v_W1302(0x8c,year1); delay(1); while(!key3) year1= bcdtodec(uc_R1302(0x8d)); //读出DS1302中的日 L1602_char(1, 3, year1/ 10 % 10 + 48); L1602_char(1, 4, year1% 10 + 48); lastkey7=key3; } if(key4==0) count1=8 ; } /********************************************************************/ if(count1==8) {L1602_char(2,10,' '); count1=0; } while(!key1) lastkey0=key1; } void Main(void) { L1602_init(); displayhanzi(); Write_DS1302Init(); while(1) { Run_DS1302(); keyscan(); } } 这是我的程序 中间是1602部分 看看和你的都是不是一样

  

lcd1602不显示数据怎么回事?(lcd1602什么都不显示)

  

lcd1602不显示数据怎么回事?(lcd1602什么都不显示)

来源:文章来源于网络,如有侵权请联系我们及时删除。本文由机械网转载编辑,欢迎分享本文!