|
|
楼主 |
发表于 2026-5-5 08:56:52
|
显示全部楼层
/*-------------
利用擎天柱搭建学习板做试验,主控芯片AI8051U,系统时钟24M,数码管用4位共阳数码管显示,旋转编码器EC11带
按键
----------------*/
#include "CONFIG.H"
/*------------变量声明区------------*/
u8 SEG_BUF[3] = {11,11,11}; //数码管显示数组默认不显示
u8 SEG_Point[] = {0,0,0}; //小数点显示数组,0 - 不显示,1 - 显示.
u8 Dis_Index = 0; //数码管扫描索引
u8 Key_Slow_Dowm; //按键消抖处理变量
u8 Key_Val,Key_Down,Key_Up,Key_Old; //按键的按键值,上升沿,下降沿,长按处理变量
u16 Key_Time500ms; //按键500ms计时变量
bit Key_Time_Flag; //按键按下计时标志位
u8 Key_State; //按键当前状态
u8 Key_State1;
#define Key_Single 1 //按键单击标志
#define Key_Long 3 //按键长按标志
//========================================================================
// 函数: 按键处理函数
// 描述: 判断按键的长按和短按
// 参数: 无
// 返回: 无
// 备注:
//========================================================================
void Key_Proc()
{
if(Key_Slow_Dowm)return; //按键减速用于消抖
Key_Slow_Dowm = 1;
// Key_State = Key_Val;
Key_Val = Key_Read(); //读取按键值
Key_Down=Key_Val&(Key_Val^Key_Old); //按键的下降沿
Key_Up=~Key_Val&(Key_Val^Key_Old); //按键的上升沿
Key_Old=Key_Val; //按键的长按
if(Key_Down==1) //按键1按下
{
Key_Time_Flag=1; //按键计时标志置1
}
if(Key_Time500ms<500) //按键按下如果小于500ms判断为短按
{
if(Key_Up==1) //如果按键已松开
{
Key_Time_Flag=Key_Time500ms=0; //清0计时标志和计时变量
Key_State = Key_Single; //按键状态标记为短按
// Rotary_Read_Data++;
}
}
else
{
if(Key_Old==1) //如果按键按下超过500ms还没有松开则判断为长按
{
Key_State = Key_Long;
// Rotary_Read_Data++;
}
if(Key_Up==1) //如果按键松开清除按下标志和按键计时变量
Key_Time_Flag=Key_Time500ms=0;
}
}
void main()
{
P_SW2 |= 0x80; //访问XSFR
P0M0 = 0; P0M1 = 0;
P1M0 = 0; P1M1 = 0;
P2M0 = 0; P2M1 = 0;
P3M0 = 0; P3M1 = 0;
P4M0 = 0; P4M1 = 0;
P5M0 = 0; P5M1 = 0;
EA = 1;
Timer0_Init();
Seg_Init();
Rotary_Init();
while(1)
{
Key_Proc();
Rotary_Scan();
SEG_BUF[0] = Key_State;
SEG_BUF[1] = Rotary_Read_Data/10%10;
SEG_BUF[2] = Key_State1;
}
}
//========================================================================
// 函数: 定时器0中断服务函数
// 描述: 通过中断服务函数实现数码管显示扫描和按键的捎抖
// 参数: 无
// 返回: 无
// 备注:
//========================================================================
void Timer0_Isr(void) interrupt 1
{
if(++Key_Slow_Dowm==10)Key_Slow_Dowm=0;
if(++Dis_Index==3)
{
Dis_Index=0;
}
Seg_Display(SEG_BUF[Dis_Index],Dis_Index,SEG_Point[Dis_Index]);
if(Key_Time_Flag) //
{
if(++Key_Time500ms>=600)Key_Time500ms=600;
}
}
|
|