完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请问为什么我下面这个程序,只有矩阵键盘的第一行正确输出了,第二三四行都单片机没有输出?
在二三四行的程序中加入P1口的代码,用来点亮发光二极管,结果发光二极管也没有亮。 但是有关矩阵键盘的程序,我单独运行以前编写的,还是可以正确运行的, 下面程序中矩阵键盘的程序就是我从之前程序里复制过来修改的。 //4.按下矩阵键盘第一行时以1200bps发送,1,2,3,4, //第二行时以2400bps发送5,6,7,8, //第三行以4800bps发送,9,10,11,12, //第四行以9600pbs 发送,13,14,15,16. #include #define uint unsigned int #define uchar unsigned char void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--)//i=xms即延时约xms毫秒 for(j=110;j>0;j--); } void init() { TMOD=0X20; SM1=1; SM0=0; REN=1; EA=1; //!!! } void matrixkeyscan() //矩阵键盘代码 { uchar temp; P3=0xfe; //第一行送入低电平 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); //去抖动 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { TH1=0xe8; TL1=0xe8; TR1=1; temp=P3; switch(temp) { case 0xee: //1110 1110 一行一列 SBUF='1'; break; case 0xde: //1101 1110 一行二列 SBUF='2'; break; case 0xbe: SBUF='3'; break; case 0x7e: SBUF='4'; break; } while(!ti); TI=0; while(temp!=0xf0) //等待按键释放 { temp=P3; temp=temp&0xf0; } TR1=0; } } P3=0xfd; //第二行 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); //去抖动 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { TH1=0xf4; TL1=0xf4; TR1=1; switch(temp) { case 0xed: SBUF='5'; break; case 0xdd: SBUF='6'; break; case 0xbd: SBUF='7'; break; case 0x7d: SBUF='8'; break; } while(!TI); TI=0; while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } TR1=0;//!!!!!!!!!!!! } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); //去抖动 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { TH1=0xfa; TL1=0xfa; TR1=1; switch(temp) { case 0xeb: SBUF='9'; break; case 0xdb: SBUF='1'; while(!TI); TI=1; SBUF='0'; break; case 0xbb: SBUF='1'; while(!TI); TI=1; SBUF='1'; while(!TI); TI=1; break; case 0x7b: SBUF='1'; while(!TI); TI=1; SBUF='2'; break; } while(!TI); TI=0; while(temp!=0xf0) //等待按键释放 { temp=P3; temp=temp&0xf0; } TR1=0; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); //去抖动 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { TH1=0xfd; TL1=0xfd; TR1=1; switch(temp) { case 0xe7: SBUF='1'; while(!TI); TI=0; SBUF='3'; break; case 0xd7: SBUF='1'; while(!TI); TI=0; SBUF='4'; break; case 0xb7: SBUF='1'; while(!TI); TI=0; SBUF='5'; break; case 0x77: SBUF='1'; while(!TI); TI=0; SBUF='6'; break; } while(!TI); TI=0; while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } TR1=0; } } void main() { init(); while(1) { matrixkeyscan(); } } |
|
相关推荐
4个回答
|
|
uchar temp;
P3=0xfe; //第一行送入低电平 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); //去抖动 temp=P3; temp=temp&0xf0; if(temp!=0xf0) ;<<<<<------ { 你每一行的按键, 在这一判断下都是为真的, 即, 你按第二行的键, 也会被判断为真, 当成第一行的处理 delayms(10); //去抖动 temp=P3; if (((temp&0x0F)==0x0E) && ((temp&0xF0)!=0xF0)) ;<<<<<------ { 其它行按这方法自行修改吧 |
|
|
|
|
|
谢谢你!
修改了以后led的显示全部都正确了。第四行的显示也正确。 但是串口的波特率一调整为2400或者4800,RX就会不断增长。以字符显示的话,就没有显示。以十六进制显示的话,就会分别无限输出DB、DF。按键的话,倒是会输出不同的十六进制值。请问该怎么解决呢? 还有请问为什么if语句要修改成这样呢?从原理图上来说,感觉给第一行赋低电平,按第二行的键并不会影响第二行的电平呀? |
|
|
|
附无限输出的图和矩阵键盘原理图~
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3456 浏览 1 评论
8988 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 15:03 , Processed in 1.612454 second(s), Total 85, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号