以下为用汇编语言编写的字符显示控制程序:
; ***************************************
; * *
; * 单个16x16的点阵电子屏字符显示器 *
; * ATA89C52 12MHz晶振*
; * 2004.2.11LRM*
; ***************************************
;显示字用查表法,不占用内存,字符用16x16共阳LED点阵,
;效果:向上滚动显示5个字,再重复循环。
;R1:查表偏址寄存器,B:查表首址,R2:扫描地址(从00~0FH)。
;R3:滚动显示时控制移动速度,单字显示可控制静止显示的时间。
;*************;
;中断入口程序 ;
;*************;
;
ORG 0000H
LJMPSTART
ORG 0003H
RETI
ORG 000BH
LJMPINTTO
ORG 0013H
ERTI
ORG 001BH
ERTI
ORG 0023H
RETI
ORG 002BH
RETI
;
;***********;
;初始化程序;
;***********;
;
;
;***********;
; 主程序 ;
;***********;
;
START:MOV20H,#00H ;清零标志,00H为第16行开始扫描标志,01为1帧
;扫描结束标志
MOVA,#0FFH;端口初始化
MOVP1,A
MOVP1,A
MOVP3,A
MOVP0,A
CLRP1.6 ;串行寄存器输入打入输出控制位
MOVTMOD,#01H ;使用T0做16位定时器,行扫描用。
MOVTH0,#0FCH ;1ms初值(12MHz)
MOVTL0,#18H
MOVSCON,#00H ;串口0方式传送显示字节
MOVIE,#82H ;T0中断允许,总中断允许
MOVSP,#70H
MAIN:LCALL DISI ;显示准备,黑屏,1.5s
MOVDPTR,#TAB
LCALL MOVDISP;向上滚动显示一页(8个字)
INCDPH
LCALL MOVDISP;向上滚动显示一页(8个字)
INCDPH
LACLL MOVDISP;向上滚动显示一页(8个字)
AJMPMAIN
;
;
;***********************;
; 多字滚动显示程序;
;***********************;
;每次8个字,入口时定义好DPTR值
;
MOVDISP: MOV B,#00H ;向上移动显示,查表偏值暂存(从00开始)
DISLOOP: MOV R3,#07H;移动速度
DISMOV: MOV R2,00H ;第0行开始
MOV R1,B
SETB TR0 ;开扫描(每次一帧)
WAITMOV: JBC 01H,DISMOV1 ;标志为1扫描一帧结束(16ms为1帧,每行1ms)
AJMP WAITMOV
DISMOV1: DJNZ R3,DISMOV;1帧重复显示(控制移动速度)
INC B;显示字的下一行(每行2字节)
INC B
MOV A,R1 ;R1为0,8个字显示完
JZMOVOUT
AJMP DISLOOP
MOVOUT:RET;移动先是结束
;
;
;****************;
; 单字显示程序 ;
;****************;
;显示表中某个字;
;****************;
DIS1: MOV R3,#5AH ;静止显示时间控制(16ms*#=1.6s)
DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00~0FH)
MOV DPTR,#TAB;取表首址
MOV R1,#00H ;查表偏址(显示第一个字)
SETB TR0 ;开扫描(每次一帧)
WAIT11: JBC 01H,DIS111 ;为1,扫描一帧结束
AJMP WAIT11
DIS111: DJNZ R3,DIS11
RET
;
;
;************;
; 扫描程序 ;
;************;
;1ms刷新一次,每行显示1s
INTT0: PUSH ACC
MOVTH0,#0FCH ;1ms初值重装
MOVTL0,#18H
JBC00H,GOEND ;16行扫描标志为1,结束
INCR1;取行右边字节偏址
MOVA,R1
MOVC A,@A+DPTR ;查表
MOVSBUF,A;串口0方式发送
WAIT: JBCTI,GO ;等待发送完毕
AJMP WAIT1
GO: DECR1;取行左边字节偏址
MOVA,R1
MOVC A,@A+DPTR
MOVSBUF,A
WAIT1: JBCT1,GO1
AJMP WAIT1
GO1: SETB P1.7 ;关行显示,准备刷新
NOP ;串口寄存器数据稳定
SETB P1.6 ;产生上升沿,行数据打入输出端
NOP
NOP
CLRP1.6 ;恢复低电平
MOVA,R2 ;修改显示行地址
ORLA,#0F0H;修改显示行地址
MOVR2,A ;修改显示行地址
MOVA,P1 ;修改显示行地址
ORLA,#0FH ;修改显示行地址
ANLA,R2 ;修改显示行地址
MOVP1,A ;修改完成
CLRP1.7 ;开行显示
INCR2 ;下一行扫描地址值
INCR1
INCR1 ;下一行数据地址
MOVA,R2
ANLA,#0FH
JNZGO2
SETB 00H;R2为01H,现为末行扫描,置标志
GO2:POPACC
RETI
GOEND: CLRTR0;一帧扫描完毕,关扫描
SETB 01H;一帧扫描完毕,置结束标志
POPACC
RETI ;退出
;
;
;***************;
; 扫描文字表 ;
;***************;
;
TAB:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,00FFH,0FFH,0FFH ;黑屏
DB
0F9H,0BFH,0C7H,0AFH,0F7H,0B7H,0F7H,0B7H,0F7H,0BFH,000H,001H,0F7H,0BFH,0F7H,0B7H ;我
DB
0F1H,0D7H,0C7H,0CFH,037H,0DFH,0F7H,0AFH,0F6H,06DH,0F7H,0F5H,0D7H,0F9H,0EFH,0FDH ;
DB
0FFH,007H,0C0H,06FH,0EDH,0EFH,0F6H,0DFH,0C0H,001H,0DDH,0FDH,0BDH,0FFH,0C0H,003H ;爱
DB
0FBH,0FFH,0F8H,00FH,0F3H,0DFH,0F4H,0BFH,0EFH,03FH,09CH,0CFH,073H,0F1H,0CFH,0FBH ;
DB
0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;单
DB
0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH
DB
0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;片
DB
0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0FFH
DB
0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;机
DB
0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH,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 ;
END
#include <reg52.h>void time(unsigned int ucMs)//函数声明
void main(void)
{
unsigned char ucTimes
#define DELAY_TIME 450
while(1)
{
P1=0xff
P0=0xff
for(ucTimes=0ucTimes<8ucTimes++){
P0 = P0 - (0x01<<ucTimes)time(DELAY_TIME)}
for(ucTimes=0ucTimes<8ucTimes++){
P1 = P1 - (0x01<<ucTimes)time(DELAY_TIME)}
P1=0xff
P0=0xff
for(ucTimes=0ucTimes<8ucTimes++){
P1 = P1 - (0x80>>ucTimes)time(DELAY_TIME)}
for(ucTimes=0ucTimes<8ucTimes++){
P0 = P0 - (0x80>>ucTimes)time(DELAY_TIME)}
}}
void time(unsigned int ucMs)
{
#define DELAYTIMES 239
unsigned char ucCounter
while(ucMs!=0) {
for(ucCounter=0ucCounter<DELAYTIMESucCounter++) { }
ucMs--
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)