登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习心得] 单片机

[复制链接]
发表于 2019-1-30 20:41:07 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机基础编程学习
学习安排: 金沙滩工作室前10章学习
开始时间: 1.21
结束时间: 1.30
看完了第十章的视频讲解后,对前十章的知识做了系统的复习与理解,之前不太理解的现在也有了大致的了解,现在需要掌握的是进行模块化记忆,以及遵从从简原则能用更少的语句去代替就不用过多的语句去描述,这次的笔记算是对自己前一段时间掌握知识的总结。      总结如下:
1 . 在进行数码管动态刷新的时候开始接触的时候是用的if···else···语句,后来用了switch语句后显得之前的if···else···语句过于的复杂。
今天学到了更加简便的语句:
void LedScan()
{
static unsigned char i = 0; //动态扫描索引

P0 = 0xFF; //关闭所有段选位,显示消隐
P1 = (P1 & 0xF8) | i; //位选索引值赋值到 P1 口低 3 位
P0 = LedBuff[i]; //缓冲区中索引位置的数据送到 P0 口
if (i < 6) //索引递增循环,遍历整个缓冲区
i++;
else
i = 0;
}

2 . 之前在自定义定时器时间的时候需要计算或者通过stc烧录软件进行计算并复制,现在总结了一个可以直接输入需要定的时间就能直接使用的模块,
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //临时变量

tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 28; //补偿中断响应延时造成的误差

T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 为模式 1
TH0 = T0RH; //加载 T0 重载值
TL0 = T0RL;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
}
3 . 数码管显示函数
void ShowNumber(unsigned long num)
{
signed char i;
unsigned char buf[6];

for (i=0; i<6; i++) //把长整型数转换为 6 位十进制的数组
{
buf[i] = num % 10;
num = num / 10;
}
for (i=5; i>=1; i--) //从最高位起,遇到 0 转换为空格,遇到非 0 则退出循环
{
if (buf[i] == 0)
LedBuff[i] = 0xFF;
else
break;
}
for ( ; i>=0; i--) //剩余低位都如实转换为数码管显示字符
{
LedBuff[i] = LedChar[buf[i]];
}
}

4 . 之前使用的for(i=0;i<4;i++){};可以用
keyout++; //输出索引递增
keyout &= 0x03; //索引值加到 4 即归零 来代替使用。

5 . 按键判断语句:
if (KeySta != backup) //当前值与前次值不相等说明此时按键有动作
{
if (backup == 0) //如果前次值为 0,则说明当前是弹起动作
{
cnt++; //按键次数+1
if (cnt >= 10)
{ //只用 1 个数码管显示,所以加到 10 就清零重新开始
cnt = 0;
}
P0 = LedChar[cnt]; //计数值显示到数码管上
}
backup = KeySta; //更新备份为当前值,以备进行下次比较
}

不过在实际运用中由于需要消抖因此考虑多方面原因常常在中断函数中加入以下语句:

/* T0 中断服务函数,用于按键状态的扫描并消抖 */
void InterruptTimer0() interrupt 1
{
static unsigned char keybuf = 0xFF; //扫描缓冲区,保存一段时间内的扫描值

TH0 = 0xF8; //重新加载初值
TL0 = 0xCD;
keybuf = (keybuf<<1) | KEY4; //缓冲区左移一位,并将当前扫描值移入最低位
if (keybuf == 0x00)
{ //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下
KeySta = 0;
}
else if (keybuf == 0xFF)
{ //连续 8 次扫描值都为 1,即 16ms 内都只检测到弹起状态时,可认为按键已弹起
KeySta = 1;
}
else
{} //其它情况则说明按键状态尚未稳定,则不对 KeySta 变量值进行更新
}



好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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