C语言实现共阴极数码管操作
来源:互联网 发布:windows关机指令 编辑:程序博客网 时间:2024/06/10 09:13
共阴极或者共阳极数码管,因为其需要电流大,而一般51输出电流低,需要锁存器。买的开发板使用的共阴极数码管。
至于其构造,找个相关方面的书看看,这里主要是对做好的电路板进行编程。
刚开始的时候,感觉在数码管上显示数字很厉害。但是等到自己写这篇日志的时候,才发现了了。。
在对数码管编程前,需要对锁存器有所了解。买的开发板上用的是74HC573贴片式的。
74HC573真值表
输入 输出
!OE LE D | Q
L H H | H
L H L | L
L L X | Q0
H X X | X
<真值表具体参考郭天祥那本新概念P36页>
使用的时候74HC573的 !OE 引脚需要接低电平,否则D跟Q都成任意电平了,不听自己使唤了。失去锁存器的作用,因此必须让!OE为低电平。
通过74HC573在LE端为高电平时,把单片机的IO电平信号锁存。然后把LE变为低电平,这样不论单片机的IO电平如何变化,74HC573的输出口电平都保存LE变为低电平之前的数值,从而实现锁存。
由于多位数码管的段都是接在相同的IO口上,因此在买的这块开发板上分别用两个573对多位数码管的段、位进行锁存。
一、静态数码管显示的实现
这个实现比较简单,通过位锁存器数据判断那个数码管点亮,那个不点亮。然后通过段锁存器显示被选中的数码管上的数字或字母。
位:
由于是共阴极数码管,当该位置0时,该位数码管被选中,即通电后点亮。
段:
这个就是显示被选中的数码管显示什么内容了。网上有数码管小助手。或者自己一个个的计算得到。
显示多位数码管中某一个数码管的代码:
显示字母“L”
#include <reg52.h>#include "hj_init.h"sbit WE = P2^1;sbit DU = P2^0;void main(){WE = 1;P0 = 0xfe;WE = 0;DU = 1;P0 = 0x38;DU = 0;while(1);}
效果图:
显示多位数码管中两个数码管代码:
这个主要就是更改位的数值。想让那个亮,就置0。因为是共阴极数码管:P
除了这个静态的占IO的缺点外,还有就是不论你选中几个数码管,显示的数字都是一样的,不好玩。至于显示不同的内容,就要靠动态数码管了。
二、动态数码管显示的实现
说是动态,其实还是静态一位一位的显示。但是因为速度快,而人眼有视觉暂留作用,感觉上是动态显示而已。如果想看清到底是如何显示的,可以把延时的时间变长,这样能更好的看清是如何显示的。
动态里面还有个关键的地方就是消影。P0 = 0xff 。
先把段选数据送到锁存器中。再送位选数据。中间如果不加上消影,在显示位选数据前,P0仍保持上次的段选数据,会造成干扰。因此需要添加消影。但后来发现如果先送位选的数据,在打开位对应的锁存器,可以省去P0 = 0xff 这句专用的消影语句。但先送位选数据,再打开相应锁存器,应该也算消影的方式吧。
实现8位共阴数码管动态显示的代码如下:
#include <reg52.h>#include "delay.h"#define uchar unsigned char#define uint unsigned int#define N 1 //方便调整延时时间sbit DUAN = P2^0; //声明段锁存器的LE(锁存允许端,或锁存控制端)引脚sbit WE = P2^1; //声明位锁存器的LE(锁存允许端,或锁存控制端)引脚//数码管码表uchar code table[]={0x3f,0x06,0x5b,0x4f,//数字0~30x66,0x6d,0x7d,0x07,//数字4~70x7f,0x6f,0x77,0x7c,//数字8、9、A、b0x39,0x5e,0x79,0x71//C、d、E、F};void main(){hj_init();while(1){/*数字0x06 = 1*/ //送入段选数据 DUAN = 1 ; P0 = table[3]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0xfe; WE = 0; delayms(N); //延时/***********************************************************//*数字0x5b = 2*/ //送入段选数据 DUAN = 1 ; P0 = table[3]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0xfd; WE = 0; delayms(N); //延时/***********************************************************//*数字0x4f = 3*/ //送入段选数据 DUAN = 1 ; P0 = table[9]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0xfb; WE = 0; delayms(N); //延时/***********************************************************//*数字0x66 = 4*/ //送入段选数据 DUAN = 1 ; P0 = table[8]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0xf7; WE = 0; delayms(N); //延时/***********************************************************//*数字0x6d = 5*/ //送入段选数据 DUAN = 1 ; P0 = table[4]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0xef; WE = 0; delayms(N); //延时/***********************************************************//*数字0x7d = 6*/ //送入段选数据 DUAN = 1 ; P0 = table[8]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0xdf; WE = 0; delayms(N); //延时/***********************************************************/ //送入段选数据 DUAN = 1 ; P0 = table[7]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0xbf; WE = 0; delayms(N); //延时/***********************************************************/ //送入段选数据 DUAN = 1 ; P0 = table[6]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0x7f; WE = 0; delayms(N); //延时}}
延时函数:
void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=OSC;j>0;j--);}
还有就是这段代码/*数字0x06 = 1*/ //送入段选数据 DUAN = 1 ; P0 = table[3]; DUAN = 0 ; P0 = 0xff; //消影 //送入位选数据 WE = 1; P0 = 0xfe; WE = 0; delayms(N); //延时
还可以改为:
/*数字0x06 = 1*/ //送入段选数据 DUAN = 1 ; P0 = table[3]; DUAN = 0 ; //送入位选数据 P0 = 0xfe; WE = 1; WE = 0; delayms(N); //延时
先送入位数据,再打开锁存器。我试了试效果一样。
效果如图:
再写些其他的。这次数码管的测试是在上午,当时遇到很多莫名其妙的问题,例如:明明只让数码管显示数字1,却连那个小数点也显示了;明明指定是8位数码管同时点亮,却只点亮了7个;数字4的某一位不知道为什么自己变化了。但通过keil仿真是正常的。以为是自己购买的板子坏了。于是抱着试试看的心理(在某些地方,这句话很流行),重新插拔了89C52的芯片,然后放一边了。准备联系淘宝了。再点亮看看吧。奇迹般的,好了。小数点也不显示了;指定8位显示,就是8位;数字4也显示正常了。难道是因为昨天晚上无聊,拿下芯片看了看的缘故?! 表示万分不理解。或者在代码正确的前提下,结果的正确与错误之间,只差一步:插拔芯片。。。
keil有时候编译的时候不提示错误,但提示老是出些很长的信息,很有可能是定义了某个函数却没有调用什么的。个人理解为单片机需要节约空间吧。
最后是买的这块板子的数码管原理图(高清无码):
- C语言实现共阴极数码管操作
- 共阴极8段数码管
- C语言实现一位共阳极数码管
- 共阴极数码管的显示刷新
- 共阴极数码管60秒表显示
- 数码管——8段共阴极数码管
- 电路与Multisim 共阴极数码管是com_k,共阳极数码管是com_a
- 单片机C语言实现数码管控制
- 数码管的c语言程序
- 数码管 C语言 共阴共阳编码表
- sm4205共阳极数码管
- 共阴数码管
- 数码管显示数字之C语言模拟
- 单片机:按键(使用中断)控制数码管的数字加减(c语言实现)
- 独立键盘操作数码管(C源码)
- stm32控制共阳数码管以及共阴数码管
- 共阳数码管和共阴数码管用法区别
- C语言实现栈操作
- EAX
- 读书笔记之-WEB环境的搭建
- 黑马程序员_高新技术四(Java动态代理、AOP简单框架)
- MD5加密
- 1.窗体与界面设计
- C语言实现共阴极数码管操作
- linux下 文件IO 相关
- 字符串的所有组合
- ptrace系统调用
- 大Boss的一堂课
- 中移动通信研究院2013社会招聘
- 文件和图片一样,有缩略图
- 1.窗体与界面设计
- Oracle存储过程中临时表的使用技巧