(六)数码管动态刷新

2024-01-02 22:42:00


如何实现

利用人眼的余晖效应(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]);//duan
	DeviceCtrl(0xC0,0x01<<i);//com
	i++;
	if(i>=8){
		i = 0;
	}
}

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

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

(四)开启定时器2中断

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

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

在这里插入图片描述


程序现象

在这里插入图片描述



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

文章来源:https://blog.csdn.net/m0_52555663/article/details/135349656
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。