完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include #include #define uchar unsigned char #define uint unsigned int uchar key_No[]={'1','2','3','4','5','6','7','8','9'}; ***it RS=P2^4; //寄存器选择位 ***it RW=P2^0; //读写选择位 ***it E=P2^3; //使能信号位 uchar tmp; //暂存P2的值 uchar keynum; void display(); //毫秒级延时 void delay(uint z) { uint x, y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void keyscan() { P3=0xfe; //扫描第1行 if(P1!=0xff) //有按键按下 { tmp = P3; delay(5); if(P1!=0xff) //延时后确定有按键按下 { switch(tmp) { case 0xfe: keynum=1;break; //第1行第1个按键按下 case 0xfd: keynum=2;break; //第1行第2个按键按下 case 0xfb: keynum=3;break; //第1行第3个按键按下 case 0xf7: keynum=4;break; //第1行第4个按键按下 case 0xef: keynum=5;break; //第1行第5个按键按下 } while(tmp!=0xff) //等待按键松手 { tmp=P1;////????????????????????????????? display(); } } } delay(5); P3=0xfd; //扫描第2行 if(P1!=0xff) //有按键按下 { tmp = P1; delay(5); if(P1!=0xff) //延时后确定有按键按下 { switch(tmp) { case 0xfe: keynum=9; break; //第2行第1个按键按下 case 0xfd: keynum=10;break; //第2行第2个按键按下 case 0xfb: keynum=11;break; //第2行第3个按键按下 case 0xf7: keynum=12;break; //第2行第4个按键按下 case 0xef: keynum=13;break; //第2行第5个按键按下 } while(tmp!=0xff) { tmp=P1; display(); } } } delay(5); P3=0xfb; //扫描第3行 if(P1!=0xff) //有按键按下 { tmp = P1; delay(5); if(P1!=0xff) //延时后确定有按键按下 { switch(tmp) { case 0xfe: keynum=17;break; //第3行第1个按键按下 case 0xfd: keynum=18;break; //第3行第2个按键按下 case 0xfb: keynum=19;break; //第3行第3个按键按下 case 0xf7: keynum=20;break; //第3行第4个按键按下 case 0xef: keynum=21;break; //第3行第5个按键按下 } while(tmp!=0xff) { tmp=P1; display(); } } } delay(5); P3=0xf7; //扫描第4行 if(P1!=0xff) //有按键按下 { tmp = P1; delay(5); if(P1!=0xff) //延时后确定有按键按下 { switch(tmp) { case 0xfe: keynum=25;break; //第4行第1个按键按下 case 0xfd: keynum=26;break; //第4行第2个按键按下 case 0xfb: keynum=27;break; //第4行第3个按键按下 case 0xf7: keynum=28;break; //第4行第4个按键按下 case 0xef: keynum=29;break; //第4行第5个按键按下 } while(tmp!=0xff) { tmp=P1; display(); } } } delay(5); P3=0xef; //扫描第5行 if(P1!=0xff) //有按键按下 { tmp = P1; delay(5); if(P1!=0xff) //延时后确定有按键按下 { switch(tmp) { case 0xfe: keynum=33;break; //第5行第1个按键按下 case 0xfd: keynum=34;break; //第5行第2个按键按下 case 0xfb: keynum=35;break; //第5行第3个按键按下 case 0xf7: keynum=36;break; //第5行第4个按键按下 case 0xef: keynum=37;break; //第5行第5个按键按下 } while(tmp!=0xff) { tmp=P2; display(); } } } delay(5); } void Write_com(uchar com) { // while(BusyTest()==1); RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0; //E置低电平(写指令时,E为高脉冲) 就是让E从0到1发生正跳变,所以应先置"0" P0=com; //将数据送入P0口,即写入指令或地址 delay(1); /*_nop_(); _nop_(); _nop_(); _ nop_();*/ E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 } //*********************写数据 void WriteData(uchar dat) { // while(BusyTest()==1); RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0; //(写指令时,E为高脉冲) // 就是让E从0到1发生正跳变,所以应先置"0" P0=dat; //将数据送入P0口,即将数据写入液晶模块 delay(1); /*_nop_(); _nop_(); _nop_(); _ nop_();*/ E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 } //*******************初始化 void Init(void) { Write_com(0x30); //显示模式设置:16×1显示,5×7点阵,8位数据接口 Write_com(0x0c); //显示模式设置:显示开,无光标 Write_com(0x06); //显示模式设置:光标右移, Write_com(0x01); //清屏幕指令,将以前的显示内容清除 } void show() { uchar a; Init(); Write_com(0x80); for(a=0;a<9;a++) { WriteData( key_No[a]); delay(1); } } void main() { keyscan(); show(); //这里的显示是保存上一次的显示值 } |
|
相关推荐
4个回答
|
|
回帖奖励 +1 分积分 |
|
|
|
这个简单,把那个display()延时函数去掉就可以了!
|
|
|
|
是的,我改进了一下。可以了! |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
690 浏览 0 评论
735 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
624 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1099 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1092 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11797 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 17:08 , Processed in 0.673803 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号