擎天柱@AI8051U核心板,搭建学习板做试验
第一步数码管显示
用【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元 的奖励 !
/*-------------
利用擎天柱搭建学习板做试验,主控芯片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);
} #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;
}
}
可尝试使用
根据接线程度选择和裁剪
第二步,旋转编码器,
#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:53
第二步,旋转编码器,
这个旋转编码器扫描函数是按照梁工的代码写的,以前学的代码发现有失步的情况,梁工这个代码又简洁又清析,非常完美. 狂热主宰 发表于 2026-5-2 14:24
可尝试使用
这个可以好,可以试试