第1个回答 2021-01-19
//键控流水灯
#include "REG52.H"
#define DataGPIO P1//显示端口
#define FLOWTIME 100//修改此值,改变流水速度
sbit KEY = P2^0;//按键
bit Start_flag =0;//流水灯控制
bit Flow_flag =0;//流水
unsigned char Cnt =0;//流水灯计数器
unsigned char KEY_Cnt=0;//按键识别计数器
void Init_Timer0()//定时器0初始化
{
TMOD |= 0x01;//16位计数器
TH0 = 0xEC;
TL0 = 0x77;//12M,12T,5000us=5ms
TCON |= 0x10;//定时器0启动
TCON |= 0x01;//定时器0中断允许
IE |= 0x80;//总中断开
}
void Flow_Cont()//流水计数
{
if(++Cnt>FLOWTIME)//500ms
{
Cnt=0;
Flow_flag =1;//流水控制位
}
}
void KEY_Scan()//键扫描
{
if(!KEY)//键被按下
{
if(KEY_Cnt!=0)//键计数器不为0,已经消抖
{
KEY_Cnt = 0;//清计数器
Start_flag =~Start_flag;//流水显示控制
}
else //键计数器为0,没有消抖
{
KEY_Cnt++;//键计数器+1,再扫描一次。
}
}
}
//
void Timer0_ISR() interrupt 1 //定时器0中断响应
{
TCON &= ~0x20;//定时器0清溢出
TH0 = 0x3C;
TL0 = 0xAF;//12M,12T,50000us=50ms
Flow_Cont();//流水计数
KEY_Scan();//键扫描
}
void DispFlashLED()//流水灯
{
if(Flow_flag)
{
Flow_flag =0;//
switch(DispBit)
{
case 0; DataGPIO = 0xfe; break;
case 0; DataGPIO = 0xfd; break;
case 0; DataGPIO = 0xfb; break;
case 0; DataGPIO = 0xf7; break;
case 0; DataGPIO = 0xef; break;
case 0; DataGPIO = 0xdf; break;
case 0; DataGPIO = 0xbf; break;
case 0; DataGPIO = 0x7f; break;
}
DispBit++;
}
}
int main()
{
Init_Timer0();//定时器0初始化
while(1)
{
if(Start_flag)//如果启动流水灯
{
DispFlashLED();//流水灯
}
else
{
DataGPIO = 0xff;//不显示
}
}
}