数码管显示
文章目录
一、数码管6位显示数字9
1.效果图

2.代码块
#include<reg52.h> // 头文件
// 定义锁存器控制引脚
sbit dula=P3^4; // 锁存器U2(段选)
sbit wela=P1^6; // 锁存器U2(位选)
// 主函数
void main()
{
// 1.位选控制
wela=1; // 打开位选
P0=0xc0; // 位选3个数码管 1111 1000
wela=0; // 关闭位选
// 2.段选控制
dula=1; // 打开段选
P0=0x6F; // 数码管显示“0” 0011 1111
dula=0; // 关闭段选
// 3.保持
while(1);
}
二、数码管第1位和第6位显示数字7
1.效果图

代码块
#include<reg52.h> // 头文件
// 定义锁存器控制引脚
sbit dula=P3^4; // 锁存器U2(段选)
sbit wela=P1^6; // 锁存器U2(位选)
// 主函数
void main()
{
// 1.位选控制
wela=1; // 打开位选
P0=0xDE; // 位选3个数码管 1111 1000
wela=0; // 关闭位选
// 2.段选控制
dula=1; // 打开段选
P0=0x07; // 数码管显示“0” 0011 1111
dula=0; // 关闭段选
// 3.保持
while(1);
}
三、数码管轮播显示6位
1.效果图

2.代码块
#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
};
// 位选码表 - 6位数码管(低电平选通)
uchar code bit_code[] = {
0xFE, // 1111 1110 - 第1位
0xFD, // 1111 1101 - 第2位
0xFB, // 1111 1011 - 第3位
0xF7, // 1111 0111 - 第4位
0xEF, // 1110 1111 - 第5位
0xDF // 1101 1111 - 第6位
};
// 延时函数
void delay(uint ms) {
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
// 主函数
void main()
{
uchar digit, pos, scan;
while(1)
{
for(digit = 0; digit < 10; digit++) // 轮流显示0到9
{
// 每个数字显示约500ms(100轮扫描 × 6位 × 约0.8ms)
for(scan = 0; scan < 100; scan++)
{
// 快速扫描6位数码管
for(pos = 0; pos < 6; pos++)
{
// 1. 消隐 - 关闭段选
P0 = 0x00;
dula = 1;
dula = 0;
// 2. 位选 - 选中当前位
P0 = bit_code[pos];
wela = 1;
wela = 0;
// 3. 段选 - 发送数字段码
P0 = seg_code[digit];
dula = 1;
dula = 0;
// 4. 延时约1ms(每位显示时间)
delay(1);
}
}
}
}
}
四、数码管轮播显示2位
1.效果图

2.代码块
#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
};
// 位选码表 - 只使用第3位和第4位(低电平选通)
// 位顺序:第1位 第2位 第3位 第4位 第5位 第6位
uchar code bit_code[] = {
0xFB, // 1111 1011 - 第3位亮
0xF7 // 1111 0111 - 第4位亮
};
// 延时函数
void delay(uint ms) {
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
// 主函数
void main()
{
uchar digit, pos, scan;
while(1)
{
for(digit = 0; digit < 10; digit++) // 轮流显示0到9
{
// 每个数字显示约400ms(100轮扫描 × 2位 × 2ms)
for(scan = 0; scan < 100; scan++)
{
// 只扫描第3位和第4位
for(pos = 0; pos < 2; pos++)
{
// 1. 消隐 - 关闭段选
P0 = 0x00;
dula = 1;
dula = 0;
// 2. 位选 - 选中当前位(第3位或第4位)
P0 = bit_code[pos];
wela = 1;
wela = 0;
// 3. 段选 - 发送数字段码
P0 = seg_code[digit];
dula = 1;
dula = 0;
// 4. 延时约2ms(每位显示时间)
delay(2);
}
}
}
}
五、数码管显示123456
1.效果图

2.代码块
#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,
0xFD,
0xFB,
0xF7,
0xEF,
0xDF
// 补充代码
// 1111 1110 -> 第1位(P0.0 置低,其它为高)=> 选中第1位数码管
// 1111 1101 -> 第2位(P0.1 置低)=> 选中第2位数码管
// 1111 1011 -> 第3位(P0.2 置低)=> 选中第3位数码管
// 1111 0111 -> 第4位(P0.3 置低)=> 选中第4位数码管
// 1110 1111 -> 第5位(P0.4 置低)=> 选中第5位数码管
// 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); // 保持一段时间
}
}
}
六、数码管显示13.14.15
1.效果图

2.代码块
#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.
0x86, // 1.
0xDB, // 2.
0xCF, // 3.
0xE6, // 4.
0xED, // 5.
0xFD, // 6.
0x87, // 7.
0xFF, // 8.
0xEF // 9.
};
// 数码管显示位码,对应第1到第6个数码管
uchar code TableWela[] = {
0xfe, // 第1位
0xfd, // 第2位
0xfb, // 第3位
0xf7, // 第4位
0xef, // 第5位
0xdf // 第6位
};
// 延时函数
void delay(uchar x)
{
uchar j;
while(x--)
{
for(j = 0; j < 125; j++);
}
}
void main() {
uchar i;
// ====================== 这里改成 1 3 . 1 4 . 1 5 ==================
// 6位数码管显示:1 3 1 4 1 5
uchar displayData[6] = {1, 3, 1, 4, 1, 5};
// 小数点:第2位、第4位点亮 → 显示 13.14.15
uchar pointFlag[6] = {0, 1, 0, 1, 0, 0};
// =================================================================
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);
}
}
}

934

被折叠的 条评论
为什么被折叠?



