下面进行数码管的使用复习
主要分为静态显示与动态显示
静态显示
当我们对数码管的显示需求仅为一位时,可以直接通过数码管的静态显示实现,即将对应的位选选通,随后直接向段选输入段码信号即可。
国信长天的板子的数码管模块的原理图如上图所示,该数码管为共阳数码管,其位选通过74LS138控制为Y6通道,即当P25 = 0;P26 = 1;P27 = 1;时,P0口为数码管位选;其段选为74LS138的Y7通道,即当P25 = 1;P26 = 0;P27 = 1;时,P0口为数码管段选。
1、数码管静态显示
#include
#include
#define uint unsigned int
#define uchar unsigned char
void ALL_Init();
void delay_ms(uint ms);
uchar SEG_num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void main()
{
ALL_Init();
while(1)
{
P25 = 0;P26 = 1;P27 = 1;
P0 = 0x01;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[1];
delay_ms(100);
}
}
/*
函数功能:毫秒级延时函数
函数参数:时间,单位为ms
函数返回值:void
*/
void delay_ms(uint ms)
{
int i;
for(;ms>0;ms--)
for(i = 864;i>0;i--);
}
void ALL_Init()
{
P25 = 1;P26 = 0;P27 = 1;
P0 = 0x00;
P25 = 0;P26 = 1;P27 = 1;
P0 = 0x00;
P25 = 0;P26 = 0;P27 = 1;
P0 = 0xff;
}
2、动态显示
数码管的动态显示即利用了人眼的视觉暂留原理,通过数码管的高速刷新,让我们的肉眼看起来数码管各个位像是同时亮起的样子,但是要注意他们其实不是一起亮的,在任一时间点,是只有一位数码管被点亮的。
void main()
{
ALL_Init();
while(1)
{
SEG_show(1314);
// P25 = 0;P26 = 1;P27 = 1;
// P0 = 0x01;
// P25 = 1;P26 = 1;P27 = 1;
// P0 = SEG_num[1];
// delay_ms(100);
}
}
/*
函数功能:数码管的动态显示
函数参数:显示的数字,4位
函数返回值:void
*/
void SEG_show(int num)
{
//第一位,千位显示
P25 = 0;P26 = 1;P27 = 1;P0 = 0x01;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num/1000];
delay_ms(10);
//第二位,百位显示
P25 = 0;P26 = 1;P27 = 1;P0 = 0x02;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num/100%10];
delay_ms(10);
//第三位,十位显示
P25 = 0;P26 = 1;P27 = 1;P0 = 0x04;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num/10%10];
delay_ms(10);
//第四位,个位显示
P25 = 0;P26 = 1;P27 = 1;P0 = 0x08;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num%10];
delay_ms(10);
P25 = 0;P26 = 1;P27 = 1;P0 = 0x00;
}
结语
至此,完成了数码管的静态显示与动态显示,其实数码管的动态显示调节是个十分麻烦的问题,当主函数中处理的内容过多时,数码管刷新时间及显示效果调节将变成一个烦人的东西,不过这是后话,后面我们也可以通过定时器进行实现数码管动态显示,这样就不会受主函数其他程序执行的干扰了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)