蓝桥杯单片机(三)——动态数码管显示

单片机开发板要实现动态数码管的显示首先是要判断数码管是共阴极还是共阳极,共阴极数码管字段为低电平时,点亮;共阳极数码管字段为高电平时,点亮。本开发板所使用的数码管是共阴极数码管。
蓝桥杯单片机(三)——动态数码管显示_第1张图片
共有八个数码管,八个数码管采用2个74HC573锁存器对单片机P0口的输出信号进行锁存,并增强信号驱动能力进而驱动8个数码管,其中U7的锁存输入Y7C是段选,U8的锁存输入Y6C是位选。
每个数码管共有8个字段:dp g f e d c b a, 控制数码管的显示实际上就是控制数码管字段的高低电平显示,通过控制字段的发光来表示字符。这是共阴极数码管,比如:要使数码管显示为0,则数码管段表示为:1100 0000 ,十六进制为0xc0,要表示其他数字亦然。
因为这是用两个锁存器来控制的,在段选之前,我们要先通过U8锁存器进行位选,也就是选择对应的几号数码管亮起,当然,如果需要全部亮起,只需要把延时时间变短即可(只是肉眼看不出来的频率)。
位选是通过锁存器把需要用到的某一个数码管打开,也就是在74HC573上将P0口的某一个引脚的电位拉高,输入高电平信号1。

P2 = P2 & 0x1f | 0xc0;//打开锁存器U8
P0 = 0x01;//打开com1

位选完成之后开始进行段选:

P2 = P2 & 0x1f | 0xe0;//打开锁存器U7
P0 = 0xc0;//第一个数码管显示0

要想实现数码管的动态显示,可以先将要显示的字符的二进制码放入一个数组里面,通过循环和延时程序来实现动态操作。

#include "STC15F2K60S2.h"
#include "intrins.h"

typedef unsigned int u16;
typedef unsigned char u8;

u8 code smgduan[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};//段选
u8 code com[8]={0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};//位选
void Cls_P()
{
	P2 = P2 & 0x1f | 0xa0; P0 = 0x00; // 1010 0000 打开锁存器Y5C, 关闭蜂鸣器
	P2 = P2 & 0x1f | 0x80; P0 = 0xff; // 1000 0000 打开锁存器Y4C, 关闭LED
	
}

//延时函数,最小为1ms
void Delay(u16 num)
{
	u16 i;
	while(num--){
		for(i=0; i<628; i++);
	}
}
//LED流水灯
void Display_Led()
{
	u16 i;
	P2 = 0x80;
	P0 = 0xfe;
	Delay(100);
	while(1){
		for(i=0; i<7; i++)
		{
			P0 = _crol_(P0, 1);//移位,循环左移
			Delay(500);
		}
		for(i=0; i<7; i++)
		{
			P0 = _cror_(P0, 1);//循环右移
			Delay(500);
		}
		break;
	}
}

//数码管
void ShuMaGuang()
{
	u16 i,j;
	u16 num;
	//for(j=0; j<8; j++)
	while(num<8)
	{
		P2 = P2 & 0x1f | 0xc0;
		P0 = com[num];
	
		
		P2 = P2 & 0x1f | 0xe0;
		for(i=0; i<16; i++)
		{
			P0 = smgduan[i];
			Delay(500);
		}
		num++;
	}
}

void main()
{
	Cls_P();//关闭外设
	Display_Led();//流水灯
	ShuMaGuang(); //动态数码管
}

这个程序是使动态数码管从第一个开始显示0~F,显示完成后跳到第二个数码管从0开始显示,直到显示到最后一个数码管。

你可能感兴趣的:(蓝桥杯单片机)