找回密码
 立即注册
楼主: 四汐

STC32G跟着冲哥学习打卡篇:(1~14)矩阵按键和密码锁

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-06 09:32:58
已绑定手机

31

主题

113

回帖

1686

积分

荣誉版主

Rbowlystar

积分
1686
发表于 2023-12-3 21:38:08 | 显示全部楼层
STC32G跟着冲哥学习打卡篇:(8)蜂鸣器

原来制作一个“电磁炉”如此简单!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-06 09:32:58
已绑定手机

31

主题

113

回帖

1686

积分

荣誉版主

Rbowlystar

积分
1686
发表于 2023-12-4 00:58:36 | 显示全部楼层
本帖最后由 四汐 于 2023-12-4 01:02 编辑

STC32G跟着冲哥学习打卡篇:(9)数码管
单位数码管:


数码管共阴阳极_2023-12-03_23-46-04.png
四位数码管:
四位数码管_2023-12-03_23-48-34.png
开发板上的原理图:
四位数码管开发板原理图_2023-12-03_23-49-52.png
一位数码管显示0~9:
P6端口
0:0xc0
1:0xf9
2:0xa4
3:0xb0
4:0x99
5:0x92
6:0x82
7:0xf8
8:0x80
9:0x90
带小数点:
0:0x40
1:0x79
2:0x24
3:0x30
4:0x19
5:0x12
6:0x02
7:0x78
8:0x00
9:0x10

一位数码管显示0~9_2023-12-03_23-53-34.png
实现按键控制一位数码管的加减。
动态刷新显示4位数码管:
利用高刷新率,使人眼看起来是4个数码管同时亮起
动态刷新显示4位数码管_2023-12-04_00-16-38.png
数码管位码1~7位:

P7端口
1:0x7f
2:0xbf
3:0xdf
4:0xef
5:0xf7
6:0xfb
7:0xfd
8:0xfe
数码管位码_2023-12-04_00-25-03.png
数码管部分代码_2023-12-04_00-38-13.png

倒计时挑战程序:
123456789/100 000 000%10 = 1 //取亿位
123456789/010 000 000%10 = 2 //取千万位
123456789/001 000 000%10 = 3 //取百万位
123456789/000 100 000%10 = 4 //取十万位
123456789/000 010 000%10 = 5 //取万位
123456789/000 001 000%10 = 6 //取千位
123456789/000 000 100%10 = 7 //取百位
123456789/000 000 010%10 = 8 //取十位
123456789/000 000 001%10 = 9 //取个位




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-06 09:32:58
已绑定手机

31

主题

113

回帖

1686

积分

荣誉版主

Rbowlystar

积分
1686
发表于 2023-12-4 21:21:29 | 显示全部楼层
STC32G跟着冲哥学习打卡篇:(11)定时器
STC32G的定时器计数器有5个,

定时器的作用和意义_2023-12-04_20-49-23.png
32G的定时器计数器介绍_2023-12-04_20-51-25.png
有12T\1T模式选择:

1T:不分频,时间短但精度高。
32G的定时器分频模式介绍_2023-12-04_20-51-25.png
定时器的工作模式选择:
32G的定时器的工作模式1_2023-12-04_20-51-25.png 32G的定时器的工作模式2_2023-12-04_20-51-25.png
定时器的设置介绍:
32G的定时器的设置_2023-12-04_20-51-25.png

32G的定时器的设置2_2023-12-04_20-51-25.png


定时器频率的计算方法:
32G的定时器的频率计算方法_2023-12-04_20-51-25.png

中断号介绍:
32G的定时器的中断号1_2023-12-04_20-51-25.png 32G的定时器的中断号2_2023-12-04_20-51-25.png 32G的定时器的中断号3_2023-12-04_20-51-25.png


中断的频率越低越好!!!






回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-06 09:32:58
已绑定手机

31

主题

113

回帖

1686

积分

荣誉版主

Rbowlystar

积分
1686
发表于 2023-12-5 23:28:06 | 显示全部楼层
STC32G跟着冲哥学习打卡篇:(12)计数器

计数器的配置介绍:
计数器的配置介绍_2023-12-05_22-53-22.png
直流电机测速的应用。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-06 09:32:58
已绑定手机

31

主题

113

回帖

1686

积分

荣誉版主

Rbowlystar

积分
1686
发表于 2023-12-6 00:57:11 | 显示全部楼层
STC32G跟着冲哥学习打卡篇:(13)多任务处理【视频干货特别多!
模块化编程:
添加.c和.h文件。


添加函数头:

keil软件内找到Templates,右键添加configuration。

函数头_2023-12-05_23-33-13.png 函数头2_2023-12-05_23-33-13.png
创建程序文件:
新建文件并保存;添加文件到工程;添加引用路径。
引脚定义都放在.h文件;
函数定义、声明、调用。
修饰符 extern(动态变量,不可赋初值)
extern修饰符介绍_2023-12-05_23-40-56.png
修饰符 static(静态变量,可以赋初值):仅在第一次进入程序时赋值,后续再次进入该程序时,不重新赋值,沿用上次执行时变化的值。

位寻址变量 bdata
bdate位寻址变量的介绍_2023-12-05_23-42-58.png
bdate位寻址变量的应用_2023-12-05_23-42-58.png

可以使用尖括号(^)对一个8位数据的单独各个位进行定义!
学到一个特别实用的东西:使用一个中断程序,同时控制多种外设,而不冲突的方法
可以在一个中断程序内设置分段刷新,如下图的例子,10毫秒为一个循环,0~7毫秒刷新数码管显示,8毫秒刷新LED显示,其他时间重置数码管和LED显示。
由于10毫秒非常短,肉眼几乎无法分辨,所以就算是数码管和LED都公用一个P6端口,他们在显示的时候也可以互不冲突!
一个中断控制多种外设_2023-12-06_00-06-47.png
按键功能自定义:
按键功能_2023-12-06_00-20-56.png

强烈建立看视频学习!!!










回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-06 09:32:58
已绑定手机

31

主题

113

回帖

1686

积分

荣誉版主

Rbowlystar

积分
1686
发表于 2023-12-18 00:07:47 | 显示全部楼层
STC32G跟着冲哥学习打卡篇:(14)矩阵式按键

时隔多天,我又回来啦!

截图202312180001328520.jpg
(刚写完,目前没有发现什么太大的BUG,就是数码管熄灭之后重新点亮不能立马显示“-”,不过我觉得问题不大。如果大家发现其他什么BUG,欢迎回帖!互相学习!)
今天是来交作业的!话不多说,密码锁的课后练习主函数奉上:
  1. #include <intrins.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "stc32g.h"
  5. #include "stc32_stc8_usb.h"
  6. #include "Led_Seg.h"
  7. #include "Key.h"
  8. #include "Beep.h"
  9. #include "Timer.h"
  10. #define  MAIN_FOSC      24000000UL  //ISP下载时需将工作频率设置为24MHz
  11. char *USER_DEVICEDESC = NULL;
  12. char *USER_PRODUCTDESC = NULL;
  13. char *USER_STCISPCMD = "@STCISP#";       //不停电自动ISP下载命令
  14. bit TIME_10ms_flag;     //10ms的标志位
  15. void sys_init();           // 函数声明
  16. void delay_ms(u16 ms)
  17. {
  18.     u16 i;
  19.     do
  20.     {
  21.         i = MAIN_FOSC / 6000;
  22.         while(--i);
  23.     } while (--ms);
  24. }
  25. void Counter1_Init(void)    //
  26. {
  27.         TMOD = 0x50;                        //设置计数器模式
  28.         TL1 = 0x00;                                //设置计数器始值
  29.         TH1 = 0x00;                                //设置计数器始值
  30.         TF1 = 0;                                //清除TF1标志
  31.         TR1 = 1;                                //定时器1开始计时
  32.         ET1 = 1;                                //使能定时器1中断
  33.     P3PU = 0x20;            //打开P35内部上拉4.1K
  34. }
  35. void main()
  36. {
  37. //—————————————————主程序参数定义———————————————————————————//
  38. u8 KEY_NUM = 0;         //保存矩阵按键的键码
  39. u8 KEY_Str = 0;         //表示当前输入了几个密码位
  40. u16 LED_TIME = 0;       //门锁开启了多久
  41. u16 SEG_TIME = 0;       //数码管亮了多久
  42. bit DOOR_OPEN_Flag = 0; //0:关门 1:开门
  43. bit SEG_OPEN_Flag = 1;  //0:熄灭 1:显示
  44. u8 Password[8] = {1, 2, 3, 4, 5, 6, 7, 8};      //正确密码
  45. u8 i;   //密码判断for函数所使用的变量
  46. u8 Ture_flag = 0;   //正确的密码数量
  47. //—————————————————主程序参数初始化—————————————————————————//
  48. Timer0_Init();
  49. // SEG0 = 0;
  50. // SEG1 = 1;
  51. // SEG2 = 2;
  52. // SEG3 = 3;
  53. // SEG4 = 4;
  54. // SEG5 = 5;
  55. // SEG6 = 6;
  56. // SEG7 = 7;
  57. LED = 0xff;
  58.     //—————————————————以下为USB_CDC串口代码———————————————————//
  59.        
  60.     sys_init();        //使能USB功能
  61.     usb_init();        //USB初始化     //调用USB CDC初始化库函数
  62.     EUSB= 1;           //使能USB中断
  63.     EA= 1;             //总中断开
  64.     while(DeviceState != DEVSTATE_CONFIGURED);  //等待USB完成配置
  65.     while(1)
  66.     {
  67.                 //当硬件接收完成上位机通过串口助手发送数据后,会自动将bUsbOutReady置1
  68.                 //接收的数据字节数保存在OutNumber变量中,接收的数据保存在UsbOutBuffer缓冲区
  69.                 if(bUsbOutReady)   
  70.                 {
  71.                         //使用USB_SendData库函数可向上位机发送数据,这里的测试代码为将接收数据原样返回
  72.                         //USB_SendData(UsbOutBuffer,OutNumber);  
  73.                         //处理完成接收的数据后,调用usb_OUT_done准备接收下一笔数据
  74.                         usb_OUT_done();     
  75.             //——————在这里写代码,单片机接受到数据后才会执行———————//
  76.             
  77.         }
  78.         //—————————————————此处开始写代码———————————————————//
  79.         if(TIME_10ms_flag == 1)             //如果10ms到了
  80.         {
  81.             TIME_10ms_flag = 0;             //清空标志位
  82.             KEY_Deal();     //按键处理
  83.             BEEP_RUN();     //蜂鸣器运行
  84.             // if( KEY_ReadState(KEY1) == KEY_PRESS)               //判断KEY1是否单击
  85.             // {
  86.             //     BEEP_ON(2);     //蜂鸣50ms
  87.             //     LED0 = 0;       //点亮LED0
  88.             // }
  89.             // else if( KEY_ReadState(KEY1) == KEY_LONGPRESS)      //判断KEY1是否长按
  90.             // {
  91.             //     BEEP_ON(5);
  92.             //     LED1 = 0;   //点亮LED1
  93.             // }
  94.             // else if(KEY_ReadState(KEY1) == KEY_RELAX)           //判断KEY1是否松开
  95.             // {
  96.             //     BEEP_ON(2);     //蜂鸣50ms
  97.             //     LED = 0xff;     //LED全部熄灭
  98.             // }
  99.             KEY_NUM = MateixKEY_Read();     //当前矩阵按键的键值
  100.             if (KEY_NUM > 0)                            //如果有按键拿下
  101.                         {
  102.                                 BEEP_ON(2);                                         //蜂鸣20ms
  103.                                 SEG_Show_Tab[KEY_Str] = KEY_NUM; //将当前的按键的键值保存到数码管显示变量里
  104.                                 KEY_Str++;                                         //输入的密码位数+1
  105.                 SEG_OPEN_Flag = 1;
  106.                 SEG_TIME = 0;
  107.                
  108.                 if (KEY_Str == 8) //如果密码已经输到了8位
  109.                                 {
  110.                                         KEY_Str = 0; //清空当前密码的位数
  111.                                         // 用for循环的方式实现密码判断
  112.                     for ( i = 0; i < 8; i++)
  113.                     {
  114.                         if (SEG_Show_Tab[i] == Password[i])
  115.                         {
  116.                             Ture_flag++;
  117.                         }
  118.                     }
  119.                                         if (Ture_flag == 8) //如果密码正确
  120.                                         {
  121.                                                 LED0 = 0;       //点亮LED0
  122.                         DOOR_OPEN_Flag = 1;
  123.                         LED_TIME = 0;   //门开了之后重新计时
  124.                     }
  125.                                         else
  126.                                         {
  127.                                                 BEEP_ON(200); // 密码错误,蜂鸣2秒
  128.                                         }
  129.                                         SEG0 = SEG1 = SEG2 = SEG3 = SEG4 = SEG5 = SEG6 = SEG7 = 46; // 将所有的数码管显示位 -
  130.                     Ture_flag = 0;      //重置正确的密码数量
  131.                 }
  132.                                 KEY_NUM = 0; // 清空按键键值
  133.             }
  134.             //LED0(门锁)打开后,5S后自动关闭
  135.             if(DOOR_OPEN_Flag == 1)
  136.             {
  137.                 LED_TIME++;
  138.                 if (LED_TIME == 500)
  139.                 {
  140.                     LED_TIME = 0;
  141.                     DOOR_OPEN_Flag = 0;
  142.                     LED0 = 1;
  143.                 }
  144.             }
  145.             
  146.             //增加门内的手动开门按钮,按下按钮门锁打开
  147.             if( KEY_ReadState(KEY1) == KEY_PRESS)               //判断KEY1是否单击
  148.             {
  149.                 BEEP_ON(2);         //蜂鸣50ms
  150.                 LED0 = 0;       //点亮LED0
  151.                 DOOR_OPEN_Flag = 1;
  152.                 LED_TIME = 0;   //门开了之后重新计时
  153.             }
  154.             //10秒内没有输入密码,自动熄灭数码管,更加省电;按下时再显示
  155.             if (SEG_OPEN_Flag == 1)
  156.             {
  157.                 SEG_TIME++;
  158.                 if (SEG_TIME == 1000)
  159.                 {
  160.                     SEG0 = SEG1 = SEG2 = SEG3 = SEG4 = SEG5 = SEG6 = SEG7 = 74; //熄灭所有数码管
  161.                     KEY_Str = 0; //清空当前密码的位数
  162.                     SEG_OPEN_Flag = 0;
  163.                 }
  164.                
  165.             }
  166.             
  167.             
  168.         }
  169.         
  170.     }
  171. }
  172. void Timer0_Isr(void) interrupt 1     //1ms@24MHZ
  173. {
  174.     static timercount = 0;
  175.     SEG_LED_Show();             //数码管刷新的
  176.     timercount++;               //1ms +1
  177.     if( timercount >= 10)       //如果>=10,10ms计数到达
  178.     {
  179.         timercount = 0;
  180.         TIME_10ms_flag = 1;     //说明10ms时间到
  181.     }
  182. }
  183. // void Timer1_Isr(void) interrupt 3
  184. // {
  185. //     P60 = !P60;     //LED0取反
  186. // }
  187. void sys_init()
  188. {
  189.     WTST = 0;  // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  190.     EAXFR = 1; // 扩展寄存器(XFR)访问使能
  191.     CKCON = 0; // 提高访问XRAM速度
  192.     P0M1 = 0x30;        P0M0 = 0x30; // 设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  193.     P1M1 = 0x32;        P1M0 = 0x32; // 设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
  194.     P2M1 = 0x3c;        P2M0 = 0x3c; // 设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
  195.     P3M1 = 0x50;        P3M0 = 0x50; // 设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
  196.     P4M1 = 0x3c;        P4M0 = 0x3c; // 设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
  197.     P5M1 = 0x0c;        P5M0 = 0x0c; // 设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
  198.     P6M1 = 0xff;        P6M0 = 0xff; // 设置为漏极开路(实验箱加了上拉电阻到3.3V)
  199.     P7M1 = 0x00;        P7M0 = 0x00; // 设置为准双向口
  200.        
  201.         P3M0&= ~0x03;                //P3.0/P3.1和USB的D-/D+共用PIN脚,
  202.     P3M1|= 0x03;
  203.     // 设置USB使用的时钟源
  204.     IRC48MCR = 0x80; // 使能内部48M高速IRC
  205.     while (!(IRC48MCR & 0x01)); // 等待时钟稳定
  206.     USBCLK = 0x00; // 使用CDC功能需要使用这两行,HID功能禁用这两行。
  207.     USBCON = 0x90;
  208. }
复制代码

11_矩阵式按键_密码锁.zip

189.79 KB, 下载次数: 104

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-6 19:06 , Processed in 0.198662 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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