使用C语言编写数码管动态显示程序。头文件为reg52,h,数码管接P2口,为共阴

使用C语言编写数码管动态显示程序。头文件为reg52,h,数码管接P2口,为共阴,第1张

#include<reg52.h>//包含头文件,辩液禅一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

sbit LATCH1=P2^2//定义锁存使能端口 段锁存

sbit LATCH2=P2^3// 位锁存

unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}// 显示段码值01234567

unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}//分别对应相应埋让的数码管点亮,即位码

void Delay(unsigned int t)//函数声明

/*------------------------------------------------

主函数

------------------------------------------------*/

main()

{

unsigned char i=0

while(1)

{

DataPort=dofly_WeiMa[i]//取位码

LATCH2=1//位锁存

LATCH2=0

DataPort=dofly_DuanMa[i]//取显示数据,段码

LATCH1=1//段锁存

LATCH1=0

Delay(60000)// 扫描间隙延时,时间太长会闪烁,太短会造成重影,

//这里携尘故意延长时间,方便直观看出动态扫描原理

i++

if(8==i)//检测8位扫描完全结束?如扫描完成则从第一个

//开始再次扫描8位

i=0

}

}

/*------------------------------------------------

延时函数,含有输入参数 unsigned int t,无返回值

unsigned int 是定义无符号整形变量,其值的范围是

0~65535

------------------------------------------------*/

void Delay(unsigned int t)

{

while(--t)

}

如果你的硬件已连接完善,那编程需:

1、动态扫描:在已个 t 时间内(可以是几个ms)选中 1 位数码管,以亮点该位数码管对应的码段,其他关断(不亮);而下一个 t 时间需点亮下一位数码管......以此类推,循环起来。这个 t 可以用定时器准确控制。当然,如果你只是为了实现单纯的3个数码管显示,可以不精确时败并禅间,循环起来就是了(只蔽慎要保证耽搁的显示时间少于肉眼识别时间,就是看起来不会一闪一闪的就行);

2、显示内察尘容:多数情况下,待显示的字符/数字先按数码定义编码,存放在表格中。按自己的编程需要,在显示的时候从表格中提取。当然,如果只是简单实验,显示的内容是固定的,也可以程序里用立即数。

多试一试吧。

#include"reg51.h"

#include "intrins.h" //_nop_()延时函数用

#define uchar unsigned char

#define uint unsigned int

#define SEG_OUTP0 //段码输出口

#define BIT_OUTP2 //扫描口

sbit dot=P2^7 //LED小数点控制

uchar code tab[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf}

/* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */

uchar data dis_buff[8]={1,2,0,0,0,0} //待显示单老拿元数据,共6个数据

unsigned long temp

/*************1毫秒延时程序**************/

delay1ms(int t)

{

int i,j

for(i=0i<空友ti++)

for(j=0j<120j++)

}

//

/***********LED显示动态扫侍亏搭描函数**********/

display()

{

char k

char m=0xfe

for(k=0k<8k++) //8位LED扫描控制

{ BIT_OUT=0xff

SEG_OUT=tab[dis_buff[k]]

BIT_OUT=m

delay1ms(3)

m=(m<<1)|0x01

}

dis_buff[0]=temp/10000000

dis_buff[1]=(temp%10000000)/1000000

dis_buff[2]=(temp%1000000)/100000

dis_buff[3]=(temp%100000)/10000

dis_buff[4]=(temp%10000)/1000

dis_buff[5]=(temp%1000)/100

dis_buff[6]=(temp%100)/10

dis_buff[7]=temp%10

}

/**************初始化程序****************/

void initiation()

{

TMOD=0x01

TH0=-10000/256

TL0=-10000%256 //10MS定时初值(T0计时用)

ET0=1

TR0=1

EA=1

}

/****************定时器0中断服务程序*****/

void init_timer0(void) interrupt 1

{

TH0=-10000/256

TL0=-10000%256 //10MS定时初值(T0计时用)

t10ms++

if(t10ms==100)

{

t10ms=0

ts++

if(ts==60)

{

temp++

ts=0

}

}

}

/****************主程序******************/

main()

{

initiation()

while(1)

{

display()

}

}

一秒加1


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12537639.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存