51单片机键控彩灯实验
一、实验目的
1.掌握利用单片机I/O口的工作状态
2. 熟记汇编指令
3. 掌握键盘控制的方法,了解软件去抖动的方法
二、实验内容
1.利用4个独立按键控制LED灯实现流水灯花样变换
2.根据实验目的将程序编写出来
3.电路工作原理图
三、实验器材
电脑一台,单片机实验板
四、实验步骤
1.把实验板上的32P口LED的跳线跳到32P口LED的位置,电源接通。
2.保存文件到E盘,扩展名为.asm或者为.c。
3.编译,检察语法错误,修改程序至无错误为止。
4.将编译的可执行文件(后缀 .hex)下载到开发板,观察实验现象。
五、实验注意事项
1.文件的扩展名必须为.ASM或.C,文件名不可为汉字。
2.必须在编译完程序后才可执行程序。
六、参考程序
1.汇编程序
ORG 0000H ;开始
JMP MAIN
ORG 0080H
MAIN: MOV SP,#60H ;
MOV P0,#00H
CALL DELAY
MOV P0,#0FFH
CALL DELAY
CALL KEY
JMP MAIN
FUN0: MOV P0,#0F8H
CALL DELAY
MOV P0,#0FFH
CALL DELAY
CALL KEY
JMP FUN0
FUN1: MOV P0,#0C7H
CALL DELAY
MOV P0,#0FFH
CALL DELAY
CALL KEY
JMP FUN1
FUN2: MOV P0,#3FH
CALL DELAY
MOV P0,#0FFH
CALL DELAY
CALL KEY
JMP FUN2
FUN3: MOV P0,#0F1H
CALL DELAY
MOV P0,#0FFH
CALL DELAY
CALL KEY
JMP FUN3
KEY: CALL JP
JZ RETURN
CALL DELAY10MS
KEY0: JNB ACC.4,KEY1
KSF0: CALL DELAY10MS
CALL JP
JNZ KSF0
CALL FUN0
JMP RETURN
KEY1: JNB ACC.5,KEY2
KSF1: CALL DELAY10MS
CALL JP
JNZ KSF1
CALL FUN1
JMP RETURN
KEY2: JNB ACC.6,KEY3
KSF2: CALL DELAY10MS
CALL JP
JNZ KSF2
CALL FUN2
JMP RETURN
KEY3: JNB ACC.7,RETURN
KSF3: CALL DELAY10MS
CALL JP
JNZ KSF3
CALL FUN3
RETURN: RET
JP: MOV P1,#0FFH
MOV A,P1
CPL A
ANL A,#0F0H
RET
DELAY10MS: NOP
NOP
NOP
MOV R6,#50
D3: MOV R5,#50
DJNZ R5,$
DJNZ R6,D3
RET
DELAY: MOV R7,#30
DL1: MOV R6,#50
DL2: MOV R5,#50
DJNZ R5,$
DJNZ R6,DL2
DJNZ R7,DL1
RET
END
2.C语言程序
#include"reg51.h"
//延时函数
void Delay(void)
{
unsigned char i,j,k;
for(i=0;i<30;i++)
for(j=0;j<50;j++)
for(k=0;k<50;k++);
}
//延时函数
void Delay10MS(void)
{
unsigned char j,k;
for(j=0;j<50;j++)
for(k=0;k<50;k++);
}
unsigned char GetKey(void)
{
unsigned char value=0,key=0;
P1=0xFF;
value=P1;
value=value&0x3C;
if(value != 0x3C)
{
Delay10MS();
P1=0xFF;
value=P1;
value=value&0xF0;
if(value != 0xF0)
{
key=value;
while( value != 0xF0 )
{
P1=0xFF;
value=P1;
value=value&0xF0;
P2=0xF1;
Delay();
P2=0xFF;
Delay10MS();
}
return key;
}
}
return 0x0F;
}
//主函数
void main(void)
{
unsigned char i=0,keyvalue=0;
bit flag=0;
while(1)
{
P0=0xFF;
Delay();
P0=0x00;
Delay();
P0=0xFF;
Delay();
keyvalue=GetKey();
if(keyvalue!=0xF0)flag=1;
while(flag)
{
if((keyvalue&0x10)==0)//P1.4
{
do
{
P0=0xF8;
Delay();
P0=0xFF;
Delay();
keyvalue=GetKey();
}
while((keyvalue&0xF0)==0xF0);
}
else if((keyvalue&0x20)==0)//P1.5
{
do
{
P0=0xC7;
Delay();
P0=0xFF;
Delay();keyvalue=GetKey();
}
while((keyvalue&0xF0)==0xF0);
}
else if((keyvalue&0x40)==0)//P1.6
{
do
{
P0=0x3F;
Delay();
P0=0xFF;
Delay();keyvalue=GetKey();
}
while((keyvalue&0xF0)==0xF0);
}
else if((keyvalue&0x80)==0)//P1.7
{
do
{
P0=0xF1;
Delay();
P0=0xFF;
Delay();keyvalue=GetKey();
}
while((keyvalue&0xF0)==0xF0);
}
else
{
keyvalue=GetKey();
}
}
}
}