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

STC89C5xRC


#include <STC89C5xRC.H>
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[] = {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 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];
}
// 依次显示0-7
void result_light_0_to_7(){
	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_0_to_7();
    }
}

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

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

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

仿真实验

原理图

image

image

代码如下

#include <REGX52.H>

//需要复制代码的话 请去 博客园(https://cnblogs.com/mllt)获取
/*

博客园:萌狼蓝天

CSDN:萌狼蓝天  (文章都是从博客园自动同步过去的,可能会存在格式问题,建议去博客园查看)

哔哩哔哩:萌狼蓝天 (视频首发平台 | 可以私信)

抖音:弃文从理萌狼蓝天 (经常不在线)

快手:萌狼蓝天 (经常不在线)

小红书:弃文从理萌狼蓝天 (经常不在线)

*/

//可以显示的字符
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};//灯的位置


// 延时函数
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 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];
}





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

//每个位置都把所有字符显示一遍
void result_every_where(){
		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_0_to_7();
			delay(100);
			result_every_where();
			delay(100);
    }  
}

[单片机]数码管显示器仿真效果展示:
https://www.bilibili.com/video/BV12u411F7cL/

posted @ 2023-11-17 16:19  萌狼蓝天  阅读(34)  评论(0编辑  收藏  举报