使用单片机实现四位八段的数码管显示,显示出852.6如何实现,请写出实现流程

使用单片机实现四位八段的数码管显示,显示出852.6如何实现,请写出实现流程,第1张

有两种方式,一种是动态扫描,假设你数码管有COM1,COM2,COM3,COM4,然后有8个段,常见的是7个控制数码管段还有一个小数点一共8个段

那么这里就描述单片机一次扫描4位的过程,首先,如果你的数码管是共阳,那么显示第一位就将COM1引脚拉到高电平,然后8个引脚接到单片机IO口上,你说你要显示852.6,那么第一位是8,7个段全亮,所以7个IO全部拉低电平就行,随后延迟差不多1ms左右

接下来就是显示第二个数码管,和之前一样,COM2拉高,然后你要显示5的话有两个段是不亮的,所以哪两个脚你不想让他亮,你直接把对应的IO拉高就行,你要让剩下哪5个段亮直接拉高电平即可,随后再延时1ms左右

接下来两位和上面一样,对应位的COM口拉高电平,对应的字段IO你要让哪个段亮就把哪个拉低电平,哪个段不想亮就拉高电平,最后延时1ms就行

最后程序外面套个while(1)就可以实现无限循环了

还有一种方式就是用74HC595和4个数码管连接起来,74HC595是一个串行锁存寄存器,只需要4个74HC595和4个数码管就行,最少只占用单片机2个IO

这里就说明一下74HC595的控制方式

首先74HC595应该有个EN口,拉低,然后时钟拉高,循环8次,再把时钟信号拉低,用一个AND运算,如你要传输一个0XAA,那么就是

void InputData(0XAA)

{

for(int i=0i<8i++)

{

if(dat&0x01==1)

{

digitalWrite(SCK,LOW)

digitalWrite(DAT,HIGH)

delayMicroseconds(10)

}

else

{

digitalWrite(SCK,LOW)

digitalWrite(DAT,LOW)

delayMicroseconds(10)

}

dat=dat>>1

digitalWrite(SCK,HIGH)

}

}

这里我是直接复制我以前写的一个arduino驱动74HC595的程序,SCK是时钟,DAT是数据

建议你把单片机和你数码管的电路图发出来,你说如何实现我不知道你是怎么接的数码管

两位数码管显示38-00倒记时 8段数码管显示.两位数码管显示38-00倒计时(动态扫描方式).p2做LED显示数据输出口.p1.0p1.3分别控制数码管个位数和十位数显示. 8段数码管从内部接线上分共阳和共阴两种。在电路设计时应根据情况决定采用共阳或共阴,其基本原则是:若单片机IO口直接驱动数码管个段,最好采用共阳数码管,因为51单片机IO口输出高电平时输出的电流很小,数码管不会太亮;若数码管是通过驱动芯片与单片机相连的,就要看驱动芯片对数码管极性的要求啦。下面的实验采用共阳数码管。=======================================

constant define 常数定义

csp equ 60h 堆栈开始使用的位置.

=======================================

variable define 变量定义

vadigit equ 30h 数码管个位数存放内存位置

vbdigit equ 31h 数码管十位数存放内存位置

vcnt1 equ 32h 计数器数值存放内存位置=======================================

Func: 程序开始.

=======================================

org 0000h

ajmp mainorg 0030h 到0030h处避开00-30h的敏感地址

=======================================

Func: 程序初始化.

=======================================

main: 初始化特殊寄存器及变量

mov sp,#csp 指定堆栈开始使用的位置.

star:

mov vcnt1,#0 初始化计数器,从0开始

lop1:

acall display 调用显示子程序

inc vcnt1 对计数器加1

mov a,vcnt1

cjne a,#100,lop1 判断计数器是否满100?

mov vcnt1,#0 满100就清零重新开始

ljmp lop1 不满就循环执行=======================================

Func: 8.字型LED显示子程序

Input: vcnt1

=======================================

display:

mov a,vcnt1 将temp中的十六进制数转换成10进制

mov b,#10 10进制/10=10进制

div ab a除以b,商在a,余数在b.

mov vbdigit,a 十位在a

mov vadigit,b 个位在b

mov dptr,#digittab 指定查表起始地址

mov r0,#4

dpl1:

mov r1,#250

dplop:

mov a,vadigit 取个位数

movc a,@a+dptr 查个位数的7段代码

mov p1,a 送出个位的7段代码

clr p3.2 开个位显示

acall delayus 显示162微秒

setb p3.2 关闭个位显示,防止鬼影

mov a,vbdigit 取十位数

movc a,@a+dptr 查十位数的7段代码

mov p1,a 送出十位的7段代码

clr p3.3 开十位显示

acall delayus 显示162微秒

setb p3.3 关闭十位显示,防止鬼影

djnz r1,dplop 循环执行250次

djnz r0,dpl1 循环执行250X4=1000次

ret=======================================

Func: 162us延时子程序

=======================================

delayus:

mov r7,#80 ///2+2X80=162微秒,延时按11.0592MHZ计算

djnz r7,$

retorg 0600h

=======================================

digittab: 实验板上的7段数码管0~9数字的共阳显示代码

db 0c0h0

db 0f9h1

db 0a4h2

db 0b0h3

db 099h4

db 092h5

db 082h6

db 0f8h7

db 080h8

db 090h9

end

1、最开始,我们先打开keil。

2、接着,我们要定义好库函数,想要实现动态数码灯,这个步骤是很重要的。

3、接着,我们加上一条循环语句。

4、最后,我们把先前定义的延时语句delayms写好。

5、最后,点击这里进行编译,生成一个hex文件。

6、如果这里无错误警告的话,就说明我们的程序写对了,那我们就可以点亮动态数码管了。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存