求大神一个关于89c52单片机用S0键来启动和停止流水灯的程序,在这里先感谢各位大佬帮帮忙。

如题所述

第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;//不显示
}
}
}
相似回答