#include<reg51.h> //包含51单片机寄存器定义的头文件
unsigned char keyval; //储存按键值
//unsigned char keyval2; //储存按键值
#define uchar unsigned char
#define uint unsigned int
code tabup[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
code tabdown[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uint x,y;
keyval2=0;
/*************************************************
函数功能:流水灯延时
**************************************************/
void led_delay(void)
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++);
}
/*************************************************
函数功能:软件消抖延时
**************************************************/
void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++);
}
/*************************************************
函数功能:正向流水点亮LED
**************************************************/
void forward(void)
{ //不能加while(1),会循环这一函数,其他按键控制无效
for(x=0;x<8;x++)
{
P1=tabup[x];
led_delay();
}
}
/*************************************************
函数功能:反向流水点亮LED
**************************************************/
void backward(void)
{ //不能加while(1),会循环这一函数,其他按键控制无效
for(y=0;y<8;y++)
{
P1=tabdown[y];
led_delay();
}
}
/*************************************************
函数功能:关闭所有LED
**************************************************/
void stop(void)
{
P1=0xff; //关闭8个LED
}
/*************************************************
函数功能:闪烁点亮LED
**************************************************/
void flash(void)
{
P1=0x00; //点亮8个LED
led_delay();
}
/*************************************************
函数功能:主函数
**************************************************/
void main(void) //主函数
{
SCON = 0x50; //设定串口工作方式
PCON = 0x00; //波特率不倍增
TMOD = 0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
TL1 = 0xfd;
TH1 = 0xfd; //波特率9600
TR1 = 1;
EA = 1;
ES = 1; //允许串口中断
while(1);
}
/*************************************************
函数功能:定时器T0的中断服务子程序
**************************************************/
void serial() interrupt 4
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
keyval = SBUF; //从串口缓冲区取得数据
if(keyval==0);
{
keyval=keyval2;
}
keyval2=keyval;
switch(keyval)
{
case 1:forward();break;
case 2:backward();break;
case 3:stop();break;
case 4:flash();break;
}
ES = 1; //允许串口中断
}
|