51单片机按键控制花样灯.docx
《51单片机按键控制花样灯.docx》由会员分享,可在线阅读,更多相关《51单片机按键控制花样灯.docx(15页珍藏版)》请在冰点文库上搜索。
51单片机按键控制花样灯
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*
***********************************************************/
#include//头文件,函数声明
#include
//定义按键所在位
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。
j<110。
j++>。
//还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确
}
}
voidmain(>
{//P2=led。
unsignedinti。
while(1>
{
/*********************************************
*当K1按下时,灯从0xfe向左跑一遍;*
*********************************************/
if(K1==0>
delayms(10>。
//消除键盘抖动
if(K1==0>
{
led=0xfe。
for(i=0。
i<7。
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==0>
delayms(10>。
if(K2==0>
{
led=0x7f。
for(i=0。
i<7。
i++>
{
P2=led。
delayms(100>。
led=_cror_(led,1>。
P2=led。
delayms(100>。
}
while(!
K1>。
P2=led。
delayms(100>。
for(i=0。
i<7。
i++>
{
led=_crol_(led,1>。
P2=led。
delayms(100>。
//跑回去怎么就那么快呀?
}//此时led=0x7f
}
/*****************************************************
*当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。
*
*************************************************/
if(K3==0>
delayms(10>。
//消除抖动
if(K3==0>
{
led=0xfe。
delayms(200>。
for(i=0。
i<7。
i++>
{
P2=led。
delayms(200>。
led=led<<1。
//备注led=_crol_(led,1)等于led<<1||led>>7。
P2=led。
delayms(200>。
if(led==0x00>
break。
//这里一定要有个break,跳出循环,然后别忘了此时的状态是00,而不是7f
}
while(!
K1>。
led=0x7f。
P2=led。
delayms(200>。
for(i=0。
i<7。
i++>
{
led=led>>1。
P2=led。
delayms(200>。
}
}
/****************************************************
*当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。
*
****************************************************/
if(K4==0>
delayms(10>。
//消除抖动
if(K4==0>
{
for(i=0。
i<4。
i++>//执行四次
{led=0xf0。
P2=led。
delayms(500>。
led=0x0f。
P2=led。
delayms(500>。
}
}
/********************************************************
*当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。
*
********************************************************/
if(K5==0>
delayms(10>。
if(K5==0>
P2=0xff。
}
}
/*****/
时钟+秒表+流水灯的单片机汇编程序
时间:
2018-09-1013:
49:
42来源:
作者:
//HJSMSY-V1.0单片机开发板测试程序
//---------------------------------------------
//<<电脑钟>>
//---------------------------------------------
//=======主函数==================================
ORG0000H
LJMPMAIN
ORG000BH
LJMPT00
//ORG001BH
//LJMPT11
ORG0030H
//=======程序初始化=============================
MAIN:
MOVTMOD,#11H
MOVTH0,#3CH
MOVTL0,#0B0H
MOVTH1,#0F0H
MOVTL1,#0B0H
SETBEA
SETBET0
//SETBET1
SETBTR0
//SETBTR1
CLRP3.4
MOVR7,#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,#0FFH
MOVP1,#0FFH
MOVR0,40H
CJNER0,#01H,ACL1
ACALLMAIN2。
时钟显示
ACL1:
CJNER0,#02H,ACL2
ACALLMAIN3。
秒表
ACL2:
CJNER0,#03H,ACL3
ACALLLED。
流水灯
ACL3:
ACALLKEY。
按键扫描
//ACALLBAO。
定时报警
LJMPMAIN1
//=======报警子程序============================
BAO:
MOVR4,33H
CJNER4,#03H,YY1
CLRP3.2
ACALLKEY
LJMPYY2
YY1:
CJNER4,#05H,YY2
SETBP3.2
ACALLKEY
YY2:
RET
//======时钟扫描子程序=======================
MAIN2:
MOVA,30H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.0
ACALLDELAY
MOVA,31H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.1
SETBP1.0
ACALLDELAY
MOVA,32H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.2
SETBP1.1
ACALLDELAY
MOVA,33H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.3
SETBP1.2
ACALLDELAY
MOVA,34H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.4
SETBP1.3
ACALLDELAY
MOVA,35H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.5
SETBP1.4
ACALLDELAY
MOVP0,#7FH
MOVP1,#0EBH
ACALLDELAY
MOVP1,#0FFH
RET
//========秒表扫描子程序=========================
MAIN3:
MOVA,44H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.0
ACALLDELAY
MOVA,45H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.1
SETBP1.0
ACALLDELAY
MOVA,46H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.2
SETBP1.1
ACALLDELAY
MOVA,47H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.3
SETBP1.2
ACALLDELAY
MOVA,48H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.4
SETBP1.3
ACALLDELAY
MOVA,49H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.5
SETBP1.4
ACALLDELAY
MOVP0,#7FH
MOVP1,#0EBH
ACALLDELAY
MOVP1,#0FFH
RET
//=======定时器T0中断服务========================
T00:
MOVTH0,#0D8H
MOVTL0,#0F0H
INCR7
CJNER7,#64H,AA
MOVR7,#00H
//-------时钟跑值--------------------------------
TK1:
INC30H。
每秒钟秒个位增一
MOVR6,30H
CJNER6,#0AH,AA
MOV30H,#00H
TK2:
INC31H
MOVR6,31H
CJNER6,#06H,AA
MOV31H,#00H
TK3:
INC32H
MOVR6,32H
CJNER6,#0AH,AA
MOV32H,#00H
TK4:
INC33H
MOVR6,33H
CJNER6,#06H,AA
MOV33H,#00H
TK5:
INC34H
MOVR5,34H
MOVR6,35H
CJNER5,#04H,TK6
CJNER6,#02H,TK6
MOV34H,#00H
MOV35H,#00H
TK6:
CJNER5,#0AH,AA
MOV34H,#00H
INC35H
//-------秒表跑值----------------------
AA:
MOVR5,42H
CJNER5,#01H,TK7
INC44H
TK7:
MOVR5,44H
CJNER5,#0AH,AA1
MOV44H,#00H
INC45H
MOVR5,45H
CJNER5,#0AH,AA1
MOV45H,#00H
INC46H
MOVR5,46H
CJNER5,#0AH,AA1
MOV46H,#00H
INC47H
MOVR5,47H
CJNER5,#06H,AA1
MOV47H,#00H
INC48H
MOVR5,48H
CJNER5,#0AH,AA1
MOV48H,#00H
INC49H
MOVR5,49H
CJNER5,#06H,AA1
MOV49H,#00H
AA1:
RETI
//====定时器T1中断服务子程序====================
//T11:
MOVTH1,#0F0H
//MOVTL1,#0B0H
//RETI
//******定时时间调整子程序*************************//
TBAO:
MOV50H,#00H
MOV51H,#00H
MOV52H,#00H
MOV53H,#00H
MOV54H,#00H
MOV55H,#00H
MOVR3,50H
DJNZ30H,RET1
RET1:
RET
//======键盘扫描子程序==========================
KEY:
MOVP2,#0F0H
MOVR3,P2
CJNER3,#0F0H,KE0
LJMPKK13
KE0:
CJNER3,#0E0H,KE1。
P2.4行
MOVP2,#0EFH
JBP2.3,KK1//用作调定时时间。
K13秒个位增一
ACALLDELAY1
ACALLTK1
KK1:
JBP2.2,KK2。
K14秒十增一
ACALLDELAY1
ACALLTK2
KK2:
JBP2.1,KK3。
K15分个位增一
ACALLDELAY1
ACALLTK3
KK3:
JBP2.0,KE1。
K16分十位增一
ACALLDELAY1
ACALLTK4
KE1:
MOVP2,#0DFH。
P2.5行
JBP2.3,KK4。
K9时个位增一
ACALLDELAY1
ACALLTK5
KK4:
JBP2.2,KK5。
K10时十位增一
ACALLDELAY1
INC35H
MOVR3,35H
CJNER3,#03H,HH0
MOV35H,#00H
LJMPKK5
HH0:
CJNER3,#02H,HH1
LJMPKK5
HH1:
CJNER3,#01H,HH2
LJMPKK5
HH2:
MOV35H,#00H
KK5:
JBP2.1,KK6
ACALLDELAY1。
K11开/关蜂鸣器
CPLP3.2
KK6:
JBP2.0,KE2。
K12秒表暂停
MOV42H,#00H
KE2:
MOVP2,#0BFH。
P.6行
JBP2.3,KK7。
K5时钟暂停/取消暂停
ACALLDELAY1
CPLET0
KK7:
JBP2.2,KK8。
K6显示/休眠/流水灯
ACALLDELAY2
INC40H
MOVR3,40H
CJNER3,#04H,KK8
MOV40H,#01H
KK8:
JBP2.1,KK9
//ACALLDELAY3。
K7秒表清0
MOV44H,#00H
MOV45H,#00H
MOV46H,#00H
MOV47H,#00H
MOV48H,#00H
MOV49H,#00H
KK9:
JBP2.0,KE3。
K8秒表开始跑
MOV42H,#01H
KE3:
MOVP2,#7FH。
P2.7行
JBP2.3,KK10。
K1秒十位减一
ACALLDELAY1
MOVR3,31H
CJNER3,#00H,JA1
LJMPKK10
JA1:
DEC31H
KK10:
JBP2.2,KK11。
K2分个位减一
ACALLDELAY1
MOVR3,32H
CJNER3,#00H,JA2
LJMPKK11
JA2:
DEC32H
KK11:
JBP2.1,KK12。
K3分十位减一
ACALLDELAY1
MOVR3,33H
CJNER3,#00H,JA3
LJMPKK12
JA3:
DEC33H
KK12:
JBP2.0,KK13。
K4时个位减一
ACALLDELAY1
MOVR3,34H
CJNER3,#00H,JA4
LJMPKK13
JA4:
DEC34H
KK13:
RET
//=====流水灯子程序===========================
LED:
MOVA,#0feH
MOV41H,#08H
MOVP0,#0FFH
LED1:
MOVP1,A
MOVR3,#100
D0:
ACALLDELAY
DJNZR3,D0
MOVR3,41H
DJNZR3,AAA
LJMPBB
AAA:
RLA
MOV41H,R3
ACALLKEY
LJMPLED1
BB:
MOV41H,#07H
CC:
MOVP1,A
MOVR3,#30
D1:
ACALLDELAY
DJNZR3,D1
MOVR3,41H
DJNZR3,DD
LJMPLED0
DD:
RRA
MOV41H,R3
ACALLKEY
LJMPCC
LED0:
RET
//=====延时子程序==============================
DELAY:
MOVR1,#250
DEL1:
NOP
NOP
NOP
NOP
DJNZR1,DEL1
RET
//====调用时钟显示作延时========================
DELAY1:
MOVR2,#20
DELA3:
ACALLMAIN2
DJNZR2,DELA3
RET
//====调用秒表显示作延时========================
DELAY3:
MOVR2,#20
DELA5:
ACALLMAIN3
DJNZR2,DELA5
RET
//====调用延时子程序作延时======================
DELAY2:
MOVR2,#100
DELA4:
ACALLDELAY
DJNZR2,DELA4
RET
//======共阳数码管段码表=================================
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,87H
END