数码管:
1.数码管是有8段的,8段其实可以看为8个led(a,b,c,d,e,f,g,dp),分为共阴和共阳两种(所谓共
阴其实就是阴极都连在一起,共阳就是阳极都连在一起的)
第一张图是数码管的基本构建,第2张图是共阴形数码管,第3张图是共阳形数码管
2.74ls138是38译码器,输入端为:P22、P23、P24,详情可以看原理图,输出为:LED1-LED8,
这个其实就是led的选中处。
3.74HC245是锁存器,OE是使能端,当OE为低电平的时候,锁存器开始工作。D0-D7是输入端,
Q0-Q7是输出端。LE为高电平的时候,D端和Q端的数据一样,LE为低电平的时候,锁存器锁存,
此时不论D端电平如何变化,Q端不会再变化。
4.我们的数码管是共阴的数码管
数码管静态显示:
程序效果:LED0显示0
#include <reg52.h>
#define LED_CHOOSE P2
#define LED_VALUE P0
sbit le = P1^0;
typedef unsigned char u8;
u8 value_array[] = {0x3f, 0x06, 0x56, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77,
0x39, 0x5e, 0x79, 0x71, 0x00, 0x80}; //0x00为无显示,0x80为小数点
void delay(u8 i)
{
while (i--);
}
int main(void)
{
LED_CHOOSE &= ~(1<<2 | 1<<3 | 1<<4);
le = 1;
LED_VALUE = value_array[0];
delay(10);
le = 0;
while (1);
return 0;
}
5.数码管动态显示:
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
通俗来说:就是依次在每个数码管上去显示数字,为什么看不出来呢?
24帧/s的时候人眼看着就是连续的,也就是0.041s = 41ms左右,也就是41ms刷新一次,人眼就看不出来
程序效果:在LED0-LED7分别显示0-7
```c
#include <reg52.h>
#define LED_CHOOSE P2
#define LED_VALUE P0
sbit le = P1^0;
sbit LA = P2^2;
sbit LB = P2^3;
sbit LC = P2^4;
typedef unsigned char u8;
u8 value_array[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77,
0x39, 0x5e, 0x79, 0x71, 0x00, 0x80}; //0x00为无显示,0x80为小数点
void delay(u8 i)
{
while (i--);
}
void index_choose(u8 index)
{
switch (index)
{
case 0:
LA = 0;
LB = 0;
LC = 0;
break;
case 1:
LA = 1;
LB = 0;
LC = 0;
break;
case 2:
LA = 0;
LB = 1;
LC = 0;
break;
case 3:
LA = 1;
LB = 1;
LC = 0;
break;
case 4:
LA = 0;
LB = 0;
LC = 1;
break;
case 5:
LA = 1;
LB = 0;
LC = 1;
break;
case 6:
LA = 0;
LB = 1;
LC = 1;
break;
case 7:
LA = 1;
LB = 1;
LC = 1;
break;
default:
break;
}
}
int main(void)
{
int i = 0;
while (1)
{
for (i=0; i<8; i++)
{
index_choose(i);
LED_VALUE = value_array[i];
delay(100);
//这个用来延时1ms左右,24帧/s的时候人眼看着就是连续的
//也就是0.041s = 41ms左右,也就是41ms刷新一次,人眼就看不出来
//这里8ms,就全部刷新了一遍,所以肯定看到的是连续的
LED_VALUE = 0x0;
}
}
return 0;
}