完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include ***it KEY1 = P2^4; ***it KEY2 = P2^5; ***it KEY3 = P2^6; ***it KEY4 = P2^7; ***it ADDR0 = P1^0; ***it ADDR1 = P1^1; ***it ADDR2 = P1^2; ***it ADDR3 = P1^3; ***it ENLED = P1^4; unsigned char code LedChar[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e }; //数码管真值表 void delay(void); //延时函数声明 void main(void) { bit keybuf = 1; //按键值暂存,临时保存按键的扫描值 bit backup = 1; //按键值备份,保存前一次的扫描值 unsigned char counter = 0; //计数器记录按键按下的次数 //选择最右边的数码管进行显示 P0 = LedChar[counter]; ADDR0 = 0; ADDR1 = 0; ADDR2 = 0; ADDR3 = 1; ENLED = 0; //选中第一行按键以进行扫描 P2 = 0xF7; while(1) { keybuf = KEY4; //只取KEY4为例,把当前扫描值暂存 if (keybuf != backup) //当前值与前一次值不相等说明此时按键有动作 { delay(); //延时大约10ms if (keybuf == KEY4) //判断扫描值有没有发生改变,即按键抖动 { if (backup == 0) //如果前一次的值为0,则说明当前状态是由0变为1,即按键弹起 { counter++; //计数器+1 if (counter >= 10) { //只用1个数码管显示,所以记到10就清零重新开始 counter = 0; } P0 = LedChar[counter]; //计数值显示到数码管上 } backup = keybuf; //更新备份为当前值,以备进行下次比较 } } } } void delay(void) { unsigned int i = 1000; while (i--); //通过debug的KEIL软件延时方式计算得出大概是10ms }
|
|
相关推荐
6个回答
|
|
把图纸传上来,不然没法分析,还有程序有什么问题
|
|
|
|
学习一下
|
|
|
|
这个程序是记录按键弹起次数 并通过数码管显示出来
|
|
|
|
keybuf = KEY4; //只取KEY4为例,把当前扫描值暂存 if (keybuf != backup) //当前值与前一次值不相等说明此时按键有动作 这两步不知道怎么来的 |
|
|
|
将当前IO口状态与之前的状态对比 不同的话肯定就说明按键状态变化了 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2024年上海海思MCU开发者体验官招募,手机/MatePad大奖等你拿!
1306 浏览 0 评论
【xG24 Matter开发套件试用体验】蓝牙控制板载LED
953 浏览 0 评论
1178 浏览 0 评论
电赛:mspm0l1306的开发板可以烧录程序,但是程序运行不了,怎么解决这个问题?
1223 浏览 1 评论
【xG24 Matter开发套件试用体验】Silicon Labs 基于 EFR32MG24 Explorer Kit 开发板 开箱试用体验
937 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10552 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-8 23:18 , Processed in 0.644448 second(s), Total 52, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号