键盘可控流水灯资料Word文档下载推荐.docx

上传人:b****4 文档编号:7921950 上传时间:2023-05-09 格式:DOCX 页数:8 大小:17.56KB
下载 相关 举报
键盘可控流水灯资料Word文档下载推荐.docx_第1页
第1页 / 共8页
键盘可控流水灯资料Word文档下载推荐.docx_第2页
第2页 / 共8页
键盘可控流水灯资料Word文档下载推荐.docx_第3页
第3页 / 共8页
键盘可控流水灯资料Word文档下载推荐.docx_第4页
第4页 / 共8页
键盘可控流水灯资料Word文档下载推荐.docx_第5页
第5页 / 共8页
键盘可控流水灯资料Word文档下载推荐.docx_第6页
第6页 / 共8页
键盘可控流水灯资料Word文档下载推荐.docx_第7页
第7页 / 共8页
键盘可控流水灯资料Word文档下载推荐.docx_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

键盘可控流水灯资料Word文档下载推荐.docx

《键盘可控流水灯资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《键盘可控流水灯资料Word文档下载推荐.docx(8页珍藏版)》请在冰点文库上搜索。

键盘可控流水灯资料Word文档下载推荐.docx

调用键盘程序

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 

取反,便于检查键值

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,关闭显示

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2