51单片机按键控制花样灯
51单片机按键控制花样灯
时间:2012-09-10 13:50:11 来源:51hei 作者:
/****************************************************
* 本程序实现用按键控制花样灯。
*
* 当K1按下时,灯从0xfe向左跑一遍;
*
* 当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置;*
* 当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。*
* 当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。* * 当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。* ******************************************************/
*************************************************
连接方法:P0接独立按键JP5;P2接LED灯接口JP1 *
***********************************************************/
#include
#include
//定义按键所在位
sbit K1=P0^0;
sbit K2=P0^1;
sbit K3=P0^2;
页脚内容1
sbit K4=P0^3;
sbit K5=P0^4;
unsigned char led;
unsigned char j;
void delayms(unsigned char ms) // 1ms标准延时
{
while(ms--)
{
for(j=0;j<110;j++); //还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确}
}
void main()
{ //P2=led;
unsigned int i;
while(1)
{
/*********************************************
页脚内容2
* 当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; //说明执行完上面的程序的最后状态
页脚内容3
} //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);
页脚内容4
}
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)
页脚内容5
{
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 );
页脚内容6
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);
页脚内容7
led=0x0f;
P2=led;
delayms(500);
}
}
/********************************************************
*当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。*
********************************************************/ if(K5==0)
delayms(10);
if(K5==0)
P2=0xff;
}
}
/**** */
时钟+秒表+流水灯的单片机汇编程序
时间:2012-09-10 13:49:42 来源:作者://HJSMSY-V1.0单片机开发板测试程序
页脚内容8
//---------------------------------------------
// <<电脑钟>>
//---------------------------------------------
//=======主函数================================== ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T00
// ORG 001BH
// LJMP T11
ORG 0030H
//=======程序初始化============================= MAIN:
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#0F0H
MOV TL1,#0B0H
SETB EA
SETB ET0
页脚内容9
// SETB ET1
SETB TR0
// SETB TR1
CLR P3.4
MOV R7,#00H ;秒值
MOV 30H,#00H ;秒个位值
MOV 31H,#00H ;秒十位值
MOV 32H,#00H ;分个位
MOV 33H,#00H ;分十位
MOV 34H,#00H ;时个位
MOV 35H,#00H ;时十位
MOV 44H,#00H ;秒表毫秒十位
MOV 45H,#00H ;秒表秒毫秒百位
MOV 46H,#00H ;秒表秒个位
MOV 47H,#00H ;秒表秒十位
MOV 48H,#00H ;秒表分个位
MOV 49H,#00H ;秒表分十位
MOV P2,#0F0H ;P2口按键初始化
MOV 40H,#01H ;数码管休眠值/流水灯/秒表开关数MOV 41H,#08H ;流水灯循环值
页脚内容10
MOV 42H,#00H ;秒表暂停
// ACALL T11
//-----------------------------------------------
MAIN1:
MOV P0,#0FFH
MOV P1,#0FFH
MOV R0,40H
CJNE R0,#01H,ACL1
ACALL MAIN2 ;时钟显示
ACL1:CJNE R0,#02H,ACL2
ACALL MAIN3 ;秒表
ACL2:CJNE R0,#03H,ACL3
ACALL LED ;流水灯
ACL3:ACALL KEY ;按键扫描
// ACALL BAO ;定时报警
LJMP MAIN1
//=======报警子程序============================ BAO:MOV R4,33H
CJNE R4,#03H,YY1
页脚内容11
CLR P3.2
ACALL KEY
LJMP YY2
YY1:CJNE R4,#05H,YY2
SETB P3.2
ACALL KEY
YY2:RET
//======时钟扫描子程序======================= MAIN2:
MOV A,30H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.0
ACALL DELAY
MOV A,31H
MOV DPTR,#TAB
MOVC A,@A+ DPTR
MOV P0,A
页脚内容12
CLR P1.1
SETB P1.0
ACALL DELAY
MOV A,32H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.2
SETB P1.1
ACALL DELAY
MOV A,33H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.3
SETB P1.2
ACALL DELAY
MOV A,34H
MOV DPTR,#TAB
MOVC A,@A+DPTR
页脚内容13
MOV P0,A
CLR P1.4
SETB P1.3
ACALL DELAY
MOV A,35H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.5
SETB P1.4
ACALL DELAY
MOV P0,#7FH
MOV P1,#0EBH
ACALL DELAY
MOV P1,#0FFH
RET
//========秒表扫描子程序========================= MAIN3:
MOV A,44H
MOV DPTR,#TAB
页脚内容14
MOVC A,@A+DPTR
MOV P0,A
CLR P1.0
ACALL DELAY
MOV A,45H
MOV DPTR,#TAB
MOVC A,@A+ DPTR
MOV P0,A
CLR P1.1
SETB P1.0
ACALL DELAY
MOV A,46H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.2
SETB P1.1
ACALL DELAY
MOV A,47H
MOV DPTR,#TAB
页脚内容15
MOVC A,@A+DPTR
MOV P0,A
CLR P1.3
SETB P1.2
ACALL DELAY
MOV A,48H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.4
SETB P1.3
ACALL DELAY
MOV A,49H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.5
SETB P1.4
ACALL DELAY
MOV P0,#7FH
页脚内容16
MOV P1,#0EBH
ACALL DELAY
MOV P1,#0FFH
RET
//=======定时器T0中断服务======================== T00:MOV TH0,#0D8H
MOV TL0,#0F0H
INC R7
CJNE R7,#64H,AA
MOV R7,#00H
//-------时钟跑值--------------------------------
TK1:INC 30H ;每秒钟秒个位增一
MOV R6,30H
CJNE R6,#0AH,AA
MOV 30H,#00H
TK2:INC 31H
MOV R6,31H
CJNE R6,#06H,AA
MOV 31H,#00H
TK3:INC 32H
页脚内容17
MOV R6,32H
CJNE R6,#0AH,AA
MOV 32H,#00H
TK4:INC 33H
MOV R6,33H
CJNE R6,#06H,AA
MOV 33H,#00H
TK5:INC 34H
MOV R5,34H
MOV R6,35H
CJNE R5,#04H,TK6
CJNE R6,#02H,TK6
MOV 34H,#00H
MOV 35H,#00H
TK6:CJNE R5,#0AH,AA
MOV 34H,#00H
INC 35H
//-------秒表跑值----------------------
AA:
MOV R5,42H
页脚内容18
CJNE R5,#01H,TK7
INC 44H
TK7:MOV R5,44H
CJNE R5,#0AH,AA1
MOV 44H,#00H
INC 45H
MOV R5,45H
CJNE R5,#0AH,AA1
MOV 45H,#00H
INC 46H
MOV R5,46H
CJNE R5,#0AH,AA1
MOV 46H,#00H
INC 47H
MOV R5,47H
CJNE R5,#06H,AA1
MOV 47H,#00H
INC 48H
MOV R5,48H
CJNE R5,#0AH,AA1
页脚内容19
MOV 48H,#00H
INC 49H
MOV R5,49H
CJNE R5,#06H,AA1
MOV 49H,#00H
AA1:RETI
//====定时器T1中断服务子程序==================== //T11:MOV TH1,#0F0H
// MOV TL1,#0B0H
// RETI
//******定时时间调整子程序*************************// TBAO:
MOV 50H,#00H
MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV R3,50H
页脚内容20