6 控制源程序清单
以下是4个16×16点阵LED电子显示屏的源程序,分别采用汇编及C语言编写,C程序在Keil 51环境下调试。
(1)汇编源程序
;******************************** ;4字16×16点阵电F屏字符显示器* ;* AT89C52 12 MHz晶振 * ;*******************************
;显示字用查表法,不占内存,用4个16×16共阳LED点阵显示 ;效果:向上滚动显示字,每次4个,重复循环 ;R2:行扫描地址(00H~0FH)。
;R3:滚动显示时控制移动速度,也可控制静止显示的时间 ;*******中断入口程序*********
ORG 0000H LJMP START ORG 0003H RETI
ORG 000BH LJMP INTT0 ORG 0013H RETI
ORG 001BH RETI
ORG 0023H RETI
ORG 002BH RETI
;*******主程序************
START:MOV 20H,#00H ;清标志,00H为l帧扫描结束标志
MOV A,#0FFH ;端口初始化 MOV P1, A MOV P2, A MOV P3, A MOV P0,A
CLR Pl.6 ;串行寄存器输入/输出端控制位 MOV TMOD, #01H ;使用T0作16位定时器,行扫描用 MOV TH0, #0FCH ;1ms初值(12 MHz) MOV TL0, #18H
MOV SCON, #00H ;串口0方式传送显示字节 MOV IE, #82H ;T0中断允许,总中断允许 MOV SP, #70H
LCALL DIS1 ;显示准备,黑屏,1.5 s MAIN: MOV DPTR,#TAB
LCALL MOVDISP ;逐排显示,每次4字)
MOV DPTR,#TAB
LCALL MOVDISP1 ;滚动显示,每排4字) AJMP MAIN
;***************4字逐排显示子程序*******
;每次4字移入移出显示方式,入口时定义好DPTR值
MOVDISP:MOV R1,#6 ;显示6排字,每排4字(R1=排数) DISLOOP: MOV R3,#100 ;每排显示时间为16 ms×100=1.6 s DISMOV: MOV R2,#00H ;第0行开始
SETB TR0 ;开扫描(每次l帧) WAITMOV:JBC 00H,DISMOV1 ;标志为1,扫描l帧结束(16 ms为1帧,每行1 ms)
AJMP WAITMOV
DISMOV1:DJNZ R3,DISMOV ;1帧重复显示(控制显示时间)
MOV A,#128 ;显示字指针移1排(每排4字×32= 128字) ADD A, DPL MOV DPL, A MOV A,#0
ADDC A, DPH MOV DPH,A
DEC R1 ;R1为0,显示完 MOV A,R1 JZ MOVOUT AJMP DISLOOP
MOVOUT:RET ;移动显示结束
;********************4字滚动显示子程序***************** ;每排4字向上移出显示方式,入口时定义好DPTR值
MOVDISP1:MOV R1,#255 ;向上移动显示6排字,每排4字(R1=排数×16) DISLOOP1: MOV R3,#10 ;移动速度为16 ms×10= 0.16 s DISMOV2: MOV R2,#00H :第0行开始
SETB TR0 ;开扫描(每次1帧) WAITMOV1: JBC 00H,DISMOV3;标志为1扫描1帧结束(16 ms为1帧,每行1 ms)
AJMP WAITMOV1
DISMOV3: DJNZ R3,DISMOV2 ;1帧重复显示(控制移动速度)
INC DPTR ;显示字指针移1行(2字节位置) INC DPTR
DEC R1 ;R1为0,显示完 MOV A,R1 JZ MOVOUT1 AJMP DISLOOP1
MOVOUT1: RET ;移动显示结束 ;*****************4字显示子程序***************** ;静止显示表中某4字
DIS1: MOV R3,# 5AH :静止显示时间控制
DIS11: MOV R2,#00H ;l帧扫描初始值(行地址00~0OFH) MOV DPTR,# TAB ;取表首址
SETB TR0 ;开扫描(每次1帧) WAIT11: JBC 00H, DIS111 ;标志为l,扫描l帧结束 AJMP WAIT11 DISI111: DJNZ R3,DISI1 RET
;***********扫描程序 ************
;1ms传送一行,每行显示l ms,一次传送4字的某行共8字节 INTT0: PUSH ACC
MOV TH0,# 0FCH ;1 ms初值重装 MOV TL0,# 18H
MOV A,#97 ;指向第4个字行右字节 ADD A,DPL MOV DPL,A MOV A,#0 ADDC A,DPH MOV DPH,A MOV A,#0
MOVC A, @A+ DPTR ;查表
MOV SBUF,A ;串口0方式发送 WAIT: JBC TI, GO ;等待发送完毕 AJMP WAIT
GO: MOV A,DPL ;指向第4个字行左字节
SUBB A,#1 MOV DPL,A MOV A,DPH SUBB A,#0 MOV DPH,A MOV A, #0
MOVC A,@A+ DPTR MOV SBUF,A WAIT1: JBC TI,GO1 AJMP WAIT1 GO1: MOV R0, #03H
MLOOP:MOV A, DPL ;指向前3个字行右字节
SUBB A, #31 MOV DPL, A MOV A, DPH SUBB A, #0 MOV DPH, A MOV A,#0
MOVC A,@A+DPTR ;查表
MOV SBUF,A ;串口0方式发送 WAIT2:JBC TI,GO2 ;等待发送完毕 AJMP WAIT2
GO2: MOV A,DPL ;指向前3个字行左字节
SUBB A,#1 MOV DPL,A MOV A,DPH SUBB A,#0 MOV DPH,A MOV A,#0
MOVC A,@A+DPTR MOV SBUF, A WAIT3:JBC TI, GO3 AJMP WAIT3
G03: DJNZ R0O,MLOOP ;执行3次
SETB Pl.7 ;关行显示,准备刷新 NOP ;串口寄存器数据稳定
SETB P1.6 ;产生上升沿,行数据输入输出端 NOP NOP
CLR Pl.6 ;恢复低电平
MOV A,R2 ;修改显示行地址 ORL A,#0F0H ;修改显示行地址 MOV R2,A ;修改显示行地址 MOV A,P1 ;修改显示行地址 ORL A,#0FH ;修改显示行地址 ANL A,R2 ;修改显示行地址 MOV P1,A ;修改完成 CLR Pl.7 ;开行显示
INC R2 ;下一行扫描地址值
INC DPTR
INC DPTR ;下一行数据地址 MOV A, R2 ANL A,#0FH JNZ GO4
SETB 00H ;R2为1I0H,现为末行扫描,置l帧结束标志 MOV A,DPL ;指针修正为原帧初值 SUBB A, #32 MOV DPL, A MOV A,DPH SUBB A,#0 MOV DPH, A
CLR TR0 ;一帧扫描完,关扫描 GO4: POP ACC
RETI ;退出 ; *******扫描文字表********
;共5排字.每排4个字,前后为黑屏
TAB:
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;黑屏 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH; DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;黑屏 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH; DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;黑屏 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH; DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;黑屏 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH; DB 0F7H,0DFH,0F9H,0CEH,0FBH,0BFH,0C0H,007H,0DEH,0E7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;--文字:单--
DB 0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH DB 0FEH,0BFH,0FFH,0BEH,0EFH,0BFH,0EFH,0EBH,0E0H,001H,0EFH,0FFH, 0EFH 0FFH, 0EFH,0FFH --文字:片--
DB 0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0EFH DB 0EFH,0EFH,0FFH,007H,001H,077H,001H,077H,00EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;--文字:机--
DB 0ABH,077H,0AFH,077H,06FH,0F7H,0EEH,0F5H,0EDH,0F5H,0FDH,0F5H,0EBH,0F9H,0EFH,0FFH ;下面的DB表略去
(2)C源程序
/*-------------------------------------------------- 多个16×16 LED显示演示程序 MCU AT89C52 XAL 24 MHz
--------------------------------------------------*/
//以下程序能实现多个16×16 LED屏的多个字符显示,显示方式有整行上移、帘入帘出、左移、右移//
# include “reg52.h”
# define BLKN 8 //列锁存器数(为LED显示字数×2) # define TOTAL 20 //待显示字个数,本例共20个 # define CONIO P1 //显示控制口
sbit G=CONIO^7;//CONIO.7为154译码器显示允许控制信号端口,0时输出,l时输出全为高阻态
sbit CLK= CONIO^6;//CONIO.6为595输出锁存器时钟信号端,l时输出数据,从l到0时锁存输出数据
sbit SCLR= CONIO^5; //CONIO.5为595移位寄存器清0口,平时为l,为0时,输出全为0
unsigned char idata dispram[ (BLKN/2)* 32]={o};//显示区缓存,4字共4×32单元 //*******字模表1******************// unsigned char code Bmp[][32]={ {
0F7H,0DFH,0F9H,0CEH,0FBH,0BFH,0C0H,007H,0DEH,0E7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H, 0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH},//--文字:单-- {