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

STC32G核心板学习记录

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-7 09:00:04 | 显示全部楼层
学习冲哥32G视频

第5集 C语言运算符和进制数入门

学习了printf 函数的格式化输出(如 % d、% f、% x 等格式字符)和转义字符的讲解,解决了 “如何精准输出数据与字符” 的实际问题,尤其是针对不同系统回车符差异的说明,让我意识到编程细节对兼容性的影响;进制数部分明确了 2 进制、10 进制、16 进制的对应关系,为后续寄存器配置(常用 16 进制)、位运算操作(基于 2 进制)打下基础;算术运算符、位运算符与数据类型的讲解,则构建了 “数据存储 - 运算处理” 的基本逻辑。

疑问:8进制在中间有何特殊意义?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-7 09:43:02 | 显示全部楼层
学习冲哥32G视频

第6集    LED闪烁和花式点灯

     学习了关于Delay函数实现 LED 闪烁的原理,明确了 “1 秒 = 1000 毫秒 = 1000000 微秒” 的时间换算关系,通过do-while与while循环的对比示例,清晰理解了两种循环的执行逻辑(do-while先执行后判断,while先判断后执行)。
     delay_ms函数中通过MAIN_Fosc(系统主频)计算循环次数的设计,让我意识到延时精度与硬件主频直接相关,这种 “硬件参数 + 软件逻辑” 的结合方式,是单片机编程的关键思路。成功实现 LED 闪烁后,也掌握了 “电平翻转 + 延时” 的基础逻辑,为后续实现跑马灯、流水灯等花式点灯功能打下了相关基础。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-7 16:34:33 | 显示全部楼层
学习冲哥32G视频

第7集    按键点灯

学习了按键的种类,按键的接线方法,数组的定义方法
按键线路最好上拉到VCC
编程时要考虑按键的防抖。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-7 17:00:41 | 显示全部楼层


学习冲哥32G视频

第8集   蜂鸣器应用

冲哥带我们清晰区分蜂鸣器类型,筑牢应用基础:课程开篇明确了有源与无源蜂鸣器的核心差异 —— 有源蜂鸣器内置震荡源,通直流即可发声;无源蜂鸣器无震荡源,需输入交流信号驱动。这一区分让我避免了 “通电能响就是有源” 的认知误区,也为后续选型提供了依据:若需简单发声(如提示音),可选有源蜂鸣器简化代码;若需控制音调(如音乐播放),则需无源蜂鸣器配合脉冲信号。
控制原理简洁易懂,衔接前序知识:蜂鸣器的控制逻辑延续了 GPIO 口电平控制的核心思路,通过 P54 引脚输出高低电平实现开关 —— 低电平打开、高电平关闭,配合三极管驱动电路,确保蜂鸣器获得足够驱动电流。这种 “引脚电平控制 + 外围驱动电路” 的模式,与之前 LED 控制的硬件逻辑一致,让我快速实现了知识迁移,降低了学习难度。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-8 08:14:36 | 显示全部楼层
学习冲哥32G视频

第9集   数码管的静态使用

认识了各种类型的数码管,了解了它们的应用场景非常广泛,一些电动车、充电宝等都有类似的应用
学习了共阴极和共阳极数码管的接线方法,我更趋向于共阳极的接线方法。
学习了其控制原理,学习了码表,码表中 dp 位默认是 1(熄灭),若要显示小数点(如 0.),只需将对应段码的 dp 位改为 0,比如数字 0 带小数点的段码是0x40(二进制 01000000,dp=0,其余段不变)。
码表的核心是 “引脚 - 段 - 电平” 的对应关系,若硬件中引脚与段的对应关系变了(如 P60 对应 g 段),码表数值也需要同步调整。
数码管标准字库定义
u8 code t_display[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-8 15:05:37 | 显示全部楼层
学习冲哥32G视频  https://www.stcaimcu.com/thread-323-1-1.html

第10集    数码管的动态编程


静态显示只需 “段码到位即亮”,而动态显示需要先明确硬件接线规则(段脚并联、位脚独立),再匹配软件逻辑:

若数码管为共阳极,位脚低电平选通、段脚低电平点亮;若为共阴极则相反,硬件接线错误会直接导致 “全亮 / 全灭 / 显示乱码”;

实操中我曾因位脚接线顺序错误(第 1 位接 P0.1 而非 P0.0),导致数字显示顺序颠倒,这让我意识到 “硬件接线表必须与代码中位脚定义完全一致”。

动态显示的 “闪烁问题” 是调试重点,我通过多次测试总结出关键规律:

单 Digit 点亮时间:1-5ms 最优(2ms 兼顾亮度与无闪烁);
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-8 15:09:51 | 显示全部楼层
学习冲哥32G视频  https://www.stcaimcu.com/thread-323-1-1.html

第11集    定时器学习笔记



关键寄存器如下

MOD              定时器模式选择        低 4 位控制 T0,高 4 位控制 T1
THx/TLx        计数器高 / 低 8 位初始值        定时时间核心参数,需手动重装
ETx             定时器中断使能        1 = 开启,0 = 关闭
EA            总中断开关        必须置 1,否则所有中断无效
TRx    定时器运行控制        1 = 启动计数,0 = 停止
12T/1T 模式区分:1T 模式下机器周期 = 1 / 主频,相同定时时间所需初始值更小(如 24MHz 1T 模式,1ms 需计数 24000 次,初始值 = 65536-24000=41536);
自动重装模式优势:模式 2(8 位自动重装)无需在中断中重置 THx/TLx,适合高频触发场景(如 100Hz 刷新)。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-8 15:13:01 | 显示全部楼层
学习冲哥32G视频  https://www.stcaimcu.com/thread-323-1-1.html

第12集    计数器学习笔记


STC32G 的 T0/T1 计数器支持两种触发沿选择:
下降沿触发:外部引脚电平从高→低时,计数器加 1(默认模式);
上升沿触发:外部引脚电平从低→高时,计数器加 1(需通过寄存器配置)

配置案例
  1. u16 count_num = 0; // 存储总计数次数
  2. // 定时器0(计数器模式)初始化:下降沿触发,16位模式
  3. void Timer0_Counter_Init(void){
  4.     // 步骤1:配置引脚模式(P3.4为输入模式,接收外部脉冲)
  5.     P3M0 &= ~(1<<4);
  6.     P3M1 &= ~(1<<4); // P3.4设为准双向口(默认输入)
  7.    
  8.     // 步骤2:配置定时器/计数器模式(T0为计数器模式,模式1)
  9.     TMOD &= 0xF0;    // 清空T0模式位
  10.     TMOD |= 0x05;    // T0:计数器模式(bit4=1)+ 模式1(bit0-1=01)
  11.    
  12.     // 步骤3:选择触发沿(默认下降沿,无需额外配置;上升沿需改TCON)
  13.     // TCON &= ~0x01; // 下降沿(默认);TCON |= 0x01 为上升沿
  14.    
  15.     // 步骤4:设置计数初始值(从0开始计数)
  16.     TH0 = 0x00;      
  17.     TL0 = 0x00;
  18.    
  19.     // 步骤5:开启计数器中断
  20.     ET0 = 1;         // 使能T0中断
  21.     EA = 1;          // 开启总中断
  22.     PT0 = 0;         // 低优先级中断
  23.    
  24.     // 步骤6:启动计数器
  25.     TR0 = 1;         // 启动T0计数(开始检测外部脉冲)
  26. }
  27. // 定时器0中断服务函数(计数溢出触发)
  28. void Timer0_ISR(void) interrupt 1{
  29.     // 16位模式无自动重装,溢出
复制代码
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-8 15:19:03 | 显示全部楼层
学习冲哥32G视频  https://www.stcaimcu.com/thread-323-1-1.html

第13集    多任务处理笔记

我理解的多任务,就是“同时实现多个功能” 的需求(比如一边数码管显示、一边按键检测、一边蜂鸣器提示);

中断适用于 “需要精准响应、不能延迟” 的任务(如数码管刷新、按键防抖、紧急报警),

核心是用中断抢占 CPU 资源,执行完中断服务函数后返回主任务


合理设置中断优先级:关键任务(如紧急任务)设高优先级,普通任务设低优先级。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-8 17:22:56 | 显示全部楼层
学习冲哥32G视频  https://www.stcaimcu.com/thread-323-1-1.html

第13集    矩阵按键学习笔记


列引脚(P15、P17)外接 10KΩ 上拉电阻(R18、R19),确保无按键时列引脚保持高电平;
行引脚串联 100Ω 限流电阻(R14-R17),保护 I/O 口。

行引脚依次输出低电平,其余行保持高电平;
检测列引脚电平,若某列电平由高变低,即可确定 “当前行 + 当前列” 对应的按键被按下;
结合消抖(延时 10-20ms),可避免机械抖动导致的误判。
  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/usb.h"
  3. #include "seg_led.h"
  4. #include "key.h"
  5. #include "beep.h"
  6. #include "tim0.h"
  7. #define MAIN_Fosc 24000000UL        //定义主时钟
  8. char *USER_DEVICEDESC = NULL;
  9. char *USER_PRODUCTDESC = NULL;
  10. char *USER_STCISPCMD = "@STCISP#";
  11. bit  TIM_10MS_Flag;                        //10ms的标志位
  12. void sys_init();        //函数声明
  13. void delay_ms(u16 ms);        //unsigned int
  14. void main()                                        //程序开始运行的入口
  15. {
  16.         u8 KEY_NUM = 0;                        //保存矩阵按键的键码
  17.         u8 KEY_Str = 0;                        //表示当前输入了几个密码位
  18.        
  19.         sys_init();                                //USB功能+IO口初始化
  20.         usb_init();                                //usb库初始化
  21.         Timer0_Init();
  22.         EA = 1;                                        //CPU开放中断,打开总中断。
  23.        
  24. //        SEG0 = 0;
  25. //        SEG1 = 1;
  26. //        SEG2 = 2;
  27. //        SEG3 = 3;
  28. //        SEG4 = 4;
  29. //        SEG5 = 5;
  30. //        SEG6 = 6;
  31. //        SEG7 = 7;
  32.        
  33.         LED = 0xff;                                //初始状态熄灭所有LED
  34.        
  35.         while(1)                //死循环
  36.         {
  37.                 if( DeviceState != DEVSTATE_CONFIGURED )         //
  38.                         continue;
  39.                 if( bUsbOutReady )                                                               
  40.                 {
  41.                         usb_OUT_done();
  42.                 }
  43.                
  44.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  45.                 {
  46.                         TIM_10MS_Flag = 0;                                                                        //清空标志位
  47. //                        KEY_Deal();                                                                                        //按键处理
  48.                         BEEP_RUN();                                                                                        //蜂鸣运行
  49.                        
  50. //                        if( KEY_ReadState( KEY1 ) == KEY_PRESS )                        //判断K1按钮是否单击
  51. //                        {
  52. //                                BEEP_ON(2);                                                                                //蜂鸣50ms
  53. //                                LED0 = 0;                                                                                //点亮LED0
  54. //                        }
  55. //                        else if( KEY_ReadState( KEY1 ) == KEY_LONGPRESS )        //判断K1按钮是否长按
  56. //                        {
  57. //                                LED1 = 0;                                                                                //点亮LED1
  58. //                        }
  59. //                        else if( KEY_ReadState( KEY1 ) == KEY_RELAX )                //判断K1按钮是否松开
  60. //                        {
  61. //                                BEEP_ON(2);                                                                                //蜂鸣50ms
  62. //                                LED = 0xff;                                                                                //led全部熄灭
  63. //                        }
  64. //                       
  65. //                        if( KEY_ReadState( KEY2 ) == KEY_PRESS )                        //判断K2按钮是否单击
  66. //                        {
  67. //                               
  68. //                        }
  69.                         KEY_NUM = MateixKEY_Read();                                                        //当前矩阵按键的键值
  70.                         if( KEY_NUM>0 )                                                                                //如果有按键拿下
  71.                         {
  72.                                 BEEP_ON(2);                                                                                //蜂鸣20ms
  73.                                 Show_Tab[KEY_Str] = KEY_NUM;                                        //将当前的按键的键值保存到数码管显示变量里
  74.                                 KEY_Str ++;                                                                                //s输入的密码位数+1
  75.                                
  76.                                 if( KEY_Str == 8 )                                                                //如果密码已经输到了8位
  77.                                 {
  78.                                         KEY_Str = 0;                                                                //清空当前密码的位数
  79.                                         //for
  80.                                         if((Show_Tab[0]==1)&&(Show_Tab[1]==1)&&(Show_Tab[2]==1)&&(Show_Tab[3]==1)&&(Show_Tab[4]==1)&&(Show_Tab[5]==1)&&(Show_Tab[6]==1)&&(Show_Tab[7]==1))        //如果密码正确
  81.                                         {
  82.                                                 LED0  = 0;                                                                //点亮LED0
  83.                                         }
  84.                                         else
  85.                                         {
  86.                                                 BEEP_ON(200);                                                        //密码错误,蜂鸣2秒
  87.                                         }
  88.                                         SEG0 = SEG1 = SEG2 = SEG3 = SEG4 = SEG5 =SEG6 = SEG7 = 21;         //将所有的数码管显示位 -
  89.                                 }
  90.                                 KEY_NUM = 0;                                                                        //清空按键键值
  91.                         }
  92.                 }
  93.         }
  94. }
  95. void Timer0_Isr(void) interrupt 1
  96. {
  97.         static timcount = 0;
  98.        
  99.         SEG_LED_Show();                        //数码管刷新的
  100.        
  101.         timcount++;                                //1ms+1
  102.         if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
  103.         {
  104.                 timcount = 0;
  105.                 TIM_10MS_Flag = 1;        //10ms时间到了
  106.         }
  107. }
  108. void sys_init()                //函数定义
  109. {
  110.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  111.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  112.     CKCON = 0; //提高访问XRAM速度
  113.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  114.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  115.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  116.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  117.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  118.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  119.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  120.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  121.        
  122.     P3M0 = 0x00;
  123.     P3M1 = 0x00;
  124.    
  125.     P3M0 &= ~0x03;
  126.     P3M1 |= 0x03;
  127.     //设置USB使用的时钟源
  128.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  129.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  130.     USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
  131.     USBCON = 0x90;
  132. }
  133. void delay_ms(u16 ms)        //unsigned int
  134. {
  135.         u16 i;
  136.         do
  137.         {
  138.                 i = MAIN_Fosc/6000;
  139.                 while(--i);
  140.         }while(--ms);
  141. }
复制代码

疑惑:如何添加密码删除、清空等功能?
截图202601081714044157.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-12 18:02 , Processed in 0.116810 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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