1、键盘可控流水灯资料;*; 平凡单片机工作室;作者:周坚 ;功能描述:;P3.2:开始,按此键则灯开始流动(由上而下);P3.3:停止,按此键则停止流动,所有灯为暗;P3.4:上,按此键则灯由上向下流动;P3.5:下,按此键则灯由下向上流动;本例可用TOP51-2005/TOPAV-2008单片机开发平台验证;*UpDown EQU 00H ;上下行标志StartEnd EQU 01H ;起动及停止标志LAMPCODE EQU 21H ;存放流动的数据代码ORG 0000HAJMP MAINORG 30HMAIN: MOV SP,#5FHMOV P1,#0FFHCLR UpDown ;启动时处于
2、向上的状态CLR StartEnd ;启动时处于停止状态MOV LAMPCODE,#0FEH ;单灯流动的代码 LOOP: ACALL KEY ;调用键盘程序JNB F0,LNEXT ;如果无键按下,则继续ACALL KEYPROC ;否则调用键盘处理程序LNEXT: ACALL LAMP ;调用灯显示程序AJMP LOOP ;反复循环,主程序到此结束;-DELAY: MOV R7,#10D1: MOV R6,#100DJNZ R6,$DJNZ R7,D1RET;-延时程序,键盘处理中调用KEYPROC:MOV A,B ;从B寄存器中获取键值JB ACC.2,KeyStart ;分析键的代码,
3、某位被按下,则该位为1JB ACC.3,KeyOverJB ACC.4,KeyUpJB ACC.5,KeyDownAJMP KEY_RETKeyStart:SETB StartEnd ;第一个键按下后的处理AJMP KEY_RETKeyOver:CLR StartEnd ;第二个键按下后的处理AJMP KEY_RETKeyUp: SETB UpDown ;第三个键按下后的处理AJMP KEY_RETKeyDown:CLR UpDown ;第四个键按下后的处理KEY_RET:RETKEY: CLR F0 ;清F0,表示无键按下。ORL P3,#00111100B ;将P3口的接有键的四位置1MO
4、V A,P3 ;取P3的值ORL A,#11000011B ;将其余4位置1CPL A ;取反JZ K_RET ;如果为0则一定无键按下ACALL DELAY ;否则延时去键抖ORL P3,#00111100BMOV A,P3ORL A,#11000011BCPL AJZ K_RETMOV B,A ;确实有键按下,将键值存入B中SETB F0 ;设置有键按下的标志K_RET:ORL P3,#00111100B ;此处循环等待键的释放MOV A,P3ORL A,#11000011BCPL AJZ K_RET1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回AJMP K_RETK_
5、RET1: RET;- D500MS: ;流水灯的延迟时间PUSH PSWSETB RS0MOV R7,#5 ;如果用实验仿真板,该值可根据你的机器运行情况更改,在1-255之间D51: MOV R6,#250D52: MOV R5,#200D53: DJNZ R5,D53DJNZ R6,D52DJNZ R7,D51POP PSWRET ;-LAMP:JB StartEnd,LampStart ;如果StartEnd=1,则启动MOV P1,#0FFHAJMP LAMPRET ;否则关闭所有显示,返回LampStart:JB UpDown,LAMPUP ;如果UpDown=1,则向上流动MOV
6、 A,LAMPCODERL A ;向上移动实际就是左移位MOV LAMPCODE,A MOV P1,ALCALL D500MSAJMP LAMPRETLAMPUP: MOV A,LAMPCODERR A ;向下流动实际就是右移MOV LAMPCODE,AMOV P1,ALCALL D500MSLAMPRET:RETEND这个是按键流水灯的汇编代码,当然还有很多问题的。没办法,也不想弄,现在就想快点把C入门的书看完,把板子光盘上的例子都跑一下,然后就研究一下RTXtiny。为了9月做一下准备。我的比较长期的目标就是把这个东西移植到MSP430F135上面_ 对了,这个例子成功了(好像我就没贴过不
7、成功的例子)updownBIT00H;上下显示标志startendBIT01H;起停标志LAMPCODEEQU21H;存放流水灯的代码ORG0000HAJMPMAINORG30HMAIN:MOVSP,#5FH;设置堆栈CLRupdownCLRstartendMOVLAMPCODE,#0FEH;单灯流动代码LOOP:ACALLKEY;调用键盘程序JNBF0,LNEXT;如果无键按下,则继续;某位位0跳转ACALLKEYPROC;否则调用键盘处理程序LNEXT:ACALLLAMP;调用流水灯显示程序AJMPLOOP;循环,主程序结束;延时程序DELAY:MOVR7,#100D1:MOVR6,#10
8、0DJNZR6,$DJNZR7,D1RET;键盘处理程序KEYPROC:MOVA,B;从B寄存器中取键值JBACC.2,KEYSTART;分析键代码,如果某位被按下,则该位为1JBACC.3,KEYOVER ;JB:某位为1跳转JBACC.4,KEYUPJBACC.5,KEYDOWNAJMPKEY_RETKEYSTART:SETBstartend;第一个按键被按下的处理AJMPKEY_RETKEYOVER:CLRstartend;第二个按键被按下的处理AJMPKEY_RETKEYUP:SETBupdown;第三个按键AJMPKEY_RETKEYDOWN:CLRupdownKEY_RET:RET
9、;读键值子程序KEY:CLRF0;PSW中的用户状态字,清F0,表示无键按下ORLP3,#00111100B;P3口中间4位置一MOVA,P3;取P3口状态(读键值)ORLA,#11000011B;屏蔽其余四位CPLA;取反,便于检查键值JZK_RET;如为0,无键按下;A为0跳转CALLDELAY;有按键按下,去抖ORLP3,#00111100BMOVA,P3ORLA,#11000011BCPLAJZK_RET;如果为0,无键按下,返回MOVB,A;否则键值存入B寄存器SETBF0;置位F0,表示有键按下K_RET:ORLP3,#0011100B;此处循环等待按键释放MOVA,P3ORLA,
10、#11000011BCPLAJZK_RET1;数据为0说明按键释放;A为0跳转AJMPK_RET;如果不为0,继续等待K_RET1:CALLDELAY;消除后沿抖动RET;流水灯延时子程序D500:MOVR7,#250D2:MOVR6,#250 DJNZR6,$;减1不为0跳转DJNZR7,D2RET;流水灯子程序LAMP:JBstartend,lampstart;如果startend1则启动;某位为1跳转MOVP1,#0FFH;否则关闭显示AJMPLAMPRET;返回lampstart:JBupdown,LAMPUP;如果updown=1,向上流动显示MOVA,LAMPCODE;循环左移RL
11、AMOVLAMPCODE,AMOVP1,A;显示LCALLD500AJMPLAMPRETLAMPUP:MOVA,LAMPCODERRA;循环右移MOVLAMPCODE,AMOVP1,ALCALLD500LAMPRET:RETEND不多说了:按键流水灯对应的C代码/实现按键控制流水灯功能/P3.2:开始,按此键则开始/P3.3:停止/P3.4:向上流动/P3.5:向下流动#include#include/包含了循环移位的函数原型#define uchar unsigned char#define uint unsigned intbit updown=0;/上下流动标志位bit startend
12、=0;/启动停止标志位/*我是无敌分割线*/ms延时子函数void mdelay(uint delay)uint i;for(;delay0;delay-)for(i=0;i124;i+);/*键值处理子函数*/void kproce(uchar kvalue)if(kvalue&0x04)=0)startend=1;if(kvalue&0x08)=0)startend=0;if(kvalue&0x10)=0)updown=1;if(kvalue&0x20)=0)updown=0;/*取键值子函数*/uchar key()uchar kvalue;uchar tmp;P3|=0x3c;/P3口
13、中间4位置一kvalue=P3;/取P3状态kvalue|=0xc3;/屏蔽头尾各2位if(kvalue=0xff)return(0);/没有键按下,返回0mdelay(10);/否则有键按下,取抖kvalue=P3;kvalue|=0xc3;/屏蔽其他位if(kvalue=0xff)return(0);/无按键,返回0for(;)/否则,有按键按下,等待按键放开tmp=P3;if(tmp|0xc3)=0xff)break;return(kvalue);/返回键值/*主函数*/void main()uchar kvalue;/存放键值uchar lampcode;/存放流水灯代码P1=0xff;/熄灭所有灯lampcode=0xfe;for(;)kvalue=key();/调用键盘程序,取得键值if(kvalue)/如果键值不为0kproce(kvalue);/键值处理程序if(startend)/开始标志为1,则显示流动代码P1=lampcode;if(updown)/上下流动标志lampcode=_cror_(lampcode,1);elselampcode=_crol_(lampcode,1);mdelay(500);/延时500mselseP1=0xff;/开始标志为0,关闭显示
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1