给你写了参考程序,按键端口按你的实际电路重新定义。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit code0=P3^1; //定义发光管端口
sbit code1=P0^0;
sbit code2=P0^1;
sbit code3=P0^2;
sbit code4=P0^3;
sbit code5=P0^6;
sbit code6=P0^7;
sbit code7=P3^4;
sbit key=P3^7; //定义按键端口
uchar code table1[]={0xe7,0xdb,0xbd,0x7e};//花样跑马灯数组
uchar code table2[]={0x7e,0xbd,0xdb,0xe7};
uchar code table3[]={0x00,0xff,0x00,0xff};
uchar Cnt50ms=0; //中断计时变量
uchar KeySec=0; //键值变量(花样选择)
uchar j=0; //流水顺序变量
void Timer0Init() //50毫秒@12.000MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void PX(uchar i) //写8位数据函数
{
code0=i&0x01;i>>=1;
code1=i&0x01;i>>=1;
code2=i&0x01;i>>=1;
code3=i&0x01;i>>=1;
code4=i&0x01;i>>=1;
code5=i&0x01;i>>=1;
code6=i&0x01;i>>=1;
code7=i&0x01;
}
void keyscan()
{
static uchar count=0; //计数变量
static bit key_sign; //按键状态标志
if(!key) //检测输入如果为0
{
count++; //计数延时消抖
if((count>=200)&&(key_sign==0))
{
key_sign=1; //按键状态标志置1,防止重复响应
j=0; //流水顺序变量清0
KeySec++; //键值变量自+1
if(KeySec>=4)
KeySec=0;
}
}
else
{
count=0; //计数变量清0
key_sign=0;
}
}
void main()
{
Timer0Init();
while(1)
{
keyscan();
if(Cnt50ms>=10)//0.5秒
{
Cnt50ms=0;
switch(KeySec)
{
case 0: PX(0xff); break;
case 1: PX(table1[j]); break;
case 2: PX(table2[j]); break;
case 3: PX(table3[j]); break;
}
j++; //流水顺序变量自+1
if(j>=4)
j=0;
}
}
}
void timer0() interrupt 1
{
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
Cnt50ms++; //中断变量Cnt50ms自+1
} |