数码管动态显示
2016-09-27 00:05
330 查看
所谓的动态显示就是数码管不断变化,当变化速度超过人眼的识别范围时看起来就像数码管一直显示。
数码管动态显示时需要用到两个锁存器,一个是段锁存,一个是位锁存。一般开发板上使用的数码管动态显示,一组为八个数码管,这里可以称之为八位,每个数码管为一位,位锁存器就是决定哪一位亮起来,而位锁存器决定亮的那一位显示什么。动态显示一般先传段码,决定下一次显示什么内容,再传位码,使下一位亮起,段码和位码的内容都是事先定义一个全局数组,然后查表实现,一般位码数组内容是不做变化的,想改变显示内容只要改变相应位的段码就行。
定义段码
unsigned char regport[8] = {}; //显示内容自定义
定义位码
unsigned char bitport[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //因为位码的作用是让数码管一个一个按顺序亮,所以一般不做改变。
定义使用的I/O口
#define SEGPORT P0
sbit bit_select = P2^0;
sbit seg_select = P2^1;
延时函数
void delay_us(unsigned char t)
{
while(--t);
}
主函数中
while(1)
{
for(i = 0; i < 8; i ++)
{
SEGPORT = regdate[i];
seg_select = 1;
seg_select = 0;
SEGPORT = regdata[i];
bit_select = 1;
bit_select = 0;
delay_us(2);
}
}
此时发现使用上述延时会有重影出现,这是因为段码先传入,位码后做变化,当每次变化延时足够长时,正确显示时间远大于位码变化时间,所以几乎看不出,延时越短重影越明显。想解决重影,只要先把数码管全关闭,之后操作段码和位码的变化,位码一变化完成就打开数码管,这样就能消除重影。
改进后程序如下
while(1)
{
for(i = 0; i < 8; i ++)
{
SEGPORT = 0xff;
bit_select = 1;
bit_select = 0;
SEGPORT = 0xff;
seg_select = 1;
seg_select = 0;
SEGPORT = regdate[i];
seg_select = 1;
seg_select = 0;
SEGPORT = regdata[i];
bit_select = 1;
bit_select = 0;
delay_us(2);
}
}
数码管动态显示时需要用到两个锁存器,一个是段锁存,一个是位锁存。一般开发板上使用的数码管动态显示,一组为八个数码管,这里可以称之为八位,每个数码管为一位,位锁存器就是决定哪一位亮起来,而位锁存器决定亮的那一位显示什么。动态显示一般先传段码,决定下一次显示什么内容,再传位码,使下一位亮起,段码和位码的内容都是事先定义一个全局数组,然后查表实现,一般位码数组内容是不做变化的,想改变显示内容只要改变相应位的段码就行。
定义段码
unsigned char regport[8] = {}; //显示内容自定义
定义位码
unsigned char bitport[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //因为位码的作用是让数码管一个一个按顺序亮,所以一般不做改变。
定义使用的I/O口
#define SEGPORT P0
sbit bit_select = P2^0;
sbit seg_select = P2^1;
延时函数
void delay_us(unsigned char t)
{
while(--t);
}
主函数中
while(1)
{
for(i = 0; i < 8; i ++)
{
SEGPORT = regdate[i];
seg_select = 1;
seg_select = 0;
SEGPORT = regdata[i];
bit_select = 1;
bit_select = 0;
delay_us(2);
}
}
此时发现使用上述延时会有重影出现,这是因为段码先传入,位码后做变化,当每次变化延时足够长时,正确显示时间远大于位码变化时间,所以几乎看不出,延时越短重影越明显。想解决重影,只要先把数码管全关闭,之后操作段码和位码的变化,位码一变化完成就打开数码管,这样就能消除重影。
改进后程序如下
while(1)
{
for(i = 0; i < 8; i ++)
{
SEGPORT = 0xff;
bit_select = 1;
bit_select = 0;
SEGPORT = 0xff;
seg_select = 1;
seg_select = 0;
SEGPORT = regdate[i];
seg_select = 1;
seg_select = 0;
SEGPORT = regdata[i];
bit_select = 1;
bit_select = 0;
delay_us(2);
}
}
相关文章推荐
- 分频电路
- php学习笔记之登录后有保存Cookie免登录
- multimap中一个key对应多个键值的查询处理
- Android NDK学习笔记1-基础知识篇
- Android NDK学习笔记1-基础知识篇
- [NOIP2009] 提高组 洛谷P1072 Hankson 的趣味题
- leaflet的开发入门教程
- 利用python发送和接收邮件
- python搭建虚拟环境的步骤详解
- 20招让你的Python飞起来!
- python 采集中文乱码问题的完美解决方法
- Oracle数据库中 call 和 exec的区别
- 微信小程序 (十七)input 组件详细介绍
- asp.net mvc signalr简单聊天室制作过程分析
- 如何短时间内学好一门语言 shell脚本语言为例
- 腾讯产品总监曹菲:为何我工作10年,内心仍无比恐慌?
- 9 个使用前必须再三小心的 Linux 命令
- JavaScript 事件对内存和性能的影响
- Java 中 Varargs 机制的理解
- 免费的编程中文书籍索引汇总