wKioL1ZHO8rx7rb4AAGf6EiCpFM936.jpg

图纸是共阴的,共阳的原理和这个一样



wKiom1ZHPCXDqijFAAMK6-ojavM643.jpg

wKiom1ZHPCiwsxGyAAPRnQ4-Rv4722.jpg


/***************************************************
程序名:    4位共阳数码管驱动程序
编写时间:  2015年11月14日
硬件支持:  STC12C4052AD
接口说明:  点扫描  
数码管是

字段  管脚  MCU IO口
a 13脚  P1.0
b  9脚  P1.1
c  4脚  P1.2
d  2脚  P1.3
e  1脚  P1.4
f 12脚  P1.5
g  5脚  P1.6
dp 8脚  P1.7

1位 14脚  P3.0
2位 11脚  P3.1
3位 10脚  P3.2
4位  6脚  P3.3





/***************************************************/

#include <STC12C2052AD.H> //STC头文件
#define LI			9	 //设置LED显示的亮度(值域:1~9)
#define DELAY		10 	//设置每一个点显示的时间长度,40以内较合适,改为999可以看到数码管点亮步骤

sbit	LED1_H1	=P3 ^ 0; //设置LED点阵屏连接的I/O口
sbit	LED1_H2	=P3 ^ 1; //设置LED点阵屏连接的I/O口
sbit	LED1_H3	=P3 ^ 2; //设置LED点阵屏连接的I/O口
sbit	LED1_H4	=P3 ^ 3; //设置LED点阵屏连接的I/O口

sbit	LED1_L1	=P1 ^ 0; //设置LED点阵屏连接的I/O口
sbit	LED1_L2	=P1 ^ 1; //设置LED点阵屏连接的I/O口
sbit	LED1_L3	=P1 ^ 2; //设置LED点阵屏连接的I/O口
sbit	LED1_L4	=P1 ^ 3; //设置LED点阵屏连接的I/O口
sbit	LED1_L5	=P1 ^ 4; //设置LED点阵屏连接的I/O口
sbit	LED1_L6	=P1 ^ 5; //设置LED点阵屏连接的I/O口
sbit	LED1_L7	=P1 ^ 6; //设置LED点阵屏连接的I/O口
sbit	LED1_L8	=P1 ^ 7; //设置LED点阵屏连接的I/O口

#define P1M0SET		0x00 //设置I/O口工作方式//00000000(左到右,高到低位)
#define P1M1SET		0x00 //设置I/O口工作方式//00101000
#define P3M0SET		0x00 //设置I/O口工作方式//00000000
#define P3M1SET		0xff //设置I/O口工作方式//10010100

data unsigned char TIME_HH,TIME_MM,TIME_SS;//设置时、分、秒存放区
data unsigned char cou  = 0;               // 软计数器,对10ms时基信号累加到1s 
data unsigned char bn;                     //扫描映射全局变量
data unsigned char PWM;                 //显示亮度

unsigned char code disdata[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9) 
};

void delay (unsigned int a){ // 用于点扫描的延时
	unsigned int i;
	while( a-- != 0){
		for(i = 0; i < DELAY; i++); 
	}   				   
}

void delay1ms (unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时)
	unsigned int i;
	while( a-- != 0){
		for(i = 0; i < 600; i++); 
	}   				   
}

void dis_off (void){
	P1 = ~P1M1SET; //关所有显示
	P3 = ~P3M1SET;
	delay(10-PWM); 
}

void displayHH1 (unsigned char d){ //第1列横向显示程序
	unsigned char i;
	i = d & 0x01;
	if(i == 0x01){
		LED1_H1 = 1;LED1_L1 = 0;}delay(PWM);dis_off();
	i = d & 0x02;
	if(i == 0x02){
		LED1_H1 = 1;LED1_L2 = 0;}delay(PWM);dis_off();
	i = d & 0x04;
	if(i == 0x04){
		LED1_H1 = 1;LED1_L3 = 0;}delay(PWM);dis_off();
	i = d & 0x08;
	if(i == 0x08){
		LED1_H1 = 1;LED1_L4 = 0;}delay(PWM);dis_off();
	i = d & 0x10;
	if(i == 0x10){
		LED1_H1 = 1;LED1_L5 = 0;}delay(PWM);dis_off();
	i = d & 0x20;
	if(i == 0x20){
		LED1_H1 = 1;LED1_L6 = 0;}delay(PWM);dis_off();
	i = d & 0x40;
	if(i == 0x40){
		LED1_H1 = 1;LED1_L7 = 0;}delay(PWM);dis_off();
	i = d & 0x80;
	if(i == 0x80){
		LED1_H1 = 1;LED1_L8 = 0;}delay(PWM);dis_off();
} 

void displayHH2 (unsigned char d){ //第2列横向显示程序
	unsigned char i;
	i = d & 0x01;
	if(i == 0x01){
		LED1_H2 = 1;LED1_L1 = 0;}delay(PWM);dis_off();
	i = d & 0x02;
	if(i == 0x02){
		LED1_H2 = 1;LED1_L2 = 0;}delay(PWM);dis_off();
	i = d & 0x04;
	if(i == 0x04){
		LED1_H2 = 1;LED1_L3 = 0;}delay(PWM);dis_off();
	i = d & 0x08;
	if(i == 0x08){
		LED1_H2 = 1;LED1_L4 = 0;}delay(PWM);dis_off();
	i = d & 0x10;
	if(i == 0x10){
		LED1_H2 = 1;LED1_L5 = 0;}delay(PWM);dis_off();
	i = d & 0x20;
	if(i == 0x20){
		LED1_H2 = 1;LED1_L6 = 0;}delay(PWM);dis_off();
	i = d & 0x40;
	if(i == 0x40){
		LED1_H2 = 1;LED1_L7 = 0;}delay(PWM);dis_off();
	i = d & 0x80;
	if(i == 0x80){
		LED1_H2 = 1;LED1_L8 = 0;}delay(PWM);dis_off();

} 

void displayHH3 (unsigned char d){ //第3列横向显示程序
	unsigned char i;
	i = d & 0x01;
	if(i == 0x01){
		LED1_H3 = 1;LED1_L1 = 0;}delay(PWM);dis_off();
	i = d & 0x02;
	if(i == 0x02){
		LED1_H3 = 1;LED1_L2 = 0;}delay(PWM);dis_off();
	i = d & 0x04;
	if(i == 0x04){
		LED1_H3 = 1;LED1_L3 = 0;}delay(PWM);dis_off();
	i = d & 0x08;
	if(i == 0x08){
		LED1_H3 = 1;LED1_L4 = 0;}delay(PWM);dis_off();
	i = d & 0x10;
	if(i == 0x10){
		LED1_H3 = 1;LED1_L5 = 0;}delay(PWM);dis_off();
	i = d & 0x20;
	if(i == 0x20){
		LED1_H3 = 1;LED1_L6 = 0;}delay(PWM);dis_off();
	i = d & 0x40;
	if(i == 0x40){
		LED1_H3 = 1;LED1_L7 = 0;}delay(PWM);dis_off();
	i = d & 0x80;
	if(i == 0x80){
		LED1_H3 = 1;LED1_L8 = 0;}delay(PWM);dis_off();

} 

void displayHH4 (unsigned char d){ //第4列横向显示程序
	unsigned char i;
	i = d & 0x01;
	if(i == 0x01){
		LED1_H4 = 1;LED1_L1 = 0;}delay(PWM);dis_off();
	i = d & 0x02;
	if(i == 0x02){
		LED1_H4 = 1;LED1_L2 = 0;}delay(PWM);dis_off();
	i = d & 0x04;
	if(i == 0x04){
		LED1_H4 = 1;LED1_L3 = 0;}delay(PWM);dis_off();
	i = d & 0x08;
	if(i == 0x08){
		LED1_H4