03-共阳极数码管的静态显示

发布时间 2023-10-03 19:32:34作者: 夏日清`凉

共阳数码管的静态显示

20231003163444

由电路图可知此为共阳数码管

#include <REGX52.H>

unsigned int code num[16] ={
	 0xc0,   	  // 0    1100 0000  
	 0xf9,        // 1    1111 1001    abged  为0
	 0xa4,           // 2           1010 0100
	 0xb0,//3
	 0x99,//4
	 0x92,//5
	 0x82,//6
	 0xf8,//7
	 0x80,//8
	 0x90,//9
	 0x88,//A
	 0x83,//B
	 0xc6,//C
	 0xa1,//D
	 0x86,//E
	 0x8e,//F     
};
// 以毫秒级别的倍数减少
void Delay(unsigned int xms) {
	//while(t--);
	//while(t--);
	unsigned int i,j;
	for(i = 0; i < xms;i++) {
		for(j = 0;j < 299; j++);
	}

}
void _74HC138(unsigned char n) {
	
	switch(n) {
		case 4:   // LED使能
			P2 = (P2 & 0x1f) | 0x80;  // 1000 0000 
		break;
		case 5:   // 蜂鸣器和继电器使能
			P2 = (P2 & 0x1f) | 0xa0;  // 1010 0000 
		break;
		case 6:   // 数码管位选使能
			P2 = (P2 & 0x1f) | 0xc0;  // 1100 0000 
		break;
		case 7:   // 数码管段选使能
			P2 = (P2 & 0x1f) | 0xe0;  // 1110 0000 
		break;
		case 0:   
			P2 = (P2 & 0x1f) | 0x00;  // 1110 0000 
		break;
	}

}
void SystemInit(void) {
	_74HC138(5);
	P0 = 0x00;
	_74HC138(4);
	P0= 0xff;
}
void showSMG_Bit(unsigned char dat,pos) {
	_74HC138(6);    // 数码管位选使能
	P0 = 0x01 << pos; // 0x01 << 0000 0001 
	_74HC138(7);    // 数码管段选使能
	P0=dat;
}

void SMG_Static(void) {
	unsigned char i,j;
	for(i=0;i<8;i++) {
	
	for(j =0;j<10;j++) {
		// 参数1段选  参数2位选
		showSMG_Bit(num[j], i);
		Delay(500);
		}
	}
	
	
	for(i=0;i<16;i++) {
        _74HC138(6);    // 数码管位选使能
		P0 = 0xFF;
		_74HC138(7);
		P0=num[i];
		Delay(4000);
	
	}
	

}
void main(void) {
 unsigned char i,j;
    
	SystemInit();
    // 调用该函数可实现上述功能
	SMG_Static();
	// 第二种方法
	for(i=0;i<8;i++) {
	_74HC138(6);    // 数码管位选使能
	P0=0x01<<i; // 从左往右依次点亮  0000 0001 => 0000 0010 =>以此类推
	for(j =0;j<10;j++) {
			_74HC138(7);
			P0=num[j];
			Delay(500);
		}
	
	}
	
	_74HC138(6);
	P0 = 0XFF;   // 位选全部点亮
	for(i=0;i<16;i++) {
		_74HC138(7);
		P0=num[i];
		Delay(4000);
	
	}
	
}