oce4n 发表于 2024-3-12 16:27:47

第十三集 上
回顾,理清程序的逻辑思路。
应用模块化编程
重要的函数添加说明

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

bdata位寻址变量的使用




这里冲哥声明的


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

oce4n 发表于 2024-3-13 10:41:52

十三集中 简单定时器多任务
alt+shift 快捷键部分选择
bdata位寻址变量的使用
按键的逻辑分析









oce4n 发表于 2024-3-13 11:53:40

十三集下,完善按键的模块化编程

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

几种状态
#include "key.h"

u16 Count = {0,0,0,0,0,0,0};
u8 LastState = 0;                                        //8位变量
void KEY_Deal(void)                  //检查所有按键的状态,10ms计数一次
{
        u8 i = 0;
        for(i=0;i<8;i++)                                 //循环8次,i范围0-7.代表按键状态
        {
                if(~KEY&(1<<i))                                //如果持续按下,变量+1   & 全1 输出1
                {
                        if(Count<60000)
                        Count ++;                                        //按键按下,计数+1
                }
                else                                                                        //按键松开变量清0
                {
                        if(Count>0)                                          //如果变量按下过
                        {
                                LastState |= (1<<i);                                //这个变量相应的标志位置位
                        }
                        else
                        {
                                LastState &= ~(1<<i);                                //这个变量相应的标志位清0
                        }
                        Count = 0;                                ////按键松开,计数变量清0
                }
        }
}
u8 KEY_ReadState(u8 keynum)//读取指定按键的状态
{
        if(Count>0)                                        //按键是按下的各种状态返回
        {
                        if(Count<3)                        //按下<30ms 返回消抖
                        {
                                return KEY_FILC;
                        }
                        else if(Count==3) //按下正好30ms 返回单机
                        {
                                return KEY_PRESS;
                        }
                        else if(Count<300) //按下不到300ms 返回单机结束
                        {
                                return KEY_PRESSOVER;
                        }
                        else if(Count==300) //按下不到3000ms 返回长安状态
                        {
                                return KEY_LONGPRESS;
                        }
                        else                                                                                //长安结束
                        {
                                return KEY_LONGOVER;
                        }
        }
        else                                                                                //按键已经松开 各种状态返回
        {
                if(LastState &(1<<keynum))                                                                        //按键按下过
                {
                        return KEY_RELAX;
                }
                else                                                                        //按键之前没有按下
                {
                        return KEY_NOPRESS;
                }
        }
}这个是主函数中执行的


oce4n 发表于 2024-3-22 09:28:34

十四集,矩阵按键
先了解了矩阵按键的原理
用switch语句来显示键码
通过密码锁项目来实现矩阵按键的功能


下面是部分代码
   KEY_NUM = MateixKEY_Read();                                                        //当前矩阵按键的键值
                        if( KEY_NUM>0 )                                                                                //如果有按键拿下
                        {
                                BEEP_ON(2);                                                                                //蜂鸣20ms
                                Show_Tab = KEY_NUM;                                        //将当前的按键的键值保存到数码管显示变量里
                                KEY_Str ++;                                                                                //s输入的密码位数+1
                               
                                if( KEY_Str == 8 )                                                                //如果密码已经输到了8位
                                {
                                        KEY_Str = 0;                                                                //清空当前密码的位数
                                        //for
                                        if((Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1))        //如果密码正确
                                        {
                                                LED0= 0;                                                                //点亮LED0
                                        }
                                        else
                                        {
                                                BEEP_ON(200);                                                        //密码错误,蜂鸣2秒
                                        }
                                        SEG0 = SEG1 = SEG2 = SEG3 = SEG4 = SEG5 =SEG6 = SEG7 = 21;         //将所有的数码管显示位 -
                                }
                                KEY_NUM = 0;                                                                        //清空按键键值
                        }


oce4n 发表于 2024-3-25 10:11:44

十五集 外部中断
根据手册中的打开关闭寄存器通道来写外部中断
熟悉了外部中断的作用和使用方法
这是外部中断0 INT0 的结构


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

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



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


EX0=1;
void INT0_Init(void)                                //外部中断0的初始化
{
        IT0 = 1;                                                //1:下降沿中断   0:上升下降沿中断
        EX0 = 1;                                                //允许中断
        IE0 = 0;                                                //清除中断标志位
}

电子爱好者2024 发表于 2024-3-25 20:54:27

看起来好厉害的样子!

oce4n 发表于 2024-3-26 09:58:03

电子爱好者2024 发表于 2024-3-25 20:54
看起来好厉害的样子!

都是看视频跟写{:4_241:},还是得练{:5_336:}

电子爱好者2024 发表于 2024-3-28 22:15:34

练得怎么样了,达到什么水平了?

oce4n 发表于 2024-3-29 09:30:55

电子爱好者2024 发表于 2024-3-28 22:15
练得怎么样了,达到什么水平了?

上次学的用定时器多任务来优化电磁炉程序还没写出来呢

电子爱好者2024 发表于 2024-3-29 21:59:45

比我厉害,我现在程序编程还没弄明白{:4_167:}
页: 1 2 [3] 4
查看完整版本: 【实验箱已收到】STC32位8051单片机_学习打卡心得