键盘可控流水灯资料.docx
- 文档编号:11435975
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:8
- 大小:17.56KB
键盘可控流水灯资料.docx
《键盘可控流水灯资料.docx》由会员分享,可在线阅读,更多相关《键盘可控流水灯资料.docx(8页珍藏版)》请在冰豆网上搜索。
键盘可控流水灯资料
;**************************************************
;平凡单片机工作室
;作者:
周坚
;功能描述:
;P3.2:
开始,按此键则灯开始流动(由上而下)
;P3.3:
停止,按此键则停止流动,所有灯为暗
;P3.4:
上,按此键则灯由上向下流动
;P3.5:
下,按此键则灯由下向上流动
;本例可用TOP51-2005/TOPAV-2008单片机开发平台验证
;**************************************************
UpDownEQU00H;上下行标志
StartEndEQU01H;起动及停止标志
LAMPCODEEQU21H;存放流动的数据代码
ORG0000H
AJMPMAIN
ORG30H
MAIN:
MOVSP,#5FH
MOVP1,#0FFH
CLRUpDown;启动时处于向上的状态
CLRStartEnd;启动时处于停止状态
MOVLAMPCODE,#0FEH;单灯流动的代码
LOOP:
ACALLKEY;调用键盘程序
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;第一个键按下后的处理
AJMPKEY_RET
KeyOver:
CLRStartEnd;第二个键按下后的处理
AJMPKEY_RET
KeyUp:
SETBUpDown;第三个键按下后的处理
AJMPKEY_RET
KeyDown:
CLRUpDown;第四个键按下后的处理
KEY_RET:
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:
ORLP3,#00111100B;此处循环等待键的释放
MOVA,P3
ORLA,#11000011B
CPLA
JZK_RET1;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回
AJMPK_RET
K_RET1:
RET
;-----------------------------------
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,则启动
MOVP1,#0FFH
AJMPLAMPRET;否则关闭所有显示,返回
LampStart:
JBUpDown,LAMPUP;如果UpDown=1,则向上流动
MOVA,LAMPCODE
RLA;向上移动实际就是左移位
MOVLAMPCODE,A
MOVP1,A
LCALLD500MS
AJMPLAMPRET
LAMPUP:
MOVA,LAMPCODE
RRA;向下流动实际就是右移
MOVLAMPCODE,A
MOVP1,A
LCALLD500MS
LAMPRET:
RET
END
这个是按键流水灯的汇编代码,当然还有很多问题的。
没办法,也不想弄,现在就想快点把C入门的书看完,把板子光盘上的例子都跑一下,然后就研究一下RTXtiny。
为了9月做一下准备。
我的比较长期的目标就是把这个东西移植到MSP430F135上面^_^
对了,这个例子成功了(好像我就没贴过不成功的例子……)
updown BIT 00H ;上下显示标志
startend BIT 01H ;起停标志
LAMPCODE EQU 21H ;存放流水灯的代码
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH ;设置堆栈
CLR updown
CLR startend
MOV LAMPCODE,#0FEH ;单灯流动代码
LOOP:
ACALL KEY ;调用键盘程序
JNB F0,LNEXT ;如果无键按下,则继续;某位位0跳转
ACALL KEYPROC ;否则调用键盘处理程序
LNEXT:
ACALL LAMP ;调用流水灯显示程序
AJMP LOOP ;循环,主程序结束
;延时程序
DELAY:
MOV R7,#100
D1:
MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;键盘处理程序
KEYPROC:
MOV A,B ;从B寄存器中取键值
JB ACC.2,KEYSTART ;分析键代码,如果某位被按下,则该位为1
JB ACC.3,KEYOVER ;JB:
某位为1跳转
JB ACC.4,KEYUP
JB ACC.5,KEYDOWN
AJMP KEY_RET
KEYSTART:
SETB startend ;第一个按键被按下的处理
AJMP KEY_RET
KEYOVER:
CLR startend ;第二个按键被按下的处理
AJMP KEY_RET
KEYUP:
SETB updown ;第三个按键
AJMP KEY_RET
KEYDOWN:
CLR updown
KEY_RET:
RET
;读键值子程序
KEY:
CLR F0 ;PSW中的用户状态字,清F0,表示无键按下
ORL P3,#00111100B ;P3口中间4位置一
MOV A,P3 ;取P3口状态(读键值)
ORL A,#11000011B ;屏蔽其余四位
CPL A ;取反,便于检查键值
JZ K_RET ;如为0,无键按下;A为0跳转
CALL DELAY ;有按键按下,去抖
ORL P3,#00111100B
MOV A,P3
ORL A,#11000011B
CPL A
JZ K_RET ;如果为0,无键按下,返回
MOV B,A ;否则键值存入B寄存器
SETB F0 ;置位F0,表示有键按下
K_RET:
ORL P3,#0011100B ;此处循环等待按键释放
MOV A,P3
ORL A,#11000011B
CPL A
JZ K_RET1 ;数据为0说明按键释放;A为0跳转
AJMP K_RET ;如果不为0,继续等待
K_RET1:
CALL DELAY ;消除后沿抖动
RET
;流水灯延时子程序
D500:
MOV R7,#250
D2:
MOV R6,#250
DJNZ R6,$ ;减1不为0跳转
DJNZ R7,D2
RET
;流水灯子程序
LAMP:
JB startend,lampstart ;如果startend=1则启动;某位为1跳转
MOV P1,#0FFH ;否则关闭显示
AJMP LAMPRET ;返回
lampstart:
JB updown,LAMPUP ;如果updown=1,向上流动显示
MOV A,LAMPCODE ;循环左移
RL A
MOV LAMPCODE,A
MOV P1,A ;显示
LCALL D500
AJMP LAMPRET
LAMPUP:
MOV A,LAMPCODE
RR A ;循环右移
MOV LAMPCODE,A
MOV P1,A
LCALL D500
LAMPRET:
RET
END
不多说了:
按键流水灯对应的C代码
//实现按键控制流水灯功能
//P3.2:
开始,按此键则开始
//P3.3:
停止
//P3.4:
向上流动
//P3.5:
向下流动
#include
#include
#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;
if((kvalue&0x08)==0)
startend=0;
if((kvalue&0x10)==0)
updown=1;
if((kvalue&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); //否则有键按下,取抖
kvalue=P3;
kvalue|=0xc3; //屏蔽其他位
if(kvalue==0xff)
return(0); //无按键,返回0
for(;;) //否则,有按键按下,等待按键放开
{
tmp=P3;
if((tmp|0xc3)==0xff)
break;
}
return(kvalue); //返回键值
}
/*****主函数************/
voidmain()
{
ucharkvalue; //存放键值
ucharlampcode; //存放流水灯代码
P1=0xff; //熄灭所有灯
lampcode=0xfe;
for(;;)
{
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
}
else
P1=0xff; //开始标志为0,关闭显示
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 键盘 可控 流水 资料