作业2:6位数码管静态显示

文章目录

1.数码管显示6个9

1.1效果图

1.2代码

c 复制代码
#include<reg52.h>  // 头文件

// 定义锁存器控制引脚
sbit dula=P3^4;	// 锁存器U2(段选)
sbit wela=P1^6;	// 锁存器U2(位选)


// 共阴极 0~9
//unsigned char code seg_table[] = {
 //   0x3F,  // 0
 //   0x06,  // 1
//    0x5B,  // 2
//    0x4F,  // 3
//    0x66,  // 4
//    0x6D,  // 5
//    0x7D,  // 6
//    0x07,  // 7
//    0x7F,  // 8
//    0x6F   // 9
//};
// 主函数
void main()
{
	// 1.位选控制
	wela=1;	 // 打开位选
	P0=0xc0; //1100 00 00 
	wela=0;	 // 关闭位选
	
	// 2.段选控制
	dula=1;	 //	打开段选
	P0=0x6f; // 数码管显示"7"  0110 1111
	dula=0;	 // 关闭段选

	// 3.保持
	while(1);
}

2 数码管显示2个7(一头一尾)

2.1 效果图

2.2 代码

c 复制代码
#include<reg52.h>  // 头文件

// 定义锁存器控制引脚
sbit dula=P3^4;	// 锁存器U2(段选)
sbit wela=P1^6;	// 锁存器U2(位选)


// 共阴极 0~9
//unsigned char code seg_table[] = {
 //   0x3F,  // 0
 //   0x06,  // 1
//    0x5B,  // 2
//    0x4F,  // 3
//    0x66,  // 4
//    0x6D,  // 5
//    0x7D,  // 6
//    0x07,  // 7
//    0x7F,  // 8
//    0x6F   // 9
//};
// 主函数
void main()
{
	// 1.位选控制
	wela=1;	 // 打开位选
	P0=0xde; //1101 1110 
	wela=0;	 // 关闭位选
	
	// 2.段选控制
	dula=1;	 //	打开段选
	P0=0x07; // 数码管显示"7"  0110 1111
	dula=0;	 // 关闭段选

	// 3.保持
	while(1);
}

3.数码管轮播显示6位

3.1 效果图

3.2 代码

c 复制代码
#include<reg52.h>  // 头文件

#define uchar unsigned char
#define uint unsigned int

// 定义锁存器控制引脚
sbit dula=P3^4;	// 锁存器U2(段选)
sbit wela=P1^6;	// 锁存器U3(位选)

// 共阴极数码管段码表
uchar code seg_code[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 延时函数
void delay(uint ms) {
    uint i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}

// 数码管展示函数
void display_digit(uchar digit) {
    P0 = seg_code[digit];  // 发送数字对应的段码
    dula=1;	 //	打开段选
    delay(5); // 稳定信号
    dula=0;	 // 关闭段选
}

// 主函数
void main()
{
	uchar digit;
    while(1) 
	{
		// 1.位选控制
		wela=1;	 // 打开位选
		P0=0xc0; // 位选2个数码管 1111 0011
		wela=0;	 // 关闭位选

		// 2.段选控制
        for(digit = 0; digit < 10; digit++) // 轮流显示0到9 
		{  
            display_digit(digit);  // 显示当前数字
            delay(500);  // 适当延时,以便观察每个数字
        }
    }
}

4.数码管轮播显示2位

效果图

代码

c 复制代码
#include<reg52.h>  // 头文件

#define uchar unsigned char
#define uint unsigned int

// 定义锁存器控制引脚
sbit dula=P3^4;	// 锁存器U2(段选)
sbit wela=P1^6;	// 锁存器U3(位选)

// 共阴极数码管段码表
uchar code seg_code[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 延时函数
void delay(uint ms) {
    uint i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}

// 数码管展示函数
void display_digit(uchar digit) {
    P0 = seg_code[digit];  // 发送数字对应的段码
    dula=1;	 //	打开段选
    delay(5); // 稳定信号
    dula=0;	 // 关闭段选
}

// 主函数
void main()
{
	uchar digit;
    while(1) 
	{
		// 1.位选控制
		wela=1;	 // 打开位选
		P0=0xf3; // 位选2个数码管 1111 0011
		wela=0;	 // 关闭位选

		// 2.段选控制
        for(digit = 0; digit < 10; digit++) // 轮流显示0到9 
		{  
            display_digit(digit);  // 显示当前数字
            delay(500);  // 适当延时,以便观察每个数字
        }
    }
}

# 5.6位数码管依次显示数字0-5【动态显示】
## 5.1效果图
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3d25ba7b06584ba88f55dd4c74976873.png)

## 5.2代码

```c
#include <reg52.h>  // 头文件						   ```c

#define uchar unsigned char
#define uint unsigned int

// 定义锁存器控制引脚
sbit dula = P3^4;	// 段选锁存器U2
sbit wela = P1^6;	// 位选锁存器U3

// 数码管的段码表(定义0-9的段码)
uchar code TableDula[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 数码管显示位码,对应第1到第6个数码管(需要将2进制转换成16进制)
uchar code TableWela[] = {
// 补充代码
    0xfe,// 1111 1110 -> 第1位(P0.0 置低,其它为高)=> 选中第1位数码管
    0xfd,// 1111 1101 -> 第2位(P0.1 置低)=> 选中第2位数码管
    0xfb,// 1111 1011 -> 第3位(P0.2 置低)=> 选中第3位数码管
    0xf7,// 1111 0111 -> 第4位(P0.3 置低)=> 选中第4位数码管
    0xef,// 1110 1111 -> 第5位(P0.4 置低)=> 选中第5位数码管
    0xdf// 1101 1111 -> 第6位(P0.5 置低)=> 选中第6位数码管
};

// 延时函数
void delay(uchar x)
{
    uchar j;
    while(x--)
     {
        for(j=0;j<125;j++);
     }   
}

// 主函数
void main() {
    uchar i;
    while(1) {
        for(i = 0; i < 6; i++) {
            P0 = 0x00;           // 清空之前的输出
            dula = 0;
            wela = 0;

			P0 = TableWela[i];   // 先送位码,依次选中1-6位数码管
            wela = 1;            // 锁存位码
            wela = 0;

            P0 = TableDula[i];   // 再送段码,第1个数码管显示0,第2个数码管显示1...
            dula = 1;            // 锁存段码
            dula = 0;

            delay(2);            // 保持一段时间
        }
    }
}
复制代码
# 6. 如何使数码管依次显示1-6
## 6.1效果图
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/003814a55378464c971914a25bfa6d9b.png)

## 6.2代码

```c
#include <reg52.h>  // 头文件						   ```c

#define uchar unsigned char
#define uint unsigned int

// 定义锁存器控制引脚
sbit dula = P3^4;	// 段选锁存器U2
sbit wela = P1^6;	// 位选锁存器U3

// 数码管的段码表(定义0-9的段码)
uchar code TableDula[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 数码管显示位码,对应第1到第6个数码管(需要将2进制转换成16进制)
uchar code TableWela[] = {
// 补充代码
    0xfe,// 1111 1110 -> 第1位(P0.0 置低,其它为高)=> 选中第1位数码管
    0xfd,// 1111 1101 -> 第2位(P0.1 置低)=> 选中第2位数码管
    0xfb,// 1111 1011 -> 第3位(P0.2 置低)=> 选中第3位数码管
    0xf7,// 1111 0111 -> 第4位(P0.3 置低)=> 选中第4位数码管
    0xef,// 1110 1111 -> 第5位(P0.4 置低)=> 选中第5位数码管
    0xdf// 1101 1111 -> 第6位(P0.5 置低)=> 选中第6位数码管
};

// 延时函数
void delay(uchar x)
{
    uchar j;
    while(x--)
     {
        for(j=0;j<125;j++);
     }   
}

// 主函数
void main() {
    uchar i;
    while(1) {
        for(i = 0; i < 6; i++) {
            P0 = 0x00;           // 清空之前的输出
            dula = 0;
            wela = 0;

			P0 = TableWela[i];   // 先送位码,依次选中1-6位数码管
            wela = 1;            // 锁存位码
            wela = 0;

            P0 = TableDula[i+1];   // 再送段码,第1个数码管显示0,第2个数码管显示1...
            dula = 1;            // 锁存段码
            dula = 0;

            delay(2);            // 保持一段时间
        }
    }
}

7.数位管闪烁显示

7.1效果图

7.2代码

c 复制代码
#include <reg52.h>  // 头文件						   ```c

#define uchar unsigned char
#define uint unsigned int

// 定义锁存器控制引脚
sbit dula = P3^4;	// 段选锁存器U2
sbit wela = P1^6;	// 位选锁存器U3

// 数码管的段码表(定义0-9的段码)
uchar code TableDula[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 数码管显示位码,对应第1到第6个数码管(需要将2进制转换成16进制)
uchar code TableWela[] = {
// 补充代码
    0xfe,// 1111 1110 -> 第1位(P0.0 置低,其它为高)=> 选中第1位数码管
    0xfd,// 1111 1101 -> 第2位(P0.1 置低)=> 选中第2位数码管
    0xfb,// 1111 1011 -> 第3位(P0.2 置低)=> 选中第3位数码管
    0xf7,// 1111 0111 -> 第4位(P0.3 置低)=> 选中第4位数码管
    0xef,// 1110 1111 -> 第5位(P0.4 置低)=> 选中第5位数码管
    0xdf// 1101 1111 -> 第6位(P0.5 置低)=> 选中第6位数码管
};

// 延时函数
void delay(uchar x)
{
    uchar j;
    while(x--)
     {
        for(j=0;j<125;j++);
     }   
}
void all_off(void)
{
    P0 = 0x00;
    dula = 1; dula = 0;
    P0 = 0x00;
    wela = 1; wela = 0;
}

// 主函数
void main() {
    uchar i;
    while(1) {
        for(i = 0; i < 6; i++) {
            P0 = 0x00;           // 清空之前的输出

			P0 = TableWela[i];   // 先送位码,依次选中1-6位数码管
            wela = 1;            // 锁存位码
            wela = 0;
			delay(500);

            P0 = TableDula[i+1];   // 再送段码,第1个数码管显示0,第2个数码管显示1...
            dula = 1;            // 锁存段码
            dula = 0;
			delay(100)

                       // 保持一段时间
        }
    }
}

8. 6位数码管依次显示数字11.12.13【动态显示】

8.1 效果图

8.2 代码

c 复制代码
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit dula = P3^4; // 段选锁存器
sbit wela = P1^6; // 位选锁存器

// 数码管的段码表(0~9)
uchar code TableDula[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 数码管段码表(0~9,带小数点)
uchar code TableDulaPoint[] = {
    0xBF, // 0. => 10111111
    // 补充代码
    0x86,// 1. => 10000110
    0xDB,// 2. => 1101 1011
    0xCF,// 3. => 11001111
     0xE6,// 4. => 11100110
   0xED,// 5. => 11101101
     0xFD,// 6. => 11111101
     0x87,// 7. => 10000111
   0xFF,// 8. => 11111111
     0xEF// 9. => 11101111
};


// 数码管显示位码,对应第1到第6个数码管
uchar code TableWela[] = {
    0xfe, // 1111 1110 -> 第1位(P0.0 置低,其它为高)=> 选中第1位数码管
    0xfd, // 1111 1101 -> 第2位(P0.1 置低)=> 选中第2位数码管
    0xfb, // 1111 1011 -> 第3位(P0.2 置低)=> 选中第3位数码管
    0xf7, // 1111 0111 -> 第4位(P0.3 置低)=> 选中第4位数码管
    0xef, // 1110 1111 -> 第5位(P0.4 置低)=> 选中第5位数码管
    0xdf  // 1101 1111 -> 第6位(P0.5 置低)=> 选中第6位数码管
};


// 延时函数
void delay(uchar x)
{
    uchar j;
    while(x--)
    {
        for(j = 0; j < 125; j++);
    }
}

void main() {
    uchar i;

    // 显示数据:对应的数字内容
    uchar displayData[6] = {1, 3, 1, 4, 1, 5};

    // 小数点标志位:1表示该位需要小数点
    uchar pointFlag[6] = {0, 1, 0, 1, 0, 0}; // 第2位和第4位显示带小数点

    while(1) {
        for(i = 0; i < 6; i++) {
            P0 = 0x00; // 清除显示
            dula = 0;
            wela = 0;

            // 位选
            P0 = TableWela[i];
            wela = 1;
            wela = 0;

            // 段码:判断是否需要小数点
            if(pointFlag[i] == 1)
			{
				P0 = TableDulaPoint[displayData[i]];
			}
            else
			{
			   P0 = TableDula[displayData[i]];
			}      

            dula = 1;
            dula = 0;

            delay(2); // 稍作延时
        }
    }
}
相关推荐
不做无法实现的梦~2 小时前
STM32解析PPM协议
stm32·单片机·嵌入式硬件
czhaii3 小时前
基于Arm Cortex-M7内核GD32H7
单片机·嵌入式硬件
wanghanjiett3 小时前
双轮平衡车建模及控制 2 PID控制原理与调参
嵌入式硬件·控制算法
EVERSPIN4 小时前
SQPI PSRAM为单片机提供RAM扩展方案
单片机·嵌入式硬件·psram·sqpi psram
Ar-Sr-Na4 小时前
STM32现代化AI开发指南-VSCode环境配置(macOS)
c语言·人工智能·vscode·stm32·嵌入式硬件·硬件工程
进击的小头4 小时前
第6篇:嵌入式芯片算力核心来源:多级流水线架构与指令并行机制详解
单片机·嵌入式硬件·架构
jacklood4 小时前
煤矿用甲烷报警仪的性能试验具体方法
单片机·嵌入式硬件·煤矿电子
不做无法实现的梦~5 小时前
px4仿真和示例运行
单片机·嵌入式硬件
世微 如初5 小时前
AP5125 宽压大功率 LED 恒流驱动器:技术参数与应用设计指南
stm32·单片机·嵌入式硬件