找回密码
 立即注册
楼主: oc***

【实验箱已收到】STC32位8051单片机_学习打卡心得

[复制链接]
  • TA的每日心情
    慵懒
    15 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 2024-3-12 16:27:47 | 显示全部楼层
    第十三集 上
    回顾,理清程序的逻辑思路。
    应用模块化编程
    重要的函数添加说明

    修饰符 extern 用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

    bdata位寻址变量的使用


    截图202403121619381785.jpg

    这里冲哥声明的
    截图202403121621399314.jpg

    输出led状态赋值为何还是SEG_SEG 不应该是LED的寄存器组吗
    按照视频写就只显示数码管LED不会亮
    把标注部分改成led所在的寄存器就可以点亮
    可能是因为我的板子有点不一样,再研究研究

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    15 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 2024-3-13 10:41:52 | 显示全部楼层
    十三集中 简单定时器多任务
    alt+shift 快捷键部分选择
    bdata位寻址变量的使用
    按键的逻辑分析

    截图202403131039588136.jpg

    按键分析

    按键分析


    截图202403131041117473.jpg



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    15 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 2024-3-13 11:53:40 | 显示全部楼层
    十三集下,完善按键的模块化编程

    按键未按下
    消抖
    单击
    单击结束
    长按3秒
    长按结束
    按键松开

    几种状态
    1. #include "key.h"
    2. u16 Count[8] = {0,0,0,0,0,0,0};
    3. u8 LastState = 0;                                        //8位变量
    4. void KEY_Deal(void)                    //检查所有按键的状态,10ms计数一次
    5. {
    6.         u8 i = 0;
    7.         for(i=0;i<8;i++)                                 //循环8次,i范围0-7.代表按键状态
    8.         {
    9.                 if(~KEY&(1<<i))                                //如果持续按下,变量+1     & 全1 输出1
    10.                 {
    11.                         if(Count[i]<60000)
    12.                         Count[i] ++;                                        //按键按下,计数+1
    13.                 }
    14.                 else                                                                        //按键松开变量清0
    15.                 {
    16.                         if(Count[i]>0)                                                  //如果变量按下过
    17.                         {
    18.                                 LastState |= (1<<i);                                //这个变量相应的标志位置位
    19.                         }
    20.                         else
    21.                         {
    22.                                 LastState &= ~(1<<i);                                //这个变量相应的标志位清0
    23.                         }
    24.                         Count[i] = 0;                                ////按键松开,计数变量清0
    25.                 }
    26.         }
    27. }
    28. u8 KEY_ReadState(u8 keynum)//读取指定按键的状态
    29. {
    30.         if(Count[keynum]>0)                                        //按键是按下的各种状态返回
    31.         {
    32.                         if(Count[keynum]<3)                        //按下<30ms 返回消抖
    33.                         {
    34.                                 return KEY_FILC;
    35.                         }
    36.                         else if(Count[keynum]==3) //按下正好30ms 返回单机
    37.                         {
    38.                                 return KEY_PRESS;
    39.                         }
    40.                         else if(Count[keynum]<300) //按下不到300ms 返回单机结束
    41.                         {
    42.                                 return KEY_PRESSOVER;
    43.                         }
    44.                         else if(Count[keynum]==300) //按下不到3000ms 返回长安状态
    45.                         {
    46.                                 return KEY_LONGPRESS;
    47.                         }
    48.                         else                                                                                //长安结束
    49.                         {
    50.                                 return KEY_LONGOVER;
    51.                         }
    52.         }
    53.         else                                                                                //按键已经松开 各种状态返回
    54.         {
    55.                 if(LastState &(1<<keynum))                                                                        //按键按下过
    56.                 {
    57.                         return KEY_RELAX;
    58.                 }
    59.                 else                                                                        //按键之前没有按下
    60.                 {
    61.                         return KEY_NOPRESS;
    62.                 }
    63.         }
    64. }
    复制代码
    这个是主函数中执行的

    主函数中的循环

    主函数中的循环


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    15 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 2024-3-22 09:28:34 | 显示全部楼层
    十四集,矩阵按键
    先了解了矩阵按键的原理
    用switch语句来显示键码
    通过密码锁项目来实现矩阵按键的功能
    截图202403220927526545.jpg

    下面是部分代码
    1.    KEY_NUM = MateixKEY_Read();                                                        //当前矩阵按键的键值
    2.                         if( KEY_NUM>0 )                                                                                //如果有按键拿下
    3.                         {
    4.                                 BEEP_ON(2);                                                                                //蜂鸣20ms
    5.                                 Show_Tab[KEY_Str] = KEY_NUM;                                        //将当前的按键的键值保存到数码管显示变量里
    6.                                 KEY_Str ++;                                                                                //s输入的密码位数+1
    7.                                
    8.                                 if( KEY_Str == 8 )                                                                //如果密码已经输到了8位
    9.                                 {
    10.                                         KEY_Str = 0;                                                                //清空当前密码的位数
    11.                                         //for
    12.                                         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))        //如果密码正确
    13.                                         {
    14.                                                 LED0  = 0;                                                                //点亮LED0
    15.                                         }
    16.                                         else
    17.                                         {
    18.                                                 BEEP_ON(200);                                                        //密码错误,蜂鸣2秒
    19.                                         }
    20.                                         SEG0 = SEG1 = SEG2 = SEG3 = SEG4 = SEG5 =SEG6 = SEG7 = 21;         //将所有的数码管显示位 -
    21.                                 }
    22.                                 KEY_NUM = 0;                                                                        //清空按键键值
    23.                         }
    复制代码



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    15 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 2024-3-25 10:11:44 | 显示全部楼层
    十五集 外部中断
    根据手册中的打开关闭寄存器通道来写外部中断
    熟悉了外部中断的作用和使用方法
    这是外部中断0 INT0 的结构
    截图202403250954153834.jpg

    IT0:外部中断源0触发控制位。IT0=0,上升沿或下降沿均可触发外部中断0。

    IT0=1,下降沿触发方式。

    截图202403251006544108.jpg

    硬件可以自动清零,还是要手动清一下,防止上电就进入中断
    截图202403251004181081.jpg

    EX0=1;
    1. void INT0_Init(void)                                //外部中断0的初始化
    2. {
    3.         IT0 = 1;                                                //1:下降沿中断   0:上升下降沿中断
    4.         EX0 = 1;                                                //允许中断
    5.         IE0 = 0;                                                //清除中断标志位
    6. }
    复制代码


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 56 天

    [LV.5]常住居民I

    8

    主题

    101

    回帖

    460

    积分

    中级会员

    积分
    460
    发表于 2024-3-25 20:54:27 | 显示全部楼层
    看起来好厉害的样子!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    15 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 2024-3-26 09:58:03 | 显示全部楼层
    电子爱好者2024 发表于 2024-3-25 20:54
    看起来好厉害的样子!

    都是看视频跟写,还是得练
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 56 天

    [LV.5]常住居民I

    8

    主题

    101

    回帖

    460

    积分

    中级会员

    积分
    460
    发表于 2024-3-28 22:15:34 | 显示全部楼层
    练得怎么样了,达到什么水平了?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    15 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 2024-3-29 09:30:55 | 显示全部楼层
    电子爱好者2024 发表于 2024-3-28 22:15
    练得怎么样了,达到什么水平了?

    上次学的用定时器多任务来优化电磁炉程序还没写出来呢
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 56 天

    [LV.5]常住居民I

    8

    主题

    101

    回帖

    460

    积分

    中级会员

    积分
    460
    发表于 2024-3-29 21:59:45 | 显示全部楼层
    比我厉害,我现在程序编程还没弄明白
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-29 23:46 , Processed in 0.072097 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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