完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
通过外接矩阵键盘来实现对数码管的显示控制
功能 按键,在数码管上显示,无法显示的字符不显示 设备准备 接到51单片机P3口上 原理 讲的键盘扫描原理部分很好,下文代码采用逐行扫描 #include #define uchar unsigned char #define uint unsigned int uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; void delay(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=112;j>0;j--); } void display(uchar num) { P0=table[num]; } void keyscan4x4(void) { uchar temp,key; /*第一行扫描*/ P3=0xfe; //设置p3的电平,最低位p3.0输出低电平 temp=P3; temp&=0xf0; //将高四位的值赋给中间量 if(temp!=0xf0) //中间量的值与预期的0xf0不符,所以第一行有键被按下 { delay(10); //延时10ms消抖 temp=P3; temp&=0xf0; if(temp!=0xf0) //再次确认 { temp=P3; switch(temp) { case 0xee: key=1; //按下1 break; case 0xde: key=2; //按下2 break; case 0xbe: key=3; //按下3 break; case 0x7e: key=10; //按下A break; } while(temp!=0xf0) { temp=P3; //不断刷新P3的状态,等到按键松开跳出程序 temp&=0xf0; } display(key); //数码管显示函数 } } /*第二行扫描*/ P3=0xfd; //1111 1101 temp=P3; temp&=0xf0; if(temp!=0xf0) { delay(10); //延时10ms消抖 temp=P3; temp&=0xf0; if(temp!=0xf0) //再次确认 { temp=P3; switch(temp) { case 0xed: key=4; //按下4 break; case 0xdd: key=5; //按下5 break; case 0xbd: key=6; //按下6 break; case 0x7d: key=11; //按下B break; } while(temp!=0xf0) { temp=P3; //不断刷新P3的状态,等到按键松开跳出程序 temp&=0xf0; } display(key); //数码管显示函数 } } /*第三行扫描*/ P3=0xfb; //1111 1011 temp=P3; temp&=0xf0; //将高四位的值赋给中间量 if(temp!=0xf0) //中间量的值与预期的0xf0不符,所以第3行有键被按下 { delay(10); //延时10ms消抖 temp=P3; temp&=0xf0; if(temp!=0xf0) //再次确认 { temp=P3; switch(temp) { case 0xeb: key=7; //按下7 break; case 0xdb: key=8; //按下8 break; case 0xbb: key=9; //按下9 break; case 0x7b: key=12; //按下C break; } while(temp!=0xf0) { temp=P3; //不断刷新P3的状态,等到按键松开跳出程序 temp&=0xf0; } display(key); //数码管显示函数 } } /*第四行扫描*/ P3=0xf7; //1111 0111 temp=P3; temp&=0xf0; //将高四位的值赋给中间量 if(temp!=0xf0) //中间量的值与预期的0xf0不符,所以第4行有键被按下 { delay(10); //延时10ms消抖 temp=P3; temp&=0xf0; if(temp!=0xf0) //再次确认 { temp=P3; switch(temp) { case 0xe7: key=16; //按下* break; case 0xd7: key=0; //按下0 break; case 0xb7: key=16; //按下# break; case 0x77: key=13; //按下D break; } while(temp!=0xf0) { temp=P3; //不断刷新P3的状态,等到按键松开跳出程序 temp&=0xf0; } display(key); //数码管显示函数 } } } /*主函数*/ void main() { P2=P2|0xf0;//四位同时显示 while(1) { keyscan4x4(); } } |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1185浏览 3评论
611浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2337浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1897浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 13:28 , Processed in 1.388108 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号