1.基本知识
数码管分为共阴和共阳数码管,实质还是点亮led,来显示不同的数字或字符
在明确数码管类型之后,就可以确定段码数组了,也就是显示内容所对应的值,例如,要在数码管上显示数值“7”,那么就要输出的数值为“0xf8”
ct107d中数码管原理图
原理图中数码管的位选和段选都有一个M74hc573的锁存器锁存,和led,蜂鸣器继电器的控制一样,若想输出先打通锁存器,实则是来控制138译码器的输入来选择打通哪个锁存器;
void HC138out(uchar n)
{
switch(n)
{
case 4: HC138_A=0;HC138_B=0;HC138_C=1; break;
case 5: HC138_A=1;HC138_B=0;HC138_C=1; break;
case 6: HC138_A=0;HC138_B=1;HC138_C=1; break;
case 7: HC138_A=1;HC138_B=1;HC138_C=1; break;
}
}
这就是来选择打通哪个锁存器。
静态显示和动态显示的区别:
所谓静态显示, 就是每一个数码管的段码都要独占具有锁存功能的输出口, CPU把要显示的字码送到输出口上,就可以使数码管显示对应的字符, 直到下一次送出另外一个字码之前, 显示的内容一直不会消失;动态扫描是把所有显示器的8个段码中的A-dp的各个相同段连接在一起, 接到一个公共的输出口上,而数码管的位端分别接在另外的输出口上,通过这两个输出口的两组信号相互作用来产生显示效果。即让各位数码管按照一定顺序轮流显示, 只要扫描频率足够高, 由于人眼的“ 视觉暂留”现象,就能连续稳定的显示。
2.程序代码:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i,j;
uchar code SMG_Duanma[18] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
void delay(uint t)
{
while(t--);
}
void HC138out(uchar n)
{
switch(n)
{
case 4: HC138_A=0;HC138_B=0;HC138_C=1; break;
case 5: HC138_A=1;HC138_B=0;HC138_C=1; break;
case 6: HC138_A=0;HC138_B=1;HC138_C=1; break;
case 7: HC138_A=1;HC138_B=1;HC138_C=1; break;
}
}
void init()
{
HC138out(5); //关蜂鸣器,继电器
P0=0X00;
}
void smgshuju(uchar a,uchar b)
{
HC138out(6); //位选打开
P0=0X01<<b;
HC138out(7);
P0=a;
}
void displaysmg()
{
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
{
smgshuju(SMG_Duanma[j],i);
delay(50000);
}
}
}
void main()
{
init();
while(1)
{
displaysmg();
}
}