试编写程序:8位数码管动态显示数字AbcdEFgH

试编写程序:8位数码管动态显示数字AbcdEFgH,第1张

这是参考程序,把dofly_DuanMa[]里面的值改成a、b、c、d、e、f、g、h的对应段码值就行,然后位选信号看下你的连接电路是怎么接的。希望采纳,有疑问请追问。

#include<reg52h>

#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(600); // 扫描间隙延时,时间太长会闪烁,太短会造成重影,

i++;

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

i=0; }

}

/------------------- 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是 0~65535 ----------------/

void Delay(unsigned int t)

{ while(--t); }

从静态显示和动态显示的区别说起,把动态显示占用IO少,利用视觉残留的方法说清楚就可以啊

附上电路图和程序供你参考,别忘记给分哦

#include "STC12C5Ah" //包含头文件

/数字编码表 0~9/

unsigned char const seg[10] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //段选

unsigned char const position[]={1,2,4,8}; //位选

sbit HC595_SCK = P0^4;

sbit HC595_RCK = P0^5;

sbit HC595_RST = P0^6;

sbit HC595_DAT = P0^7;

//us延时

void delay_us(unsigned int t)

{

while(t--);

}

//延时函数(24M 晶振下延时 1ms)

void delay_ms(unsigned int time)

{

unsigned int t;

for(;time>0;time--)

{

t = 1500;

while(t--);

}

}

//向 HC595 发送一个字节

void HC595_send_byte(unsigned char byte)

{

unsigned char i,temp;

for(i=0;i<=7;i++)

{

temp = byte&1<<i;

if(temp)

{

HC595_DAT = 1; //数据线

}

else

{

HC595_DAT=0;

}

//下面是写时序

HC595_SCK=1; //SCK(11 脚)

delay_us(1);

HC595_SCK=0;

delay_us(1);

}

HC595_RCK=0; //RCK(12 脚)

delay_us(1);

HC595_RCK=1;

}

//显示一个数 num

void SMG_ShowNum(unsigned char num)

{

HC595_send_byte(seg[num]);

}

void SMG_Display(unsigned int dat)

{

SMG_ShowNum(dat/1000);

P0 = (P0&0xf0)|position[0];

delay_ms(2);

SMG_ShowNum((dat%1000)/100);

P0 = (P0&0xf0)|position[1];

delay_ms(2);

SMG_ShowNum(dat%100/10);

P0 = (P0&0xf0)|position[2];

delay_ms(2);

SMG_ShowNum(dat%10);

P0 = (P0&0xf0)|position[3];

delay_ms(2);

}

//主函数

void main()

{

unsigned int num=0;

unsigned char time=0;

P0=0X00; //初始化低四位为高电平,使能四位数码管

HC595_RST=0; //HC595 的复位端,不能让他复位

while(1)

{

num = (num+1)%10000; //动态显示 0~9999

time = 100;

while(time--)

SMG_Display(num);

}

}

两只数码管段码分别由P0,P2输出控制,P0是十位,P2是个位。P32,P34分别接两只按键,P32清0,P34计数。

以上程序来自《单片机C语言程序设计实训100例--基于8051+Proteus仿真》

#include

<reg52h>

#define

uchar

unsigned

char

#define

uint

unsigned

int

uchar

DSY_CODE[]=

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f

};

uchar

Count

=

0;

void

main()

{

P0

=

0x00;

P2

=

0x00;

TMOD

=

0x06;

TH0=255;

TL0=255;

ET0=1;

EX0=1;

EA

=1;

IP

=0x02;

IT0=1;

TR0=1;

while(1)

{

P0

=

DSY_CODE[Count/10];

P2

=

DSY_CODE[Count%10];

}

}

void

Clear_Counter()

interrupt

0

{

Count

=

0;

}

void

Key_Counter()

interrupt

1

{

Count

=

(Count

+

1)

%100;

}

以上就是关于试编写程序:8位数码管动态显示数字AbcdEFgH全部的内容,包括:试编写程序:8位数码管动态显示数字AbcdEFgH、单片机动态数码管程序怎么写、求51单片机控制2个数码管的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9471500.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存