键盘可控流水灯资料.docx

上传人:b****8 文档编号:11435975 上传时间:2023-03-01 格式:DOCX 页数:8 大小:17.56KB
下载 相关 举报
键盘可控流水灯资料.docx_第1页
第1页 / 共8页
键盘可控流水灯资料.docx_第2页
第2页 / 共8页
键盘可控流水灯资料.docx_第3页
第3页 / 共8页
键盘可控流水灯资料.docx_第4页
第4页 / 共8页
键盘可控流水灯资料.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

键盘可控流水灯资料.docx

《键盘可控流水灯资料.docx》由会员分享,可在线阅读,更多相关《键盘可控流水灯资料.docx(8页珍藏版)》请在冰豆网上搜索。

键盘可控流水灯资料.docx

键盘可控流水灯资料

;**************************************************

;平凡单片机工作室

;作者:

周坚

;功能描述:

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

 }

}

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

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1