键盘可控流水灯资料Word文档下载推荐.docx
《键盘可控流水灯资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《键盘可控流水灯资料Word文档下载推荐.docx(8页珍藏版)》请在冰点文库上搜索。
调用键盘程序
JNBF0,LNEXT;
如果无键按下,则继续
ACALLKEYPROC;
否则调用键盘处理程序
LNEXT:
ACALLLAMP;
调用灯显示程序
AJMPLOOP;
反复循环,主程序到此结束
---------------------------------------
DELAY:
MOVR7,#10
D1:
MOVR6,#100
DJNZR6,$
DJNZR7,D1
RET
---------延时程序,键盘处理中调用
KEYPROC:
MOVA,B;
从B寄存器中获取键值
JBACC.2,KeyStart;
分析键的代码,某位被按下,则该位为1
JBACC.3,KeyOver
JBACC.4,KeyUp
JBACC.5,KeyDown
AJMPKEY_RET
KeyStart:
SETBStartEnd;
第一个键按下后的处理
KeyOver:
第二个键按下后的处理
KeyUp:
SETBUpDown;
第三个键按下后的处理
KeyDown:
第四个键按下后的处理
KEY_RET:
KEY:
CLRF0;
清F0,表示无键按下。
ORLP3,#00111100B;
将P3口的接有键的四位置1
MOVA,P3;
取P3的值
ORLA,#11000011B;
将其余4位置1
CPLA;
取反
JZK_RET;
如果为0则一定无键按下
ACALLDELAY;
否则延时去键抖
ORLP3,#00111100B
MOVA,P3
ORLA,#11000011B
CPLA
JZK_RET
MOVB,A;
确实有键按下,将键值存入B中
SETBF0;
设置有键按下的标志
K_RET:
此处循环等待键的释放
JZK_RET1;
直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回
AJMPK_RET
K_RET1:
-----------------------------------
D500MS:
;
流水灯的延迟时间
PUSHPSW
SETBRS0
MOVR7,#5;
如果用实验仿真板,该值可根据你的机器运行情况更改,在1-255之间
D51:
MOVR6,#250
D52:
MOVR5,#200
D53:
DJNZR5,D53
DJNZR6,D52
DJNZR7,D51
POPPSW
RET
-----------------------------------
LAMP:
JBStartEnd,LampStart;
如果StartEnd=1,则启动
AJMPLAMPRET;
否则关闭所有显示,返回
LampStart:
JBUpDown,LAMPUP;
如果UpDown=1,则向上流动
MOVA,LAMPCODE
RLA;
向上移动实际就是左移位
MOVLAMPCODE,A
MOVP1,A
LCALLD500MS
AJMPLAMPRET
LAMPUP:
RRA;
向下流动实际就是右移
MOVLAMPCODE,A
LAMPRET:
END
这个是按键流水灯的汇编代码,当然还有很多问题的。
没办法,也不想弄,现在就想快点把C入门的书看完,把板子光盘上的例子都跑一下,然后就研究一下RTXtiny。
为了9月做一下准备。
我的比较长期的目标就是把这个东西移植到MSP430F135上面^_^
对了,这个例子成功了(好像我就没贴过不成功的例子……)
updown
BIT
00H
上下显示标志
startend
01H
起停标志
LAMPCODE
EQU
21H
存放流水灯的代码
ORG
0000H
AJMP
MAIN
30H
MOV
SP,#5FH
设置堆栈
CLR
updown
startend
LAMPCODE,#0FEH
单灯流动代码
ACALL
KEY
JNB
F0,LNEXT
如果无键按下,则继续;
某位位0跳转
KEYPROC
LAMP
调用流水灯显示程序
LOOP
循环,主程序结束
延时程序
R7,#100
R6,#100
DJNZ
R6,$
R7,D1
键盘处理程序
A,B
从B寄存器中取键值
JB
ACC.2,KEYSTART
分析键代码,如果某位被按下,则该位为1
ACC.3,KEYOVER
JB:
某位为1跳转
ACC.4,KEYUP
ACC.5,KEYDOWN
KEY_RET
KEYSTART:
SETB
第一个按键被按下的处理
KEYOVER:
第二个按键被按下的处理
KEYUP:
第三个按键
KEYDOWN:
读键值子程序
F0
PSW中的用户状态字,清F0,表示无键按下
ORL
P3,#00111100B
P3口中间4位置一
A,P3
取P3口状态(读键值)
A,#11000011B
屏蔽其余四位
CPL
A
取反,便于检查键值
JZ
K_RET
如为0,无键按下;
A为0跳转
CALL
DELAY
有按键按下,去抖
A,P3
A,#11000011B
A
如果为0,无键按下,返回
B,A
否则键值存入B寄存器
置位F0,表示有键按下
P3,#0011100B
此处循环等待按键释放
K_RET1
数据为0说明按键释放;
如果不为0,继续等待
消除后沿抖动
流水灯延时子程序
D500:
R7,#250
D2:
R6,#250
R6,$
减1不为0跳转
R7,D2
流水灯子程序
startend,lampstart
如果startend=1则启动;
P1,#0FFH
否则关闭显示
LAMPRET
返回
lampstart:
updown,LAMPUP
如果updown=1,向上流动显示
A,LAMPCODE
循环左移
RL
LAMPCODE,A
P1,A
显示
LCALL
D500
LAMPRET
A,LAMPCODE
RR
循环右移
P1,A
不多说了:
按键流水灯对应的C代码
//实现按键控制流水灯功能
//P3.2:
开始,按此键则开始
//P3.3:
停止
//P3.4:
向上流动
//P3.5:
向下流动
#include<
reg51.h>
intrins.h>
//包含了循环移位的函数原型
#defineucharunsignedchar
#defineuintunsignedint
bitupdown=0;
//上下流动标志位
bitstartend=0;
//启动停止标志位
/**********我是无敌分割线*************///ms延时子函数
voidmdelay(uintdelay)
{
uinti;
for(;
delay>
0;
delay--)
for(i=0;
i<
124;
i++)
{;
}
/***********键值处理子函数×
×
**/
voidkproce(ucharkvalue)
if((kvalue&
0x04)==0)
startend=1;
0x08)==0)
startend=0;
0x10)==0)
updown=1;
0x20)==0)
updown=0;
/************取键值子函数×
***/
ucharkey()
ucharkvalue;
uchartmp;
P3|=0x3c;
//P3口中间4位置一
kvalue=P3;
//取P3状态
kvalue|=0xc3;
//屏蔽头尾各2位
if(kvalue==0xff)
return(0);
//没有键按下,返回0
mdelay(10);
//否则有键按下,取抖
//屏蔽其他位
//无按键,返回0
)
//否则,有按键按下,等待按键放开
tmp=P3;
if((tmp|0xc3)==0xff)
break;
return(kvalue);
//返回键值
/*****主函数************/
voidmain()
//存放键值
ucharlampcode;
//存放流水灯代码
P1=0xff;
//熄灭所有灯
lampcode=0xfe;
)
kvalue=key();
//调用键盘程序,取得键值
if(kvalue)
//如果键值不为0
kproce(kvalue);
//键值处理程序
if(startend)
//开始标志为1,则显示流动代码
P1=lampcode;
if(updown)
//上下流动标志
lampcode=_cror_(lampcode,1);
else
lampcode=_crol_(lampcode,1);
mdelay(500);
//延时500ms
//开始标志为0,关闭显示