前言
所谓静态显示,就是每一个数码管的段码都要独占具有锁存功能的输出口,CPU把要显示的字码送到输出口上,就可以使 数码管显示 对应的字符,直到下一次送出另一个字码之前,显示的内容一直不会消失。
目录
一、数码管简介
二、.静态数码管显示原理
三、代码
一、数码管简介
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极 COM 接到+5V 共阴数码管是指将所有发光二板管的阴板接到一起形成公共阴 极(COM) 的数 码管,共阴数码管在应用时应将公共极 COM 接到地线 GND上。
共阳极是指数码管内部LED的正极接在一起,想要点亮LED,拉低相应的负极即可。 共阴极是指数码管内部LED的负极接在一起,想要点亮LED,拉高相应的正极即可。其编码是让数码管显示数字时,对应的IO输出的高低电平。顺序为:dp, g ,f ,e, d, c, b, a。欲使其亮,共阴极时,阴极应送低电平;共阳极时,阳极应送高电平。
二、.静态数码管显示原理
多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,否则一体的多位同时显示必须时显示相同内容。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)
注:因为共阳极数码管,所以位选接的是高电平,要想正常显示通过控制低电平来控制段选即可。
数码管硬件电路原理图:
![](https://i-blog.csdnimg.cn/blog_migrate/40c186a8f3f3077ded36c40b0e1613cf.jpeg)
以下是八段数码管0-9显示代码表:
![](https://i-blog.csdnimg.cn/blog_migrate/fa06e29d039608fa3e9bdb084a045214.jpeg)
共阳极字形码:0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e
共阴极字形码:0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71。
本实验采取的是共阴极的数码管静态显示,8位数码管从左到右显示为“20231221”。
字位码是位选,就是用公共端控制让8个数码管的哪一个数码管显示数字。
三、代码
#include "regx52.h"
#include "intrins.h"
//延时函数
void Delay1_ms(unsigned int a) //@11.0592MHz
{
unsigned char i, j;
for(a;a>0;a--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
// 0 1 2 3 4 5 6 7 8 9
unsigned char meg_code[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//定义数码管引脚
sbit HC_Y0 = P2^2;
sbit HC_Y1 = P2^3;
sbit HC_Y2 = P2^4;
void SMG_Select(unsigned char n)
{
switch(n)
{
case 1:
HC_Y0 = 0;//低位
HC_Y1 = 0;
HC_Y2 = 0;
break;
case 2:
HC_Y0 = 1;//高位
HC_Y1 = 0;
HC_Y2 = 0;
break;
case 3:
HC_Y0 = 0;
HC_Y1 = 1;
HC_Y2 = 0;
break;
case 4:
HC_Y0 = 1;
HC_Y1 = 1;
HC_Y2 = 0;
break;
case 5:
HC_Y0 = 0;
HC_Y1 = 0;
HC_Y2 = 1;
break;
case 6:
HC_Y0 = 1;
HC_Y1 = 0;
HC_Y2 = 1;
break;
case 7:
HC_Y0 = 0;
HC_Y1 = 1;
HC_Y2 = 1;
break;
case 8:
HC_Y0 = 1;
HC_Y1 = 1;
HC_Y2 = 1;
break;
}
}
void Show_Num(long num)
{
//第一种诸位显示
char sn = 0;
SMG_Select(1);
num = num/10; //12345/10=0
sn = num%10;
P0 = meg_code[sn]; //数组第一位数据赋值给数码管段选口
Delay1_ms(3);
num = num/10; //12345/10=1234
SMG_Select(2);
sn = num%10;
P0 = meg_code[sn]; //12345%10=4
Delay1_ms(3);
num = num/10; //12345/10=123
SMG_Select(3);
sn = num%10;
P0 = meg_code[sn]; //12345%10=3
Delay1_ms(3);
num = num/10; //12345/10=12
SMG_Select(4);
sn = num%10;
P0 = meg_code[sn]; //12345%10=2
Delay1_ms(3);
num = num/10; //12345/10=1
SMG_Select(5);
sn = num%10;
P0 = meg_code[sn]; //12345%10=1
Delay1_ms(3);
//第二种使用for循环
char i =0;
for(i=1;i<=8;i++) //8位数码管循环8次
{
SMG_Select(i); //第一位数码管
P0 = meg_code[num%10]; //取出传入参数的个位数的值
Delay1_ms(1);
P0 = 0x00; //消影
num = num/10; //取完个位数之后除以10,去掉当前个位数
if(num<=0)
break;
}
}
void main()
{
while(1)
{
Show_Num(20231221);//数码管显示的数字
}
}