16×16点阵图文LED显示屏设计的源程序清单

2020-05-05 13:40

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},//--文字:单-- {


16×16点阵图文LED显示屏设计的源程序清单.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:基于单片机的电脑遥控系统的设计

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: