完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这个是我改的郭天祥的一个程序,下载到板子上正面看看不见东西,侧面看可以,但不明显,下载板子自带的程序液晶显示没有问题,是不是我的程序的问题。求大佬指点迷津。 ![]() ![]() ![]() file:///C:/Users/irpo/Documents/Tencent%20Files/2393694086/Image/C2C/B582094F9BEF990BEB93BFD0CC67162D.jpg #include #include #define uchar unsigned char #define uint unsigned int ***it LCD_RS = P1^0; ***it LCD_EN = P1^5; ***it beep = P1^6; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 }; uchar temp,buf,m,count; bit playflag=0; uchar code cdis1[ ] = {" SERILA TRANFER "}; uchar code cdis2[ ] = {" "}; /********************************************************** 延时子程序 **********************************************************/ void delay1(uint ms) { uchar k; while(ms--) { for(k = 0; k < 120; k++); } } /******************************************************************/ /* */ /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */ /* */ /******************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; // LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80);//将P0^7的状态赋给result LCD_EN = 0; return(result); } /*******************************************************************/ /* */ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /* */ /*******************************************************************/ void lcd_wcmd(uchar cmd)//写指令 { // while(lcd_busy()); LCD_RS = 0; // LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } void lcd_wdat(uchar dat) { // while(lcd_busy()); LCD_RS = 1; // LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /* */ /* LCD初始化设定 */ /* */ /*******************************************************************/ void lcd_init() { delay1(15); lcd_wcmd(0x01); //清除LCD的显示内容 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay1(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x0c); //开显示,显示光标,光标闪烁 delay1(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay1(5); } /*******************************************************************/ /* */ /* 设定显示位置 */ /* */ /*******************************************************************/ void lcd_pos(uchar pos) { lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 } /********************************************************* 发送数据函数 *********************************************************/ void senddata(uchar dat) { SBUF =dat; while(!ti); TI = 0; } /********************************************************* 串行中断服务函数 *********************************************************/ void serial() interrupt 4 { ES = 0; //关闭串行中断 RI = 0; //清除串行接受标志位 buf = SBUF; //从串口缓冲区取得数据 switch(buf) { case 0x31: senddata('T');break; //接受到1,发送字符'T'给计算机 case 0x32: senddata('X');break; //接受到2,发送字符'X'给计算机 case 0x33: senddata('-');break; //接受到3,发送字符'-'给计算机 case 0x34: senddata('M');break; //接受到4,发送字符'M'给计算机 case 0x35: senddata('C');break; //接受到5,发送字符'C'给计算机 case 0x36: senddata('U');break; //接受到6,发送字符'U'给计算机 case 0x37: beep = ~beep;break; default: senddata(buf);break; //接受到其它数据,将其发送给计算机 } if(buf!=0x0D) { if(buf!=0x0A) { temp =buf; if(count<16) { RXDdata[count]=temp; count++; if(count==16) playflag=1; } } } ES = 1; //允许串口中断 } /********************************************************* 数据显示函数 *********************************************************/ void play() { if(playflag) { lcd_pos(0x40); //设置位置为第二行 for(m=0;m<16;m++) { lcd_wdat(cdis2[m]); //清LCD1602第二行 delay1(5); } lcd_pos(0x40); //设置位置为第二行 for(m=0;m<16;m++) { // lcd_pos(0x40+m); //设置显示位置为第二行 lcd_wdat(RXDdata[m]); //显示字符 delay1(5); } playflag=0; count=0x00; for(m=0;m<16;m++) { RXDdata[m]=0x20; //清显存单元 delay1(5); } } } /********************************************************* 主函数 *********************************************************/ void main(void) { P0 = 0xff; P2 = 0xff; SCON=0x50; //设定串口工作方式 PCON=0x00; //波特率不倍增 TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率 EA=1; ES = 1; //允许串口中断 TL1=0xfd; TH1=0xfd; //波特率9600 TR1=1; lcd_init(); lcd_pos(0x00); //设置显示位置为第一行 for(m=0;m<16;m++) { lcd_wdat(cdis1[m]); //显示字符 delay1(5); } lcd_pos(0x40); //设置显示位置为第二行 for(m=0;m<16;m++) { lcd_wdat(cdis2[m]); //显示字符 delay1(5); } while(1) { play(); } }
|
|
相关推荐
6个回答
|
|
你这么说肯定是你的程序问题了
|
|
|
|
|
|
|
|
你调一下旁边的电位器试试
|
|
|
|
这个是对比度问题。这个学习板的说明里应该有让调整哪个电阻的说明。
|
|
|
|
如果硬件什么都不动,分别下载两个程序,你的不能正常显示,而板子自带的程序显示正常的话,那就可以确定是你的程序问题。
程序问题,1602操作的查忙是不能省略的,即使不用读数据查忙的方式,也得用延时得方式处理。 从你的程序的显示效果来看,可以看到只显示了一行,与程序设置的两行并不相符。 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
693 浏览 0 评论
483 浏览 0 评论
嵌入式学习-搭建自己的ubuntu系统之ubuntu网络设置
598 浏览 0 评论
龙芯中科胡伟武:3B6600 八核桌面 CPU 性能将达到英特尔中高端酷睿 12~13 代水平
665 浏览 0 评论
树莓派Pico 2发布,搭载RP2350双核RISC-V和Arm Cortex-M33微控制器!
618 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10712 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-17 05:38 , Processed in 0.781795 second(s), Total 82, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191