打印
[应用方案]

数码管驱动

[复制链接]
17|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
minzisc|  楼主 | 2024-11-26 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、数码管电路原理图及原理

电路图(图一)

数码管显示原理(图二)

数码管根据内部连接不同,分为共阴极和共阳极。八段数码管内部有8颗LED组成,如果想要显示特定字形只需控制相应的LED亮起,其他LED熄灭即可。

数码管显示方式有两种:静态显示和动态显示

静态显示每个数码管端口都必须接上数据IO口来保持显示。当送入字形可一直保持,直到送入新字形为止。
优点:数码管显示无闪烁、亮度高、软件控制比较容易。
缺点:需要的硬件电路较多,如果数码管增多,当数码管全部被电量的时候,所需要的电流会增大,对电源的要求也随之增加。所以,大部分硬件设计中,很少采用静态显示的方式。

动态显示:所有位的数码管段选线并联在一起,由位选线进行动态扫描,控制是哪一位数码管有效。所谓动态扫描显示就是轮流向各位数码管送出字形码和相应的位选,利用发光数码管的余晖和人眼视觉残留的作用,使人感觉好像各位数码管同时都在显示。

扩展:眼睛的另一个重要特性是视觉惰性,即光象一旦在视网膜上形成,视觉将会对这个光象的感觉维持一个有限的时间,这种生理现象叫做视觉暂留性,对于中等亮度的光刺激,视觉暂留时间约为0.05至0.2秒。

优点:硬件简单(数码管越多,这个优势越明显),由于每个数码管只有一个被点亮,所以数码管消耗的电流较小。
缺点:数码管亮度不如静态显示的亮度高,如果刷新率低,会出现闪烁的现象。

2、数码管码表//数码管码表,共阳极unsigned char leddata[]={                  0xC0,  //"0"                0xF9,  //"1"                0xA4,  //"2"                0xB0,  //"3"                0x99,  //"4"                0x92,  //"5"                0x82,  //"6"                0xF8,  //"7"                0x80,  //"8"                0x90,  //"9"                0x88,  //"A"                0x83,  //"B"                0xC6,  //"C"                0xA1,  //"D"                0x86,  //"E"                0x8E,  //"F"                0x89,  //"H"                0xC7,  //"L"                0xC8,  //"n"                0xC1,  //"u"                0x8C,  //"P"                0xA3,  //"o"                0xBF,  //"-"                0xFF,  //熄灭                0xFF  //自定义                          };//数码管码表,共阴极unsigned char leddata[]={                  0x3F,  //"0"                0x06,  //"1"                0x5B,  //"2"                0x4F,  //"3"                0x66,  //"4"                0x6D,  //"5"                0x7D,  //"6"                0x07,  //"7"                0x7F,  //"8"                0x6F,  //"9"                0x77,  //"A"                0x7C,  //"B"                0x39,  //"C"                0x5E,  //"D"                0x79,  //"E"                0x71,  //"F"                0x76,  //"H"                0x38,  //"L"                0x37,  //"n"                0x3E,  //"u"                0x73,  //"P"                0x5C,  //"o"                0x40,  //"-"                0x00,  //熄灭                0x00  //自定义                          };3、位选IO管脚定义sbit smg1 = P2^0;sbit smg2 = P2^1;sbit smg3 = P2^2;sbit smg4 = P2^3;4、延时函数//注意:必须包含<intrins.h>头文件才能使用void Delay1ms()                //@11.0592MHz{        unsigned char i, j;        _nop_();        i = 2;        j = 199;        do        {                while (--j);        } while (--i);}void delay_ms(unsigned int time){        unsigned int i;        for(i=0; i<time; i++)        {                Delay1ms();        }}5、动态显示一位数码管//在数码管显示一位数字显示函数,//unsigned char i 输入0-9以内的数字void disply_one_digit(unsigned char i){        P0 = leddata;        smg4 = 0;        delay_ms(5);        smg4 = 1;}6、动态显示两位数码管//在数码管显示两位数字显示函数,//unsigned char i 输入0-99以内的数字void disply_two_digit(unsigned char i){        unsigned char shi,ge;        shi = i / 10;        ge = i % 10;                P0 = leddata[ge];        smg4 = 0;        delay_ms(5);        smg4 = 1;                P0 = leddata[shi];        smg3 = 0;        delay_ms(5);        smg3 = 1;}7、动态显示三位数码管//在数码管显示三位数字显示函数,//unsigned char i 输入0-999以内的数字void disply_three_digit(unsigned int i){        unsigned int ge,shi,bai;                bai = i / 100;        shi = i % 100 / 10;        ge  = i % 10;                P0 = leddata[ge];        smg4 = 0;        delay_ms(5);        smg4 = 1;                P0 = leddata[shi];        smg3 = 0;        delay_ms(5);        smg3 = 1;                P0 = leddata[bai];        smg2 = 0;        delay_ms(5);        smg2 = 1;}8、动态显示四位数码管//在数码管显示四位数字显示函数,//unsigned char i 输入0-9999以内的数字void disply_four_digit(unsigned int i){        unsigned int ge,shi,bai,qian;                qian = i / 1000 % 10;        bai = i / 100 % 10;        shi = i / 10 % 10;        ge = i % 10;                P0 = leddata[ge];        smg4 = 0;        delay_ms(5);        smg4 = 1;                P0 = leddata[shi];        smg3 = 0;        delay_ms(5);        smg3 = 1;                P0 = leddata[bai];        smg2 = 0;        delay_ms(5);        smg2 = 1;                P0 = leddata[qian];        smg1 = 0;        delay_ms(5);        smg1 = 1;}9、主函数调用示例void main(){        while(1)        {//                disply_one_digit(5);//                //                disply_two_digit(9);//                //                disply_three_digit(123);                                disply_four_digit(1234);        }}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

5405

帖子

4

粉丝