完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
注意:要加上延时消抖功能(我对这个的理解:消抖是消除键盘的抖动,即假性按下键盘;延时是对键长按时,要延时等待键释放,再进行下一步处理) 电路设计
编写思路
汇编语言 ORG 0000H LJMP START ORG 0030H START:MOV P0,#0FEH MOV P2,#0FEH START0:MOV P1,#0FFH ;读P1口:首先向P1口送1,为读P1口做准备 MOV A,P1 CJNE A,#0FFH,START1 ;判断是否有键按下 AJMP NEXT START1:ACALL DELAY0 ;延时20ms消抖 MOV P1,#0FFH MOV A,P1 CJNE A,#0FFH,JP1 ;再次确认是否真的有键按下 AJMP NEXT JP1:JNB ACC.4,LP1 JNB ACC.5,LP2 JNB ACC.6,LP3 JNB ACC.7,LP4 SJMP NEXT LP1:MOV A,P0 RR A MOV P0,A SJMP NEXT LP2:MOV A,P0 RL A MOV P0,A SJMP NEXT LP3:MOV A,P2 RR A MOV P2,A SJMP NEXT LP4:MOV A,P2 RL A MOV P2,A NEXT:MOV P1,#0FFH MOV A,P1 ;再读P1的引脚 CJNE A,#0FFH,NEXT ;确认键是否释放,若没释放,则等待键释放 SJMP START0 DELAY0:MOV R2,#70 ;20ms消抖子程序 D01: MOV R3,#100 D02: DJNZ R3,D02 DJNZ R2,D01 RET END C语言 #include #include #define uchar unsigned char #define uint unsigned int ***it L_UP = P1^4; //定义按键 ***it L_DOWN = P1^5; ***it R_UP = P1^6; ***it R_DOWN = P1^7; void delay(uint x) //定义延时xms函数 { uchar i; while(x--) { for(i = 0; i < 120; i++); } } int judge_ac() //定义判断按键是否按下函数 { if(P1 != 0xFF) return 1; //有键按下 else return 0; //无键按下或者键已释放 } void main() { P0 = 0xFE;P2 = 0xFE; //初始化P0和P2,让第一个灯亮起来 while(1) { if(judge_ac()) //有键按下 { delay(20); //延时20ms消抖 if(judge_ac()) //判断是否真的有键按下 { if(!L_UP) P0 = _cror_(P0,1); else if(!L_DOWN) P0 = _crol_(P0,1); else if(!R_UP) P2 = _cror_(P2,1); else if(!R_DOWN) P2 = _crol_(P2,1); while(judge_ac()); //等待键释放 } } } } 注意:在C中用循环位移函数的话,必须要声明本征库函数intrins;且循环位移函数应该使用char型,不是int型。 |
|
|
|
只有小组成员才能发言,加入小组>>
3263 浏览 9 评论
2944 浏览 16 评论
3443 浏览 1 评论
8955 浏览 16 评论
4036 浏览 18 评论
1081浏览 3评论
561浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
554浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2289浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1849浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 21:11 , Processed in 1.031281 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号