
那么这里就描述单片机一次扫描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、如果这里无错误警告的话,就说明我们的程序写对了,那我们就可以点亮动态数码管了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)