矩正键盘 C程序

[复制链接]
2863|2
 楼主| dream2010 发表于 2008-10-27 10:45 | 显示全部楼层 |阅读模式
//键盘扫描子程序<br />void&nbsp;&nbsp;&nbsp;&nbsp;keyscan(&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if((RB4==0)||(RB5==0))&nbsp;&nbsp;&nbsp;&nbsp;FLAG1=1&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;FLAG1=0&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />//键服务子程序<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyserve(&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTB=0XFD&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(RB5==0)&nbsp;&nbsp;&nbsp;&nbsp;data=0X01;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(RB4==0)&nbsp;&nbsp;&nbsp;&nbsp;data=0X03;<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTB=0XFB;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(RB5==0)&nbsp;&nbsp;&nbsp;&nbsp;data=0X02;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(RB4==0)&nbsp;&nbsp;&nbsp;&nbsp;data=0X04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTB=0X00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(data==0x01)&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNTER=COUNTER+1;&nbsp;&nbsp;&nbsp;&nbsp;//若按下S9键,则COUNTER加1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(COUNTER&gt4)&nbsp;&nbsp;&nbsp;&nbsp;COUNTER=0x01;//若COUNTER超过4,则又从1计起<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(data==0x02)&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNTER=COUNTER-1;&nbsp;&nbsp;&nbsp;&nbsp;//若按下S11键,则COUNTER减1<br />&nbsp;&nbsp;&nbsp;&nbsp;if(COUNTER&lt1)&nbsp;&nbsp;&nbsp;&nbsp;COUNTER=0x04;//若COUNTER小于1,则又循环从4计起<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(data==0x03)&nbsp;&nbsp;&nbsp;&nbsp;FLAG2=1&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//若按下S10键,则建立标志FLAG2<br />&nbsp;&nbsp;&nbsp;&nbsp;if(data==0x04)&nbsp;&nbsp;&nbsp;&nbsp;FLAG2=0&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//若按下S12键,则清除标志FLAG2<br />}<br /><br /><br />void&nbsp;KEYinitial()<br />{<br />TRISB1=0;<br />TRISB2=0;<br />TRISB4=1;<br />TRISB5=1;<br />RB1=0;<br />RB2=0;&nbsp;&nbsp;&nbsp;//四个IO口构成四个矩形键盘,实现加1减1功能.<br /><br />}
兰天白云 发表于 2008-10-28 08:24 | 显示全部楼层

你是贴程序共享吗?

如果是这样,还希望你把具体情况也说说,好让网友学起来轻松点,他们平时很累的
Ivy19860210 发表于 2009-5-27 09:25 | 显示全部楼层

急!!!单片机高手看看我的键盘程序哪错了,帮忙改一下

ORG&nbsp;0100H<br />START:&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;TMOD,#20H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;定时器T1为方式2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;TH1,#0F3H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;TL1,#0F3H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;12m,波特率为2400<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;PCON,#00H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;置SMOD=1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;TR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;启动T1计数开始<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;SCON,#50H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;串口方式1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;RI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;清接收标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;TI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;清发送标志<br /><br />KSCAN:&nbsp;&nbsp;LCALL&nbsp;KEYS1&nbsp;;调用判键闭合子程序<br />&nbsp;&nbsp;JNZ&nbsp;KEY1;(A)&lt&gt0有键闭合则转至去抖动<br />&nbsp;&nbsp;AJMP&nbsp;RETURN;无键闭合则返回<br />KEY1:&nbsp;ACALL&nbsp;&nbsp;D10MS&nbsp;&nbsp;&nbsp;;调用10ms延时程序<br />&nbsp;&nbsp;ACALL&nbsp;KEYS1;再次调用判键闭合子程序<br />&nbsp;&nbsp;JNZ&nbsp;KEY2;确认有键闭合,开始扫描<br />&nbsp;&nbsp;LJMP&nbsp;RETURN;无键闭合则返回<br />KEY2:&nbsp;MOV&nbsp;R2,#0FEH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;送首列扫描字<br />&nbsp;&nbsp;MOV&nbsp;R4,#00H&nbsp;;送首列号<br />KEY0:&nbsp;MOV&nbsp;A,R2<br />&nbsp;&nbsp;MOV&nbsp;P1,A<br />&nbsp;&nbsp;MOV&nbsp;P0,#0FFH<br />&nbsp;&nbsp;MOV&nbsp;A,P0;扫描字从P1口送出<br />&nbsp;&nbsp;JB&nbsp;ACC.0,LINE1&nbsp;;第1行无键闭合,转第2行<br />&nbsp;&nbsp;MOV&nbsp;A,#00H;第1行首键号送A<br />&nbsp;&nbsp;AJMP&nbsp;KPV&nbsp;;转键值计算程序<br />LINE1:&nbsp;JB&nbsp;ACC.1,LINE2&nbsp;;第2行无键闭合,转第3行<br />&nbsp;&nbsp;MOV&nbsp;A,#04H;第2行首键号送A<br />&nbsp;&nbsp;AJMP&nbsp;KPV;转键值计算程序<br />LINE2:&nbsp;JB&nbsp;ACC.2,LINE3;第3行无键闭合,转第4行<br />&nbsp;&nbsp;MOV&nbsp;A,#08H;第3行首键号送A<br />&nbsp;&nbsp;AJMP&nbsp;KPV&nbsp;;转键值计算程序<br />LINE3:&nbsp;JB&nbsp;ACC.3,LINE4&nbsp;&nbsp;;第4行无键闭合,转下1列<br />&nbsp;&nbsp;MOV&nbsp;A,#0CH;第4行首键号送A<br />&nbsp;&nbsp;AJMP&nbsp;KPV<br />LINE4:&nbsp;JB&nbsp;ACC.4,NEXT<br />&nbsp;&nbsp;MOV&nbsp;A,#10H<br />KPV:&nbsp;ADD&nbsp;A,R4;计算键值<br />&nbsp;&nbsp;&nbsp;MOV&nbsp;50H,A&nbsp;;键值存放在40H单元<br />&nbsp;&nbsp;&nbsp;ACALL&nbsp;SEDATA<br />&nbsp;&nbsp;PUSH&nbsp;ACC<br />KEY3:&nbsp;ACALL&nbsp;KEYS1;等待键释放<br />&nbsp;&nbsp;JNZ&nbsp;KEYS1<br />&nbsp;&nbsp;POP&nbsp;ACC<br />&nbsp;&nbsp;SETB&nbsp;FLAG;置有键按下标志<br />&nbsp;&nbsp;SJMP&nbsp;KEY4<br />RETURN:CLR&nbsp;FLAG;清有键按下标志<br />KEY4:&nbsp;RET<br />NEXT:&nbsp;INC&nbsp;R4;列号加1<br />&nbsp;&nbsp;MOV&nbsp;A,R2<br />&nbsp;&nbsp;CJNE&nbsp;A,#0F7H,RETURN;判断4行是否都已扫描完,;完则返回<br />&nbsp;&nbsp;RL&nbsp;A&nbsp;;为扫描下1行做准备<br />&nbsp;&nbsp;MOV&nbsp;R2,A<br />&nbsp;&nbsp;AJMP&nbsp;KEY0;开始扫描下1列<br /><br />KEYS1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P1,#0F0H;判键闭合子程序<br />&nbsp;&nbsp;MOV&nbsp;P0,#0FFH<br />&nbsp;&nbsp;MOV&nbsp;A,P0<br />&nbsp;&nbsp;CPL&nbsp;A<br />&nbsp;&nbsp;ANL&nbsp;A,#0E0H<br />&nbsp;&nbsp;RET<br /><br />D10MS:MOV&nbsp;R7,#14H;10ms延时子程序<br />DLY:&nbsp;MOV&nbsp;R6,#0F8H<br />DLY1:&nbsp;DJNZ&nbsp;R6,DLY1<br />&nbsp;&nbsp;DJNZ&nbsp;R7,DLY<br />&nbsp;&nbsp;RET<br /><br />SEDATA:MOV&nbsp;&nbsp;R0,#50H<br />WAIT:&nbsp;&nbsp;JNB&nbsp;&nbsp;TI,$&nbsp;;等待发送完一个字符<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVX&nbsp;A,@R0;取一个字符<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;SBUF,A;送串口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;TI<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RET<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部