STC89C52单片机 数码管动态显示

发布者:technology78最新更新时间:2022-10-20 来源: csdn关键字:STC89C52  单片机  数码管  动态显示 手机看文章 扫描二维码
随时随地手机看文章

数码管动态显示

静态与动态显示

动态显示

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。


数组的定义与引用

数组是一组有序数据的集合,数组中每一个数据都是同一数据类型。数组中的元素可以用数组名和下标来唯一确定。


数组的一般格式定义如下:


数据类型 数组名[常量表达式] = {元素表};


例如:

unsigned char tabel[3] = [0x3F, 0x06, 0x5B,];

P0 = tabel[0]; // P0此时的值为0x3F


数码管动态显示数字 123

#include

#include


#define uint unsigned int

#define uchar unsigned char


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 (代码优化)

#include //包含51头文件

#include //包含移位标准库函数头文件


#define uint unsigned int

#define uchar unsigned char


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 (代码优化)

#include //包含51头文件

#include //包含移位标准库函数头文件


#define uint unsigned int

#define uchar unsigned char


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); //数码管显示函数

}

}

关键字:STC89C52  单片机  数码管  动态显示 引用地址:STC89C52单片机 数码管动态显示

上一篇:STC89C52单片机 独立键盘
下一篇:STC89C52单片机 数码管静态显示

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved