作业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); // 稍作延时
        }
    }
}
相关推荐
老k一步步来8 小时前
STM32 HAL库CAN通信核心函数详解,参数以及作用
stm32·单片机·嵌入式硬件
gwf2168 小时前
SSD读写速度深度解析:顺序读写vs随机读写、IOPS、延迟,你的硬盘性能到底怎么看?
git·嵌入式硬件·缓存·github·智能硬件
Freak嵌入式11 小时前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
wuyk55512 小时前
77.嵌入式 C 语言中 enum 枚举的工程化实践:告别魔法数字,提升代码可维护性
c语言·开发语言·stm32·单片机·嵌入式硬件
义嘉泰12 小时前
XT25F128F-W Flash芯片全面解析
人工智能·嵌入式硬件·芯片
QH1392923188012 小时前
Keysight N9917B N9918B手持式综合微波分析仪
网络·科技·嵌入式硬件·集成测试·信息与通信
longxingiot13 小时前
轻量化单片机数传终端降低物联网开发门槛
单片机·嵌入式硬件·物联网
国产HT1621B14 小时前
YL1650 LED驱动芯片详解:从原理到实战应用(附51单片机驱动代码)
stm32·单片机·嵌入式硬件·mcu·fpga开发·lcd驱动
BUG研究员_14 小时前
51单片机UART串口通信波特率产生过程
单片机·嵌入式硬件·51单片机