历史上的今天
返回首页

历史上的今天

今天是:2025年10月20日(星期一)

正在发生

2022年10月20日 | STC89C52单片机 数码管动态显示

2022-10-20 来源:csdn

数码管动态显示

静态与动态显示

动态显示

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


数组的定义与引用

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


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


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


例如:

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

}

}

推荐阅读

史海拾趣

GardTec Inc公司的发展小趣事

背景:为了满足全球客户的需求,GardTec开始实施全球化战略,在亚洲和美国等地设立全球制造厂和库存地。

发展:通过在全球范围内的战略布局,GardTec不仅提升了产品的供应效率,还更好地服务了世界各地的客户。公司的全球化布局进一步巩固了其在风扇配件市场的领先地位。

影响:全球化战略的实施,使得GardTec的产品能够迅速响应市场变化,满足不同地区客户的多样化需求,从而增强了公司的市场竞争力。

CHERRY公司的发展小趣事

1953年,一位名叫Walter Lorain CHERRY的德国年轻人在美国创立了Cherry公司,地点选在了一家餐厅的地下室。当时,Cherry的主要业务是生产微动开关,这种开关被广泛应用于各种电子设备中。Cherry的微动开关因其高品质和可靠性而赢得了市场的广泛认可,逐渐成为了行业内的佼佼者。

DECON公司的发展小趣事

随着公司规模的扩大和市场份额的增加,DECON公司开始积极拓展国际市场。公司成立了专门的海外市场部,积极参加国际电子展会和论坛,与全球各地的客户建立了紧密的合作关系。同时,DECON还与国际知名电子企业展开合作,共同开发新产品,推动了公司的国际化进程。

灿科盟(Ckmtw)公司的发展小趣事

作为一家专注于连接器产品的企业,灿科盟始终注重技术创新和产品升级。近年来,公司在LED连接器部件生产领域取得了重要突破,成功打破了国外技术垄断。这一技术突破不仅提升了公司的市场竞争力,也为客户提供了更加优质的产品和服务。同时,公司还加大了对新能源、智能家居等新兴领域的研究和开发力度,以应对市场变化和挑战。

DURABLE公司的发展小趣事

在电子材料领域取得初步成功后,DURABLE公司意识到市场拓展的重要性。公司开始积极拓展海外市场,与全球知名电子产品制造商建立合作关系。通过深入了解不同地区的市场需求和消费者偏好,DURABLE不断调整产品策略,推出符合当地市场需求的产品。同时,公司还加强了与渠道合作伙伴的合作,通过完善的销售网络和售后服务体系,提升了产品的市场占有率和客户满意度。

超音(CY)公司的发展小趣事

品质是超音一直以来的追求。公司注重产品质量管理,建立了完善的质量检测体系,确保每一件产品都符合高标准的质量要求。同时,超音还加强了品牌建设,通过广告宣传、赞助活动等方式提升品牌知名度和美誉度。这些努力使得超音在消费者心中树立了良好的品牌形象,为公司的长期发展奠定了坚实的基础。

问答坊 | AI 解惑

RFID技术在物流配送中的应用

21世纪的全球商业竞争已不仅是超越了技术、成本和管理等领域的单项角逐,更是各全球供应链优劣高下的综合竞争。各跨国商业零售巨鳄们对其供应链战略、规划、运营管理、分销中心规划、仓库规划等等,不惜投入巨资,运用当今最先进的科学技术,建立快 ...…

查看全部问答>

开关电源测试方法

一. 耐电压   (HI.POT,ELECTRIC STRENGTH ,DIELECTRIC VOLTAGE WITHSTAND)KV   1.1 定义:于指定的端子间,例如:I/P-O/P,I/P-FG,O/P-FG间,可耐交流之有效值,漏电流一般可容许10毫安,时间1分钟。   1.2 测试条件:Ta:25℃;RH:室内湿度 ...…

查看全部问答>

晶体振荡器选用指南

晶体振荡器选用指南…

查看全部问答>

threadstart???

//        CSerialPDD::PostInit();         CeSetPriority(m_dwPriority256); //        RETAILMSG(1,(TEXT(\"m_dwPriority256 current = %d\\n\"),CeGetThreadPriority(GetCurren ...…

查看全部问答>

找兼职windows mobile

找兼职   Win Mobile 开发人员      地点:上海   MSN:  bbbcow604610@hotmail.com …

查看全部问答>

我有几个关于EVC的问题请教

我有几个关于EVC的问题请教 1.EVC开发的程序能不能用在M5上,如果能用发布时应注意些什么 2.我开发了一个EVC程序用于PPC2003的,但有些客户用在M5上没有问题,有些客户就是无法使用PULL下载数据。服务器端的IIS和CE都配置了,在服务器端及PDA的 ...…

查看全部问答>

Protel.PCB.转SCH全攻略

Protel.PCB.转SCH全攻略…

查看全部问答>

仿真器与编程器的接口释疑

对于MSP430 来说,无论仿真还是烧写程序一般可以通过:JTAG/SBW/BSL 接口进行,这些并不代表哪个型号的编程器和仿真器,一般JTAG/SBW 接口用于仿真接口,BSL 不能用于仿真,只能用于编程。编程器则三种接口都支持。所以并不能说 JTAG只支持仿真 ...…

查看全部问答>