【单片机】实验:数码管显示实验

发布时间 2023-11-17 16:22:57作者: 萌狼蓝天

STC89C5xRC


#include <STC89C5xRC.H>
unsigned char value[21] ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','P','U','T','Y','L'};//可显示内容
unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x3E,0x31,0x6E,0x38}; //显示内容对应字段码
unsigned char where[] = {0,1,2,3,4,5,6,7};//灯的位置

// 延时函数,delay_time是延时的毫秒数
void delay(unsigned int delay_time) {
    unsigned int i, j;
    for (i = 0; i < delay_time; i++) {
        for (j = 0; j < 1000; j++) {};
    }
}

//输入内容,获得索引
int LED_value_index(char content){
	 switch (content) {
        case '0': return 0;
        case '1': return 1;
        case '2': return 2;
        case '3': return 3;
        case '4': return 4;
        case '5': return 5;
        case '6': return 6;
        case '7': return 7;
        case '8': return 8;
        case '9': return 9;
        case 'A': return 10;
        case 'B': return 11;
        case 'C': return 12;
        case 'D': return 13;
        case 'E': return 14;
        case 'F': return 15;
        case 'P': return 16;
        case 'U': return 17;
        case 'T': return 18;
        case 'Y': return 19;
        case 'L': return 20;
        default: return 0; // 如果未找到,返回0
    };
}
//根据索引,获得字段码
char LED_value_code(int index){
	return led[index];
}

//整合_实现输入内容,获得字段码
char LED_value(char content){
	return LED_value_code(LED_value_index(content));
}
//输入要显示的位置:0-7 返回位置码
char LED_where(int w){
	return where[w];
}
// 依次显示1到9
void result_light_1_to_9(){
	int i;
	for(i = 0;i<8;i++){
		P2 = led[i];//P2 控制LED显示的内容  unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
		P1 = where[i]	;//P1 控制要显示内容的LED的位置
		delay(10);
	}
}

void my_birth_day() {
  int dy = 1000;
	P2 = LED_value('2');
	P1 = LED_where(7);
	delay(dy);
	P2 = LED_value('0');
	P1 = LED_where(6);
	delay(dy);
	P2 = LED_value('0');
	P1 = LED_where(5);
	delay(dy);
	P2 = LED_value('1');
	P1 = LED_where(4);
	delay(dy);
	P2 = LED_value('1');
	P1 = LED_where(3);
	delay(dy);
	P2 = LED_value('0');
	P1 = LED_where(2);
	delay(dy);
	P2 = LED_value('2');
	P1 = LED_where(1);
	delay(dy);
	P2 = LED_value('4');
	P1 = LED_where(0);
	delay(dy);
	P2 = LED_value('H');
	P1 = LED_where(4);
	delay(dy);
	P2 = LED_value('A');
	P1 = LED_where(3);
	delay(dy);
	P2 = LED_value('A');
	P1 = LED_where(2);
	delay(dy);
	P2 = LED_value('P');
	P1 = LED_where(1);
	delay(dy);
	P2 = LED_value('Y');
	P1 = LED_where(0);
	delay(dy);
  }
void main() {
    while(1) {
			my_birth_day()  ;
			//result_light_1_to_9();
    }
}

相关视频:
[单片机]实验:数码管显示器使用
https://www.bilibili.com/video/BV12C4y1j7vW/

[单片机]如何在实体设备上运行自己编写的代码
https://www.bilibili.com/video/BV16b4y1M76t

由于实验只能在实验室进行,课后我没法进行实验,所以后文采用了仿真的方式来模拟实验。

仿真实验

原理图

image

image

代码如下

#include <REGX52.H>
// 数字1-9在七段显示器上的表示(共阳极七段显示器)  
unsigned char value[22] ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','P','U','T','Y','L','H'};
unsigned char led[22] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x3E,0x31,0x6E,0x38,0x76}; //灯的内容
unsigned char where[] = {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE};//灯的位置
//unsigned char where[] = {0,1,2,3,4,5,6,7};//灯的位置


// 延时函数,delay_time是延时的毫秒数
void delay(unsigned int delay_time) {
    unsigned int i, j;
    for (i = 0; i < delay_time; i++) {
        for (j = 0; j < 1000; j++) {};
    }
}


//输入内容,获得索引
int LED_value_index(char content){
	 switch (content) {
        case '0': return 0;
        case '1': return 1;
        case '2': return 2;
        case '3': return 3;
        case '4': return 4;  
        case '5': return 5;  
        case '6': return 6;  
        case '7': return 7;  
        case '8': return 8;  
        case '9': return 9;  
        case 'A': return 10;  
        case 'B': return 11;  
        case 'C': return 12;  
        case 'D': return 13;  
        case 'E': return 14;  
        case 'F': return 15;  
        case 'P': return 16;  
        case 'U': return 17;  
        case 'T': return 18;  
        case 'Y': return 19;  
        case 'L': return 20;  
				case 'H': return 21;  
        default: return -1; // 如果未找到,返回-1  
    };
}
//根据索引,获得字段码
char LED_value_code(int index){
	return led[index];
}

//整合_实现输入内容,获得字段码
char LED_value(char content){
	return LED_value_code(LED_value_index(content));
}


//输入要显示的位置:0-7 返回位置码
char LED_where(int w){
	return where[w];
}

void result_light_1_to_9(){
	int i;
	for(i = 0;i<8;i++){
		P2 = led[i];//P2 控制LED显示的内容  
		P3 = where[i]	;//P3 控制要显示内容的LED的位置
		delay(10);
	}
}

void result_light_1_to_9_long(){
		int i,j;
	for(i = 0;i<8;i++){
		for(j=0;j<22;j++){
			P2 = LED_value_code(j);
			P3 = LED_where(i);
			delay(10);
	}
}
}
void my_birth_day() {
  int dy = 50;
	P2 = LED_value('2');
	P3 = LED_where(7);
	delay(dy);
	P2 = LED_value('0');
	P3 = LED_where(6);
	delay(dy);
	P2 = LED_value('0');
	P3 = LED_where(5);
	delay(dy);
	P2 = LED_value('1');
	P3 = LED_where(4);
	delay(dy);
	P2 = LED_value('1');
	P3 = LED_where(3);
	delay(dy);
	P2 = LED_value('2');
	P3 = LED_where(2);
	delay(dy);
	P2 = LED_value('0');
	P3 = LED_where(1);
	delay(dy);
	P2 = LED_value('8');
	P3 = LED_where(0);
	delay(dy);
	P2 = LED_value('H');
	P3 = LED_where(4);
	delay(dy);
	P2 = LED_value('A');
	P3 = LED_where(3);
	delay(dy);
	P2 = LED_value('P');
	P3 = LED_where(2);
	delay(dy);
	P2 = LED_value('P');
	P3 = LED_where(1);
	delay(dy);
	P2 = LED_value('Y');
	P3 = LED_where(0);
	delay(dy);
  }
void main() {
    while(1) {
			my_birth_day()  ;
			delay(100);
			result_light_1_to_9();
			delay(100);
			result_light_1_to_9_long();
			delay(100);
    }
}