|
|
楼主 |
发表于 2026-10-29 08:51:13
|
显示全部楼层
实验箱流水灯程序,按键控制流水灯模式。
#include <STC32G.H>
#include "KEY_Drive.H"
/*----------按键变量声明----------*/
unsigned char Key_Slow_Down; //按键消抖变量
unsigned char Key_Val,Key_Down,Key_Up,Key_Old; //按键检测变量
unsigned char Uled = 0xFE;
unsigned char Led_Mode;
bit Led_Flag;
unsigned char Led_Date[]= {0x7E,0xBD,0xDB,0xE7};
unsigned char Led_Index;
unsigned int Time = 500;
void Delay(unsigned int xms) //@22.1184MHz
{
unsigned long edata i;
while(--xms)
{
_nop_();
i = 5528UL;
while (i) i--;
}
}
//========================================================================
// 函数: 按键处理函数
// 描述: 通过按键控制LED流水灯
// 参数: 无
// 返回: 无
// 备注:
//========================================================================
void Key_Proc()
{
if(Key_Slow_Down)return; //按键消抖
Key_Slow_Down = 1;
Key_Val=Key_Read(); //读取键码值
Key_Down=Key_Val&(Key_Val^Key_Old); //检测下降沿
Key_Up=~Key_Val&(Key_Val^Key_Old); //检测上升沿
Key_Old=Key_Val; //扫描辅助变量
switch(Key_Down)
{
case 1:
Led_Flag=1;
break;
case 2:
Led_Flag=0;
break;
case 3:
Led_Mode++;
if(Led_Mode>=4)
{
Led_Mode=0;
}
break;
case 4:
Led_Mode--;
if(Led_Mode<=255)
{
Led_Mode=3;
}
break;
case 5:
Time+=100;
if(Time >=1000)
Time=1000;
break;
case 6:
Time-=100;
if(Time <=100)
Time=100;
break;
default:break;
}
}
void Led_Proc()
{
if(Led_Flag==1)
{
switch(Led_Mode)
{
case 0:
Uled= _cror_ (Uled,1);
P6 = Uled;
Delay(Time);
break;
case 1:
Uled= _crol_ (Uled,1);
P6 = Uled;
Delay(Time);
break;
case 2:
Led_Index++;
if(Led_Index>=4)Led_Index=0;
P6 = Led_Date[Led_Index];
Delay(300);
break;
case 3:
Led_Index--;
if(Led_Index==255)Led_Index=3;
P6 = Led_Date[Led_Index];
Delay(200);
break;
default:break;
}
}
}
void Timer0_Init(void) //1毫秒@22.1184MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初始值
TH0 = 0xA9; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main()
{
// unsigned volatile long i;
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXSFR();//扩展 SFR(XFR)访问使能
CKCON =0; //提高访问XRAM速度
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
Timer0_Init();
EA = 1;
P40 = 0;
while(1)
{
Key_Proc();
Led_Proc();
}
}
void Timer0_Isr(void) interrupt 1
{
if(++Key_Slow_Down==20)
Key_Slow_Down = 0;
}
|
|