51单片机并行口驱动LED数码管显示电路及程序.docx
《51单片机并行口驱动LED数码管显示电路及程序.docx》由会员分享,可在线阅读,更多相关《51单片机并行口驱动LED数码管显示电路及程序.docx(7页珍藏版)》请在冰豆网上搜索。
![51单片机并行口驱动LED数码管显示电路及程序.docx](https://file1.bdocx.com/fileroot1/2022-10/13/f2bb617f-301b-4922-a8e5-e52bdde3478e/f2bb617f-301b-4922-a8e5-e52bdde3478e1.gif)
51单片机并行口驱动LED数码管显示电路及程序
51单片机并行口驱动LED数码管显示电路及程序
介绍利用51单片机的一个并行口实现多个LED数码管显示的方法,给出了利用此方法设计的多路LED显示系统的硬件电路结构原理图和软件程序流程,同时给出了采用51汇编语言编写程序。
1硬件电路
多位LED显示时,常将所有位的段选线并联在一起,由一个8位I/O口控制,而共阴极点或共阳极点分别由另一个8位I/O口控制;也可采用并行扩展口构成显示电路,通常,需要扩展器件管脚的较多,价格较高。
本文将介绍一种利用单片机的一个并行I/O口实现多个LED显示的简单方法,图1所示是该电路的硬件原理图。
其中,74LS138是3线-8线译码器,74LS164是8位并行输出门控串行输入移位寄存器,LED采用L05F型共阴极数码管。
显示时,其显示数据以串行方式从89C52的P12口输出送往移位寄存器74LS164的A、B端,然后将变成的并行数据从输出端Q0~Q7输出,以控制开关管WT1~WT8的集电极,然后再将输出的LED段选码同时送往数码管LED1~LED8。
位选码由89C52的P14~P16口输出并经译码器74LS138送往开关管Y1~Y8的基极,以对数码管LED1~LED8进行位选控制,这样,8个数码管便以100ms的时间间隔轮流显示。
由于人眼的残留效应,这8个数码管看上去几乎是同时显示。
<51单片机并行口驱动LED数码管显示电路>
2软件编程
该系统的软件编程采用MCS-51系列单片机汇编语言完成,并把显示程序作为一个子程序,从而使主程序对其进行方便的调用。
图2所示是其流程图。
具体的程序代码如下:
<51单片机并行口驱动LED数码管显示程序>
pic单片机驱动led数码管显示程序
;*****该程序用于驱动led数码管显示,在8个LED数码管上依次显示数字1、2、3、4、5、6、7、8*******
;****单片机学习网经典程序已测试,led数码管共阴和共阳不同请修改码值转换表部分
LISTP=18F458
INCLUDE"P18F458.INC"
;所用的寄存器
XIANREQU0X20
ORG0X00
GOTOMAIN
ORG0X30
;****************以下为码值转换表********************
CONVERTADDWFPCL,1
RETLW0XC0;0,显示段码与具体的硬件连接有关
RETLW0XF9;1
RETLW0XA4;2
RETLW0XB0;3
RETLW0X99;4
RETLW0X92;5
RETLW0X82;6
RETLW0XD8;7
RETLW0X80;8
RETLW0X90;9
RETLW0X88;A
RETLW0X83;B
RETLW0XC6;C
RETLW0XA1;D
RETLW0X86;E
RETLW0X8E;F
RETLW0X7F;"."
RETLW0XBF;"-"
RETLW0X89;H
RETLW0XFF;DARK
RETURN
;**************初始化子程序*****************
INITIAL
BCFTRISA,5;置RA5为输出方式,以输出锁存信号
BCFTRISC,5
BCFTRISC,3;设置SCK与SDO为输出方式
BCFINTCON,GIE;关闭所有中断
MOVLW0XC0
MOVWFSSPSTAT;设置SSPSTAT寄存器
MOVLW0X30
MOVWFSSPCON1;设置SPI的控制方式,允许SSP方式,并且时钟下降
;沿发送数据,与"74HC595当其SCLK从低到高电平
;跳变时,串行输入数据(DI)移入寄存器"的特点相对应
MOVLW0X11;显示值寄存器赋初值,每个值占两个字节,
MOVWFXIANR;从8开始显示
RETURN;返回
;***************led数码管显示子程序******************
;SPI发送显示子模块
DISPLAY
TRANSMITCLRFPORTA;LACK送低电平,为锁存做准备
MOVWFSSPBUF;启动发送
WAIT
BTFSSPIR1,SSPIF
GOTOWAIT;等待发送结束
BCFPIR1,SSPIF;清除中断标志
NOP
BSFPORTA,5;最后给一个锁存信号,代表一显示任务完成
RETURN
;*****************pic单片机驱动led显示程序的主程序开始***************
MAINNOP
CALLINITIAL;调用系统初始化子程序
LOOPMOVFXIANR,W
CALLCONVERT;查出XIANR的显示段码值
CALLDISPLAY
DECFXIANR
DECFXIANR;显示值减2,因为按字存放,按字节读取
MOVFXIANR,W
SUBLW0X01
BTFSSSTATUS,Z
GOTOLOOP;若送完显示的数,则退出显示
HEREGOTOHERE
END
C语言源程序如下:
/*************************************************
程序名称:
8位数码管移位显示0-F
简要说明:
使用共阳型数码管
P0口输出数码管段码,P2口输出数码管位码
编 写:
JiangX.net
时 间:
2008-8-21
*************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineduanP0 //定义段码输出
#defineweiP2 //定义位码输出
uchara=0,b=0; //全局变量。
a:
定时器循环次数;b:
移位量
ucharcodeTAB[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,//空白
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//数字0-9
0x88,0x83,0xC6,0xa1,0x86,0x8e,//字母A-F
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff//空白
};
/*****************延时子程序*****************/
voiddelay(n)
{
while(n--){
uintj;
for(j=0;j<125;j++);
}
}
/*****************程序初始化*****************/
voidinit()
{
TMOD=0x1; //定时方式1
TH0=0xb8;
TL0=0x63; //设置计时时间为50ms
wei=~0; //设置位扫描初值
}
/*****************定时器中断0****************/
voidtimer0(void)interrupt1
{
TH0=0xb8;
TL0=0x63;
a++; //移位变量累加
if(a==20){
a=0;
b++;
}
if(b==24){
b=0;
}
}
/******************显示子程序****************/
voiddisplay()
{
uchari;
uchark;
for(i=0;i<8;i++)
{
k=1<
wei=~k; //位扫描
duan=TAB[i+b];//输出段码
delay
(1);
}
}
/******************主函数******************/
voidmain()
{
init();
TR0=1;
ET0=1;
EA=1;
while
(1)
display();
}
.