完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include #define uchar unsigned char #define uint unsigned int ***it LCD_RS = P0^0; ***it LCD_RW = P0^1; ***it LCD_EN = P0^2; #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[ ] = {" "}; /********************************************************** 延时子程序 **********************************************************/ char code SST516[3] _at_ 0x003b; 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)(P1&0x80); 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_(); P1 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /* */ /*写显示数据到 LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /* */ /*******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P1 = 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; //从串口缓冲区取得数据 playflag=1; switch(buf) { case 0x31: senddata('X');break; //接受到 1,发送字符'W'给计算机 case 0x32: senddata('L');break; //接受到 2,发送字符'I'给计算机 case 0x33: senddata('1');break; //接受到 3,发送字符'L'给计算机 case 0x34: senddata('0');break; //接受到 4,发送字符'L'给计算机 case 0x35: senddata('0');break; //接受到 5,发送字符'A'给计算机 case 0x36: senddata('0');break; //接受到 5,发送字符'R'给计算机 default: senddata(buf);break; //接受到其它数据,将其发送给计算机 } if(buf!=0x0D) { if(buf!=0x0A) { temp =buf; if(count<16) { RXDdata[count]=temp; count++; } } } ES = 1; //允许串口中断 } /********************************************************* 数据显示函数 *********************************************************/ void play() if(playflag) { lcd_pos(0x40); //设置位置为第二行 for(m=0;m<16;m++) lcd_wdat(cdis2[m]); //清 LCD1602 第二行 for(m=0;m<16;m++) { lcd_pos(0x40+m); //设置显示位置为第二行 lcd_wdat(RXDdata[m]); //显示字符 } playflag=0; count=0x00; for(m=0;m<16;m++) RXDdata[m]=0x20; //清显存单元 } } /********************************************************* 主函数 *********************************************************/ void main(void) { P1 = 0xff; P2 = 0xff; SCON = 0x50; // SCON: serail mode 1, 8-bit UART TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload PCON |= 0x80; // SMOD="1"; TH1 = 0XF3; // TL1 =0XF3; IE |= 0x90; // 使能串行中断 TR1 = 1; // 启动 TIMER1 EA = 1; lcd_init(); lcd_pos(0x00); //设置显示位置为第一行 for(m=0;m<16;m++) lcd_wdat(cdis1[m]); //显示字符 lcd_pos(0x40); //设置显示位置为第二行 for(m=0;m<16;m++) lcd_wdat(cdis2[m]); //显示字符 while(1) { play(); } } 这个在显示屏上不出数啊,哪里的问题 |
|
相关推荐
2个回答
|
|
给个建议,以后调程序要一步一步调通,不要等所有程序都写好后才进行调试,这样无疑加大调试难度。就像写电脑端程序一样,先把底层设备驱动写好,再写上层程序。这些不是废话,这是基本工。
|
|
|
|
嗯谢谢。。。。。。。。。。。。。。。。。。。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
418 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1083 浏览 0 评论
846 浏览 0 评论
886 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
882 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11824 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 17:14 , Processed in 0.434775 second(s), Total 44, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号