找回密码
 立即注册
楼主: ZIJIN_CHJ

擎天柱@AI8051U核心板,搭建学习板做试验

[复制链接]
已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 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;
        }
}

回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-5 08:57:44 | 显示全部楼层
ZIJIN*** 发表于 2026-5-5 08:56
/*-------------
利用擎天柱搭建学习板做试验,主控芯片AI8051U,系统时钟24M,数码管用4位共阳数码管显示,旋 ...

按键的长按和短按判断
回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-5 09:01:10 | 显示全部楼层

回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-5 09:02:01 | 显示全部楼层

短按显示1,长按显示3
回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-13 15:48:06 | 显示全部楼层

回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-13 18:58:30 | 显示全部楼层

这个是LED流水灯,按键长按开关流水灯,短按切换模式,现在是流水灯不启动,按键正常切换,
流水灯启动已后,按键都不管用了,是不是流水灯的延时函数影响了按键的动作.
回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-13 19:02:30 | 显示全部楼层
ZIJIN*** 发表于 2026-5-13 18:58
这个是LED流水灯,按键长按开关流水灯,短按切换模式,现在是流水灯不启动,按键正常切换,
流水灯启动已后,按 ...

void Led_Proc()
{
        static u8 cnt = 0xFE;
       
        if(Led_Enable)
        {
                switch(Led_Mode)
                {
                        case 0:
                                cnt = _crol_(cnt,1);
                                P2 = cnt;
                                DelayXms(500);
                        break;
                        case 1:
                                cnt = _cror_(cnt,1);
                                P2 = cnt;
                                DelayXms(500);
                        break;
                        case 2:
                               
                        break;
                        case 3:
                               
                        break;
                }
        }               
}
回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-13 19:07:24 | 显示全部楼层
ZIJIN*** 发表于 2026-5-13 19:02
void Led_Proc()
{
        static u8 cnt = 0xFE;

这是流水灯的代码,如果不用延时函数,怎么达到延时的目的?
回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-14 10:55:01 | 显示全部楼层

回复

使用道具 举报 送花

已绑定手机

7

主题

194

回帖

1690

积分

金牌会员

积分
1690
 楼主| 发表于 2026-5-14 11:00:10 | 显示全部楼层

流水灯 的4种模式,按键长按"开/关"流水灯.按键短按选择显示模式0--3.分别用数码管显示.利用定时器进行延时.
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-19 21:07 , Processed in 0.073569 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表