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:}