51单片机按键控制花样灯时间:2018-09-1013:50:11来源:51hei作者:/*****************************************************本程序实现用按键控制花样灯。**当K1按下时,灯从0xfe向左跑一遍;**当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置;**当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。**当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。**当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。*******************************************************/*************************************************连接方法:P0接独立按键JP5。P2接LED灯接口JP1************************************************************/#includereg52.h//头文件,函数声明#includeintrins.h//定义按键所在位sbitK1=P0^0。sbitK2=P0^1。sbitK3=P0^2。sbitK4=P0^3。sbitK5=P0^4。unsignedcharled。unsignedcharj。voiddelayms(unsignedcharms//1ms标准延时{while(ms--{for(j=0。j110。j++。//还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确}}voidmain({//P2=led。unsignedinti。while(1{/**********************************************当K1按下时,灯从0xfe向左跑一遍;**********************************************/if(K1==0delayms(10。//消除键盘抖动if(K1==0{led=0xfe。for(i=0。i7。i++//i可以去8的倍数,表示本电路执行多少次{//led=0x7f。//P端口的初定义要在循环外面,不然会使效果错乱P2=led。//因为这里已经初设一个灯,所以for里面要加上这一个delayms(100。//起初这里设置500MS,使按键每按一下灯彩走一个,不能达到要求。led=_crol_(led,1。P2=led。delayms(100。}while(!K1。//这里强调松开就没再次执行程序P2=led。//说明执行完上面的程序的最后状态}//P2=led。//如果把本行放在这里,虽然在开头中没有说明程序烧写好之后就先显示一个灯,但因为本行在if外面,所有最后还是会显示/************************************************************当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置************************************************************/if(K2==0delayms(10。if(K2==0{led=0x7f。for(i=0。i7。i++{P2=led。delayms(100。led=_cror_(led,1。P2=led。delayms(100。}while(!K1。P2=led。delayms(100。for(i=0。i7。i++{led=_crol_(led,1。P2=led。delayms(100。//跑回去怎么就那么快呀?}//此时led=0x7f}/******************************************************当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。**************************************************/if(K3==0delayms(10。//消除抖动if(K3==0{led=0xfe。delayms(200。for(i=0。i7。i++{P2=led。delayms(200。led=led1。//备注led=_crol_(led,1)等于led1||led7。P2=led。delayms(200。if(led==0x00break。//这里一定要有个break,跳出循环,然后别忘了此时的状态是00,而不是7f}while(!K1。led=0x7f。P2=led。delayms(200。for(i=0。i7。i++{led=led1。P2=led。delayms(200。}}/*****************************************************当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。*****************************************************/if(K4==0delayms(10。//消除抖动if(K4==0{for(i=0。i4。i++//执行四次{led=0xf0。P2=led。delayms(500。led=0x0f。P2=led。delayms(500。}}/*********************************************************当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。*********************************************************/if(K5==0delayms(10。if(K5==0P2=0xff。}}/*****/时钟+秒表+流水灯的单片机汇编程序时间:2018-09-1013:49:42来源:作者://HJSMSY-V1.0单片机开发板测试程序//---------------------------------------------//电脑钟//---------------------------------------------//=======主函数==================================ORG0000HLJMPMAINORG000BHLJMPT00//ORG001BH//LJMPT11ORG0030H//=======程序初始化=============================MAIN:MOVTMOD,#11HMOVTH0,#3CHMOVTL0,#0B0HMOVTH1,#0F0HMOVTL1,#0B0HSETBEASETBET0//SETBET1SETBTR0//SETBTR1CLRP3.4MOVR7,#00H。秒值MOV30H,#00H。秒个位值MOV31H,#00H。秒十位值MOV32H,#00H。分个位MOV33H,#00H。分十位MOV34H,#00H。时个位MOV35H,#00H。时十位MOV44H,#00H。秒表毫秒十位MOV45H,#00H。秒表秒毫秒百位MOV46H,#00H。秒表秒个位MOV47H,#00H。秒表秒十位MOV48H,#00H。秒表分个位MOV49H,#00H。秒表分十位MOVP2,#0F0H。P2口按键初始化MOV40H,#01H。数码管休眠值/流水灯/秒表开关数MOV41H,#08H。流水灯循环值MOV42H,#00H。秒表暂停//ACALLT11//-----------------------------------------------MAIN1:MOVP0,#0FFHMOVP1,#0FFHMOVR0,40HCJNER0,#01H,ACL1ACALLMAIN2。时钟显示ACL1:CJNER0,#02H,ACL2ACALLMAIN3。秒表ACL2:CJNER0,#03H,ACL3ACALLLED。流水灯ACL3:ACALLKEY。按键扫描//ACALLBAO。定时报警LJMPMAIN1//=======报警子程序============================BAO:MOVR4,33HCJNER4,#03H,YY1CLRP3.2ACALLKEYLJMPYY2YY1:CJNER4,#05H,YY2SETBP3.2ACALLKEYYY2:RET//======时钟扫描子程序=======================MAIN2:MOVA,30HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.0ACALLDELAYMOVA,31HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.1SETBP1.0ACALLDELAYMOVA,32HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.2SETBP1.1ACALLDELAYMOVA,33HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.3SETBP1.2ACALLDELAYMOVA,34HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.4SETBP1.3ACALLDELAYMOVA,35HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.5SETBP1.4ACALLDELAYMOVP0,#7FHMOVP1,#0EBHACALLDELAYMOVP1,#0FFHRET//========秒表扫描子程序=========================MAIN3:MOVA,44HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.0ACALLDELAYMOVA,45HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.1SETBP1.0ACALLDELAYMOVA,46HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.2SETBP1.1ACALLDELAYMOVA,47HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.3SETBP1.2ACALLDELAYMOVA,48HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.4SETBP1.3ACALLDELAYMOVA,49HMOVDPTR,#TABMOVCA,@A+DPTRMOVP0,ACLRP1.5SETBP1.4ACALLDELAYMOVP0,#7FHMOVP1,#0EBHACALLDELAYMOVP1,#0FFHRET//=======定时器T0中断服务========================T00:MOVTH0,#0D8HMOVTL0,#0F0HINCR7CJNER7,#64H,AAMOVR7,#00H//-------时钟跑值--------------------------------TK1:INC30H。每秒钟秒个位增一MOVR6,30HCJNER6,#0AH,AAMOV30H,#00HTK2:INC31HMOVR6,31HCJNER6,#06H,AAMOV31H,#00HTK3:INC32HMOVR6,32HCJNER6,#0AH,AAMOV32H,#00HTK4:INC33HMOVR6,33HCJNER6,#06H,AAMOV33H,#00HTK5:INC34HMOVR5,34HMOVR6,35HCJNER5,#04H,TK6CJNER6,#02H,TK6MOV34H,#00HMOV35H,#00HTK6:CJNER5,#0AH,AAMOV34H,#00HINC35H