数码管动态显示
静态与动态显示
动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
数组的定义与引用
数组是一组有序数据的集合,数组中每一个数据都是同一数据类型。数组中的元素可以用数组名和下标来唯一确定。
数组的一般格式定义如下:
数据类型 数组名[常量表达式] = {元素表};
例如:
unsigned char tabel[3] = [0x3F, 0x06, 0x5B,];
P0 = tabel[0]; // P0此时的值为0x3F
数码管动态显示数字 123
sbit DU = P2^6;
//数码管段选
sbit WE = P2^7;
//数码管段选
// 毫秒级延时函数定义
void delay(uint z) {
// 毫秒级延时函数定义
uint x, y;
for (x = z; x > 0; x--) {
for (y = 114; y > 0; y--) {
}
}
}
void main() {
// main函数自身会循环
while(1) {
/*第一位显示 数字 1*/
P0 = 0XFF;
// 清除断码 如果没有为P0 初始化赋值 0XFF,那么 P0的值会是上一个打开段选锁存器过程中赋予的值,执行到这里 会把段选值赋给锁存器中P0,导致数码管显示错误。
WE = 1;
// 打开位选锁存器
P0 = 0XFE;
// 1111 1110 选通第一位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0;
// 锁存位选数据
DU = 1;
// 打开段选锁存器
P0 = 0X06;
// 0000 0110 显示“1”
DU = 0;
// 锁存段选数据
delay(5);
// 对每次数码管的切换进行 5毫秒延时操作
/*第二位显示 数字 2*/
P0 = 0XFF;
// 清除断码
WE = 1;
// 打开位选锁存器
P0 = 0XFD;
// 1111 1101 选通第二位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0;
// 锁存位选数据
DU = 1;
// 打开段选锁存器
P0 = 0X5B;
// 0101 1011 显示“2”
DU = 0;
// 锁存段选数据
delay(5);
/*第三位显示 数字 3*/
P0 = 0XFF;
// 清除断码
WE = 1;
// 打开位选锁存器
P0 = 0XFB;
// 1111 1011 选通第三位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0;
// 锁存位选数据
DU = 1;
// 打开段选锁存器
P0 = 0X4F;
// 0100 1111 显示“3”
DU = 0;
// 锁存段选数据
delay(5);
}
}
数码管动态显示数字 123 (代码优化)
//包含51头文件
//包含移位标准库函数头文件
sbit DU = P2^6;
//数码管段选
sbit WE = P2^7;
//数码管段选
//共阴数码管段选表0-9
uchar code tabel[]= {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
}
;
/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z) {
uint x,y;
for (x = z; x > 0; x--)
for (y = 114; y > 0 ; y--);
}
/*====================================
函数 :display(uchar i)
参数 :i 显示数值,取值范围0-255
返回值 :无
描述 :三位共阴数码管动态显示
====================================*/
void display(uchar i) {
uchar bai, shi, ge;
bai = i / 100;
//236 / 100 = 2
shi = i % 100 / 10;
//236 % 100 / 10 = 3
ge = i % 10;
//236 % 10 =6
//第一位数码管
P0 = 0XFF;
//清除断码
WE = 1;
//打开位选锁存器
P0 = 0XFE;
//1111 1110
WE = 0;
//锁存位选数据
DU = 1;
//打开段选锁存器
P0 = tabel[bai];
//
DU = 0;
//锁存段选数据
delay(5);
//第二位数码管
P0 = 0XFF;
//清除断码
WE = 1;
//打开位选锁存器
P0 = 0XFD;
//1111 1101
WE = 0;
//锁存位选数据
DU = 1;
//打开段选锁存器
P0 = tabel[shi];
//
DU = 0;
//锁存段选数据
delay(5);
//第三位数码管
P0 = 0XFF;
//清除断码
WE = 1;
//打开位选锁存器
P0 = 0XFB;
//1111 1011
WE = 0;
//锁存位选数据
DU = 1;
//打开段选锁存器
P0 = tabel[ge];
//
DU = 0;
//锁存段选数据
delay(5);
}
void main()//main函数自身会循环 {
while(1) {
display(123);
//数码管显示函数
}
}
数码管动态显示数字 12345678 (代码优化)
//包含51头文件
//包含移位标准库函数头文件
sbit DU = P2^6;
//数码管段选
sbit WE = P2^7;
//数码管段选
//共阴数码管段选表0-9
uchar code tabel[]= {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
}
;
/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z) {
uint x,y;
for (x = z; x > 0; x--)
for (y = 114; y > 0 ; y--);
}
/*====================================
描述 :八位共阴数码管动态显示
====================================*/
void display(uchar num1, uchar num2, uchar num3, uchar num4, uchar num5, uchar num6, uchar num7, uchar num8) {
/*第一位显示*/
P0 = 0XFF;
//清除断码
WE = 1;
//打开位选锁存器
P0 = 0XFE;
//1111 1110
WE = 0;
//锁存位选数据
DU = 1;
//打开段选锁存器
P0 = tabel[num1];
//
DU = 0;
//锁存段选数据
delay(1);
/*第二位显示*/
P0 = 0XFF;
//清除断码
WE = 1;
//打开位选锁存器
P0 = 0XFD;
//1111 1101
WE = 0;
//锁存位选数据
DU = 1;
//打开段选锁存器
P0 = tabel[num2];
//
DU = 0;
//锁存段选数据
delay(1);
/*第三位显示*/
P0 = 0XFF;
//清除断码
WE = 1;
//打开位选锁存器
P0 = 0XFB;
//1111 1011
WE = 0;
//锁存位选数据
DU = 1;
//打开段选锁存器
P0 = tabel[num3];
//
DU = 0;
//锁存段选数据
delay(1);
/*第四位显示*/
P0 = 0XFF;
// 清除断码
WE = 1;
// 打开位选锁存器
P0 = 0XF7;
// 1111 0111 选通第四位数码管
WE = 0;
// 锁存位选数据
DU = 1;
// 打开段选锁存器
P0 = tabel[num4];
//
DU = 0;
// 锁存段选数据
delay(1);
/*第五位显示*/
P0 = 0XFF;
// 清除断码
WE = 1;
// 打开位选锁存器
P0 = 0XEF;
// 1110 1111 选通第五位数码管
WE = 0;
// 锁存位选数据
DU = 1;
// 打开段选锁存器
P0 = tabel[num5];
//
DU = 0;
// 锁存段选数据
delay(1);
/*第六位显示*/
P0 = 0XFF;
// 清除断码
WE = 1;
// 打开位选锁存器
P0 = 0XDF;
// 1101 1111 选通第六位数码管
WE = 0;
// 锁存位选数据
DU = 1;
// 打开段选锁存器
P0 = tabel[num6];
//
DU = 0;
// 锁存段选数据
delay(1);
/*第七位显示*/
P0 = 0XFF;
// 清除断码
WE = 1;
// 打开位选锁存器
P0 = 0XBF;
// 1011 1111 选通第七位数码管
WE = 0;
// 锁存位选数据
DU = 1;
// 打开段选锁存器
P0 = tabel[num7];
//
DU = 0;
// 锁存段选数据
delay(1);
/*第八位显示*/
P0 = 0XFF;
// 清除断码
WE = 1;
// 打开位选锁存器
P0 = 0X7F;
// 0111 1111 选通第八位数码管
WE = 0;
// 锁存位选数据
DU = 1;
// 打开段选锁存器
P0 = tabel[num8];
DU = 0;
// 锁存段选数据
delay(1);
}
void main()//main函数自身会循环 {
while(1) {
display(1, 2, 3, 4, 5, 6, 7, 8);
//数码管显示函数
}
}