ZIJIN_CHJ 发表于 2026-5-2 08:33:30

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



第一步数码管显示


神农鼎 发表于 2026-5-2 09:58:30



用【STCAI-万能实验板】做实验,DIY 拿奖励,500元/人,前20名 ! - 做实验拿奖励@STCAI万能板,500元 国芯人工智能技术交流网站 - AI32位8051交流社区

STCAI-万能实验板-V2.3,支持 封装形式/接口:
LQFP48, LQFP32,DFN8;
TSSOP28/24/20/16/14;
SOP28/24/20;
WSOP16/8;
SOP16/8;
SOT23-6/5/4/3;
DIP40/28/20/16/8;
贴片 电阻 / 电容 也可直接焊在插件的2个焊盘之间;
TF卡 插座,FPC接口;
FPC焊接/插座支持间距:
0.5mm、0.62mm、0.65mm、0.7mm、0.8mm


www.STCAIMCU.com, 论坛注册网友,
使用 STC强大的 Ai8051U 取代 经典的 STC89C52 系列,
在 STCAI-万能实验板 上设计各种实验取代传统实验箱,
或 STC8H8K64U, STC32G12K128, 各种丰富的应用,
开源程序和原理图,在 www.STCAIMCU.com 开源 !
上传视频及各种图片,并发表到 B站 等:
前   1 ~ 20名   优秀积极 参与者, 可获得 500元 的奖励 !
前 21 ~ 50名   优秀积极 参与者, 可获得 300元 的奖励 !
前 50 ~ 100名 优秀积极 参与者, 可获得 200元 的奖励 !

ZIJIN_CHJ 发表于 2026-5-2 08:36:05

/*-------------
利用擎天柱搭建学习板做试验,主控芯片AI8051U,数码管用4位共阳数码管显示,
----------------*/
#include "CONFIG.H"

u8 SEG_BUF = {11,11,11};        //数码管显示数组默认不显示
u8 SEG_Point[] = {0,0,0};        //小数点显示数组,0 - 不显示,1 - 显示.
u8 Dis_Index = 0;                        //数码管扫描索引

void Timer0_Init(void)                //1000微秒@24.000MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器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;
       
        Timer0_Init();
        Seg_Init();
        EA = 1;
       
        while(1)
        {
                SEG_BUF = 1;
                SEG_BUF = 2;
                SEG_BUF = 3;
        }
}

void Timer0_Isr(void) interrupt 1
{
        if(++Dis_Index==3)
        {
                Dis_Index=0;
               
        }
        Seg_Display(SEG_BUF,Dis_Index,SEG_Point);
}

ZIJIN_CHJ 发表于 2026-5-2 08:39:07

#include "SEG.H"

sbit P_COM1 = P4^0;
sbit P_COM2 = P4^5;
sbit P_COM3 = P4^6;

sbit P_SEGA = P0^2;
sbit P_SEGB = P0^0;
sbit P_SEGC = P0^6;
sbit P_SEGD = P0^4;
sbit P_SEGE = P0^3;
sbit P_SEGF = P0^1;
sbit P_SEGG = P0^7;
sbit P_SEGH = P0^5;

u8 code SEG_TABLE[] = {
0xa0,    /*"0", 0 */
0xbe,    /*"1", 1 */
0x62,    /*"2", 2 */
0x2a,    /*"3", 3 */
0x3c,    /*"4", 4 */
0x29,    /*"5", 5 */
0x21,    /*"6", 6 */
0xba,    /*"7", 7 */
0x20,    /*"8", 8 */
0x28,    /*"9", 9 */
0x7F,    /*"-", 10 */
0xFF,    /*" ", 11 */

};

u8 Seg_Addr={0x01,0x20,0x40};        //数码管位码显示数组

void Seg_Init()
{
        P0M0 = 0x00; P0M1 = 0x00;                 //P0口准双向口
        P4M0 = 0x61; P4M1 = 0x00;       //P4口 推挽输出
       
        P_COM1 = 0;
        P_COM2 = 0;
        P_COM3 = 0;
       
        P0 = 0xFF;
}

void Seg_Display(dat,addr,point)
{
        Seg_Init();
       
        P4 |= Seg_Addr;
        if(point == 1)
        {
                P0 = SEG_TABLE & 0xDF;
               
        }
        else
        {
                P0 = SEG_TABLE;
        }
}

狂热主宰 发表于 2026-5-2 14:24:12

可尝试使用


根据接线程度选择和裁剪

ZIJIN_CHJ 发表于 2026-5-2 18:53:24

第二步,旋转编码器,


#include "CONFIG.H"

sbit Rotary_A = P3^7;
sbit Rotary_B = P3^6;

int Rotary_Read_Data;                 //旋转编码器数据缓存

u8 SW_Tmp;                        //旋转编码器的4种状态
u8 SW_Tmp0;
u8 SW_Tmp1;
u8 SW_Tmp2;

#define         KEYINPUT P32                //按键输入为P32

#define         KEY_State00       //按键的状态0---3,4种状态
#define         KEY_State11      
#define         KEY_State22      
#define         KEY_State33      

//========================================================================
// 函数: 旋转编码器初始化函数
// 描述:
// 参数:
// 返回:
// 备注:
//========================================================================
void Rotary_Init()
{
        P3M0 &= ~0xc4; P3M1 &= ~0xc4;

        SW_Tmp = P3 & 0xC0;
        SW_Tmp0 = SW_Tmp;
        SW_Tmp1 = SW_Tmp;
        SW_Tmp2 = SW_Tmp;
}
//========================================================================
// 函数: 旋转编码器扫描函数
// 描述: 通过4个变量存储编码器的4种状态来判断旋转编码器的旋转方向
// 参数: 无
// 返回: 无
// 备注:
//========================================================================

void Rotary_Scan()
{
        SW_Tmp2 = SW_Tmp1;
        SW_Tmp1 = SW_Tmp0;
        SW_Tmp0 = P3 & 0xC0;
        if((SW_Tmp2 == SW_Tmp1) && (SW_Tmp2 == SW_Tmp0))        //连续三次采样结果相同
        {
                SW_Tmp = (SW_Tmp ^ SW_Tmp0) & SW_Tmp;
                if((SW_Tmp & 0x80) != 0)
                {
                        if((SW_Tmp0 & 0x40) != 0)
                        {
                                Rotary_Read_Data++;
                        }
                        else Rotary_Read_Data--;
                }
                SW_Tmp = SW_Tmp0;
        }
}

ZIJIN_CHJ 发表于 2026-5-2 18:55:55




旋转编码器正转数字增加,反转数字减小

ZIJIN_CHJ 发表于 2026-5-2 18:58:14

第三步是按键功能

ZIJIN_CHJ 发表于 2026-5-2 21:25:04

ZIJIN_CHJ 发表于 2026-5-2 18:53
第二步,旋转编码器,




这个旋转编码器扫描函数是按照梁工的代码写的,以前学的代码发现有失步的情况,梁工这个代码又简洁又清析,非常完美.

ZIJIN_CHJ 发表于 2026-5-4 07:52:32

狂热主宰 发表于 2026-5-2 14:24
可尝试使用




这个可以好,可以试试
页: [1] 2 3
查看完整版本: 擎天柱@AI8051U核心板,搭建学习板做试验