(六)数码管动态刷新

文章目录

  • 如何实现
    • 利用人眼的余晖效应(100hz无闪烁)
    • 1ms刷一个数码管 8个看起来就是一块亮的
  • 结合前面内容进行操作
    • 前面内容传送门:
    • 如何==段==选
      • 原理图
      • 代码写法
      • 这里借助isp复制==共阴==数码管码值
    • 如何==位==选
      • 原理图
      • 代码写法
    • 如何消隐
      • 在每次 段选 赋值之前 不选通位 即可
      • 代码写法
    • 综上一次性刷新8个数码管代码
  • 程序现象


如何实现

利用人眼的余晖效应(100hz无闪烁)

1ms刷一个数码管 8个看起来就是一块亮的


结合前面内容进行操作

前面内容传送门:

(二)搞定烦人的蜂鸣器和继电器

如何

原理图

(六)数码管动态刷新_第1张图片

通过分析 P2 赋值 0xe0;P0 赋值 所要显示的 字码(数字或者字母)

比如:显示0 P0赋值 0xc0 ;显示1 P0赋值 0xf9

代码写法

DeviceCtrl(0xe0,0xc0);// 显示‘0’

这里借助isp复制共阴数码管码值

当然比赛资源包里面会提供共阳码值

(六)数码管动态刷新_第2张图片
(六)数码管动态刷新_第3张图片

数组改名为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,
};

这个数组的码值是 共阴码值 需要取反


如何

原理图

(六)数码管动态刷新_第4张图片
通过分析 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]);//duan
	DeviceCtrl(0xC0,0x01<<i);//com
	i++;
	if(i>=8){
		i = 0;
	}
}

说明:只需将ScanSmgTask();在之前开启的1ms定时器2中断服务函数中调用即可;

定时器2中断开启传送门:

(四)开启定时器2中断

另外:smgbuf 在主函数被赋值smgcode了,写smgcode效果是一样的

比如 将 smgbuf里面的缓存 修改成 2020 :

(六)数码管动态刷新_第5张图片


程序现象

(六)数码管动态刷新_第6张图片



----- 如有错误欢迎大家批评指正!!!

你可能感兴趣的:(蓝桥杯电子类,蓝桥杯,单片机,c语言,嵌入式)