完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
u8 Key_Down()//判断有无键按下
{ u8 key_num,scan_code; scan_code = 0xC7; PORTB = scan_code;//逐行扫描的行全部为零,列全部为1,高2位与键盘无关,全为1 key_num = PORTB; if((key_num&0x07)!=0x07) { key_down_state=1; if(key_down_time)//消抖 { key_down_time=0; key_num = PORTB; if((key_num&0x07)!=0x07) return 1; else return 0; } else return 0; // return 1; } else { return 0; } } u8 Scan_Key_Down() { u8 i,scan_code,key_num; //scan_code = 0xf7; //逐行扫描的第一行清零 //if(Key_Down()) //{ scan_code = 0xf7; //逐行扫描的第一行清零 for(i=0;i<3;i++) { PORTB = scan_code;//逐行扫描的扫描码 key_num = PORTB; if((key_num&0x07)!=0x07) { break; } scan_code=(scan_code<<1)|0x0f; } // key_num=~key_num; //return key_num; //} return key_num; } u8 Key_Manage(u8 key_code) { u8 key_value; //while(Key_Down());//等待按键释放 //{ switch(key_code) { case 0xf6://第一行第一列1111 0 110 key_value &= 0x00; key_value |= 0x01; break; case 0xf5://第一行第二列 1111 0 101 key_value &= 0x00; key_value |= 0x02; break; case 0xf3: //第一行第三列1111 0 011 key_value &= 0x00; key_value |= 0x03; break; case 0xee://第二行第一列 1110 1 110 key_value &= 0x00; key_value |= 0x04; break; case 0xed://第二行第二列 1110 1 101 key_value &= 0x00; key_value |= 0x05; break; case 0xeb: //第二行第三列 1110 1 011 key_value &= 0x00; key_value |= 0x06; break; case 0xde://第三行第一列 1101 1 110 key_value &= 0x00; key_value |= 0x07; break; case 0xdd: //第三行第二列 1101 1 101 key_value &= 0x00; key_value |= 0x08; break; case 0xdb: //第三行第三列 1101 1 011 key_value &= 0x00; key_value |= 0x09; break; default: key_value &= 0x00; } //} return key_value; } u8 Scan_Key() { u8 Key_Code; static u8 key_value; if(Key_Down()) { Key_Code = Scan_Key_Down(); while(Key_Down()); key_value = Key_Manage(Key_Code); } return key_value; } 定时中断里面 if(key_down_state) { key_down_count++; if(key_down_count>10) { key_down_count=0; key_down_state=0; key_down_time=1; } } 主函数里面 while(1) { Key_Value=Scan_Key(); Seg_Display(2,(Key_Value/16)); //显示十位数 Seg_Display(3,(Key_Value%16)); //显示个位数 } 上面的程序运行之后,是可以显示出键值,但是并不是每次弹起后显示的都是按键的键值,有时候会出现显示的00的情况 每个按键都是这样的情况 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2084 浏览 1 评论
3629 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2336 浏览 2 评论
2763 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4027 浏览 5 评论
973浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6360浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 05:12 , Processed in 1.386746 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号