⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 中文显示.asm

📁 中文广告牌,这是我上大学时的毕业论文
💻 ASM
字号:
;*******************************************************************
;*                      中文显示广告牌程序                         *
;*                           amygse                                *
;*                          2004.6.5                               *
;*******************************************************************
;21H~26H--显示内容存储单元
;B  -----每次移入内存单元的数据要左移的次数
;27H------寻址偏址
;28H-----每次移入内存单元的数据要左移的次数临时值
;29H-----扫描还剩几行寄存
;2AH-----左移速度
;2CH-----应该选通那一行寄存
;30H,31H-----延时同步修正寄存器
;堆栈入口40H
;*******************************************************************
SHOW1     EQU    21H   ;第1位|  ;显示内容存储单元(左边数起)本电
SHOW2     EQU    22H   ;第2位|  ;路为显示5个字符(即两个半字)的,
SHOW3     EQU    23H   ;第3位|  ;所以需要6个字节的显存。
SHOW4     EQU    24H   ;第4位|
SHOW5     EQU    25H   ;第5位|
SHOW6     EQU    26H   ;第6位|
;*******************************************************************
MODE      EQU    20H   ;模式选择:1(红)、2(绿)、3(橙)、4(红+绿)、5(绿+红)
SPEED     EQU    28H   ;左移速度
TIME      EQU    29H   ;每次移入内存单元的数据要左移的次数
TIME_TEMP EQU    2AH   ;每次移入内存单元的数据要左移的次数临时值
DPTR_PZ   EQU    2BH   ;寻址偏址
REMAIN    EQU    2CH   ;扫描帧还剩几行寄存
CH_LINE   EQU    2DH   ;应该选通那一行寄存
STR_MN    EQU    2EH   ;字符个数N的M倍存放单元
STR_N     EQU    2FH   ;字符个数N存放单元
;*******************************************************************
BIT1   BIT    P1.0
BIT2   BIT    P1.1
BIT3   BIT    P1.2
BIT4   BIT    P1.3
RXD1   BIT    P1.4  ;红色串行内容发送
TXD1   BIT    P1.5  ;红色串行CP端
RXD2   BIT    P1.6  ;绿色串行内容发送
TXD2   BIT    P1.7  ;绿色串行CP端
EN     BIT    P3.7  ;EN为高电平,关闭显示端口;EN为低电平时,开放显示端口
;********************************************************************

;*********中断入口程序****************
ORG     0000H
LJMP    START
ORG     0003H
RETI
ORG     000BH
RETI
ORG     0013H
RETI
ORG     001BH
RETI
ORG     0023H
RETI
;***************主程序****************
START:   MOV MODE,#1         ;设开始为模式1
MAIN:    SETB EN             ;关显示端口
         MOV SP,#40H         ;堆栈首址
         MOV R0,#SHOW1       ;初使化寄存显示单元
         MOV R1,#16           ;21H~2DH单元清零
         CLR A
LOOP0:   MOV @R0,A
         INC R0
         DJNZ R1,LOOP0
         LCALL STRING
         MOV A,MODE          ;指向下一种模式
         RL A
         MOV MODE,A
         JB ACC.3,START      ;模式的选择,有5种,红,绿,橙,绿+红,红+绿,现选前4种。
         LJMP  MAIN          ;4种模式显示完,重新循环显示内容
;*****左移显示汉字程序************
STRING:  MOV    DPTR,#TAB    ;赋查表初址
         MOV    STR_MN,#1
LOOP2:   MOV    STR_N,#12    ;共有多少个字符,一个汉字等于两个字符,个数值为实际字符个数减5
LOOP1:   LCALL  PLAY         ;运行PLAY一次后,内容左移显示八次,寻址偏址不变.
         CLR    C
         MOV    A,DPL        ;字符表格地址加10H,指向下一个字符 
         ADD    A,#10H
         MOV    DPL,A
         MOV    A,DPH
         ADDC   A,#00H
         MOV    DPH,A
         DJNZ   STR_N,LOOP1
         DJNZ   STR_MN,LOOP2
         RET
;*********左移一个字符程序**************
PLAY:    MOV   TIME, #01H    ;每次移入内存单元的数据要左移次数次值
NLINE:   MOV   SPEED,#01H    ;左移速度
GG:      LCALL LINE16        ;扫描显示1帧
         DJNZ  SPEED,GG
         MOV A,TIME          ;扫描完一帧,显示下一帧左移的次数要加1
         INC A
         MOV TIME,A
         CJNE  A,#9,NLINE    ;如果TIME中的数等于9就完成1个字符的显示,否则继续循环.
         RET
;*********扫描显示1帧行子程序******************
;运行完该子程序后寻址偏址不变
LINE16:  MOV  REMAIN,#10H   ;扫描的行数
FF:      LCALL  LINE1       ;扫描显示1行子程序
         DJNZ REMAIN,FF
         MOV A,DPTR_PZ
 ;        CLR C
         SUBB A,#10H        ;寻址偏址减10使之退出应该子程序后偏址不变
         MOV DPTR_PZ,A
         RET
;*********扫描显示一行子程序******************
LINE1:   MOV TIME_TEMP,TIME ;显示内容要左移几次TIME重赋值给TIME_TEMP临时单元
         LCALL  SEND        ;发送串行口子程序
         LCALL  XH          ;选通行子程序
         CLR  EN            ;开显示端口,显示延时开始
         LCALL  DL800US     ;延时显示1ms
         LCALL  MSTR        ;将显示内容移入内存单元21H~26H ,跳出后27H加1
EE:      LCALL  ZY          ;左移一行子程序
         DJNZ TIME_TEMP,EE  ;要左移(TIME)次
         LCALL  ZYXZ        ;左移速度同步修正
         SETB  EN           ;关显示端口,显示延时结束
         RET
;***********左移速度同步修正子程序********--
;总时间=(显示一次的时间)+(9-左移次数) X (修正时间)
;如果这一行要左移2次,那么修正延时就在调用7次
;该修正程序目的是使字体左移速度匀速
ZYXZ:    MOV   R0,TIME
         MOV   A,#09H
         SUBB  A,R0
         MOV  R0,A
AA:      LCALL  DL22US
         DJNZ R0 ,AA
         RET
;*******显示内容移入内存单元子程序*********
MSTR:    MOV    R0,#SHOW1
         MOV    R4,#06H
         MOV  A, DPTR_PZ
BB:      MOVC   A, @A+DPTR
         MOV    @R0,A
         MOV    A,DPTR_PZ
         ADD    A,#10H
         MOV    DPTR_PZ,A
         INC    R0
         DJNZ   R4,BB
         MOV    A,DPTR_PZ
         SUBB   A,#5FH
         MOV   DPTR_PZ,A
         RET
;**********左移一位子程序**************
;21H~26H存入显示内容,
;R0为显示未址,R2为移出高位个数
ZY:      MOV  R0,  #SHOW6    ;显示单元未址
         MOV  R2,  #6H       ;移出高位个数
         CLR  C
CC:      MOV  A,   @R0
         RLC  A            ;将后一字节的最高位移到C里,再移到前一字节的最低位
         MOV  @R0, A
         DEC  R0
         DJNZ R2,  CC
         CLR  C
         RET

;**********发送数据到串口子程序***************

SEND:    MOV  R0,#SHOW5
         MOV  R5,#5H
LOOP:    MOV  R2,#08H
         MOV  A,@R0
         LCALL  DD
         DEC  R0
         DJNZ R5,LOOP
         CLR  C
         RET
DD:      MOV A,MODE
         JB ACC.1,DD1
         JB ACC.2,DD2
         JB ACC.3,DD3
         JB ACC.4,DD4
         JB ACC.5,DD5
         RET
DD1:     CLR  TXD1
         SETB TXD2
         RRC  A
         MOV  RXD1,C
         SETB TXD1
         SETB TXD2
         DJNZ R2,DD1
         RET
DD2:     CLR  TXD2
         SETB  TXD1
         RRC  A
         MOV  RXD2,C
         SETB TXD2
         SETB TXD1
         DJNZ R2,DD2
         RET
DD3:     CLR  TXD1
         CLR  TXD2
         RRC  A
         MOV  RXD1,C
         MOV  RXD2,C
         SETB TXD1
         SETB TXD2
         DJNZ R2,DD3
         RET
DD4:     CLR  TXD1
         CLR  TXD2
         RRC  A
         MOV  RXD1,C
         CPL  C
         MOV  RXD2,C
         SETB TXD1
         SETB TXD2
         DJNZ R2,DD4
         RET
DD5:     CLR  TXD1
         CLR  TXD2
         RRC  A
         MOV  RXD2,C
         CPL  C
         MOV  RXD1,C
         SETB TXD1
         SETB TXD2
         DJNZ R2,DD5
         RET
;*******选通行子程序*****************
XH:      MOV   CH_LINE,REMAIN    ;REMAIN存运行剩几行数值
         MOV   A,#0FH
       ;  CLR C
         SUBB  A,CH_LINE        ;16列减剩余行数得现在应该扫描行
         MOV   P1,A       ;送P1口
         RET
;******800US延时子程序*****************
DL800US: MOV   R6,#1dH
DL1:     MOV   R5,#18H
DL2:     DJNZ  R5,DL2
         DJNZ  R6,DL1
         RET
;******22US延时子程序*****************
DL22US:  MOV   R6,#19
DL3:     DJNZ  R6,DL3
         NOP
         RET
TAB:
         END





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -