完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#define uchar unsigned char #define uint unsigned int uchar dis_buf; //显示缓存 uchar temp; uchar key; //键顺序吗 void delay0(uchar x); //x*0.14MS // 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; /************************************************************* * 共阳数码管 * * 延时子程序 * * * *************************************************************/ void delay(uchar x) { uchar j; while((x--)!=0) //CPU执行x*12次 { for(j=0;j<125;j++) {;} } } /************************************************************* * * * 键扫描子程序 (4*3 的矩阵) P1.4 P1.5 P1.6 P1.7为列 * * P1.1 P1.2 P1.3为行 * * * *************************************************************/ void keyscan(void) { temp = 0; P1=0xF0; //高四位输入 行为高电平 列为低电平 delay(1); //延时 temp=P1; //读P1口 temp=temp&0xF0; //屏蔽低四位 temp=~((temp>>4)|0xF0); if(temp==1) // p1.4 被拉低 key=1; //第1个按键键值 else if(temp==2) // p1.5 被拉低 key=2; //第2个按键键值 else if(temp==4) // p1.6 被拉低 key=3; //第3个按键键值 else if(temp==8) // p1.7 被拉低 key=4; //第4个按键键值 else key=16; P1=0x0F; //低四位输入 列为高电平 行为低电平 delay(1); //延时 temp=P1; //读P1口 temp=temp&0x0F; temp=~(temp|0xF0); if(temp==2) //p1.1 被拉低 key=key+0; else if(temp==4) //p1.2 被拉低 key=key+4; else if(temp==8) //p1.3 被拉低 key=key+8; else key=16; dis_buf = key; //键值入显示缓存 dis_buf = dis_buf & 0x0f; } /************************************************************* * * *判断键是否按下 * * * *************************************************************/ void keydown(void) { P1=0xF0; //将高4位全部置1 低四位全部置0 if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口 { keyscan(); //调用按键扫描程序 } } /************************************************************* * * * 主程序 * * * *************************************************************/ main() { P0=0xFF; //置P0口 P1=0xFF; //置P1口 delay(10); //延时 while(1) { keydown(); //调用按键判断检测程序 P0 = LED7Code[dis_buf%16]&0x7f; //LED7 0x7f为小数点 共阴和共阳此处也是不一样; %16表示输出16进制 } } 问题是这样的:当程序检测到按键按下去后,p1口数据发生变化时,开始进入键盘扫描程序后, 把 P1=0xF0;可这样p1口原来 p1数据不是被覆盖了,还怎么检测p1口呢?但整个程序是正确的 |
|
相关推荐
7 个讨论
|
|
大哥啊!算法我也懂,但是:P1口被赋值0X0F那一瞬间,数居咋变啊,因为我按键按下最高位一端接地的,则那个最高位端口定是零,这是你再强行把P1赋0x0F,强硬把最高位置一!单片机到底听谁的, 问题这样等价:把P1 ^8端口接地,但你在程序中 ***it temp=P1 ^8;强硬 temp=1;在那一瞬间 这叫单片机听谁的? 难道是那个端口瞬间出现高电平,然后最终变低吗? |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 16:05 , Processed in 0.830613 second(s), Total 63, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号