文章目录
- 如何实现
- 利用人眼的余晖效应(100hz无闪烁)
- 1ms刷一个数码管 8个看起来就是一块亮的
- 结合前面内容进行操作
- 前面内容传送门:
- 如何==段==选
- 原理图
- 代码写法
- 这里借助isp复制==共阴==数码管码值
- 如何==位==选
- 原理图
- 代码写法
- 如何消隐
- 在每次 段选 赋值之前 不选通位 即可
- 代码写法
- 综上一次性刷新8个数码管代码
- 程序现象
如何实现
利用人眼的余晖效应(100hz无闪烁)
1ms刷一个数码管 8个看起来就是一块亮的
结合前面内容进行操作
前面内容传送门:
(二)搞定烦人的蜂鸣器和继电器
如何段选
原理图
通过分析 P2 赋值 0xe0;P0 赋值 所要显示的 字码(数字或者字母)
比如:显示0 P0赋值 0xc0 ;显示1 P0赋值 0xf9
代码写法
DeviceCtrl(0xe0,0xc0);// 显示‘0’
这里借助isp复制共阴数码管码值
当然比赛资源包里面会提供共阳码值
数组改名为smgcode,并添加一个0x00—灭的码值
u8 code smgcode[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,
};
这个数组的码值是 共阴码值 需要取反
如何位选
原理图
通过分析 P2 赋值 0xC0;P0 赋值 所要选通的 位(也就是第几个数码管)
比如:选通com1,P0赋值0x01;
代码写法
DeviceCtrl(0xc0,0x01);//com1
如何消隐
在每次 段选 赋值之前 不选通位 即可
代码写法
DeviceCtrl(0xc0,0x00);//不选通位
综上一次性刷新8个数码管代码
#include "smg.h"u8 code smgcode[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,
};
u8 smgbuf[8];void ScanSmgTask()
{static u8 i =0;DeviceCtrl(0xC0,0x00);//消隐DeviceCtrl(0xe0,~smgbuf[i]);//duanDeviceCtrl(0xC0,0x01<<i);//comi++;if(i>=8){i = 0;}
}
说明:只需将ScanSmgTask();在之前开启的1ms定时器2中断服务函数中调用即可;
定时器2中断开启传送门:
(四)开启定时器2中断
另外:smgbuf 在主函数被赋值smgcode了,写smgcode效果是一样的
比如 将 smgbuf里面的缓存 修改成 2020 :
程序现象
----- 如有错误欢迎大家批评指正!!!