51单片机按键控制花样灯.docx
《51单片机按键控制花样灯.docx》由会员分享,可在线阅读,更多相关《51单片机按键控制花样灯.docx(22页珍藏版)》请在冰豆网上搜索。
51单片机按键控制花样灯
51单片机按键控制花样灯
时间:
2012-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;
}
}
/*****/
时钟+秒表+流水灯的单片机汇编程序
时间:
2012-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