lcd+80c196.asm

来自「80C196系列单片机控制128X64的点阵液晶显示」· 汇编 代码 · 共 311 行

ASM
311
字号
R6       EQU   25H
R5       EQU   26H 
DIR      EQU   27H
CTEMP    EQU   28H
R3       EQU   30H
R4       EQU   31H 
CODE_    EQU   32H
COL1     EQU   33H
COL2     EQU   34H
COLUMN   EQU   35H
COUNT    EQU   36H
PAGE_    EQU   37H
PD1      EQU   38H
COM      EQU   39H      ;指令寄存器
DAT      EQU   3AH      ;数据寄存器

CWADD1   EQU   0E000H   ;写指令代码地址(E1)
DWADD1   EQU   0E001H   ;写显示数据地址(E1)
CRADD1   EQU   0E002H   ;读状态字地址(E1)
DRADD1   EQU   0E003H   ;读显示数据地址(E1)

CWADD2   EQU   0E004H   ;写指令代码地址(E2)
DWADD2   EQU   0E005H   ;写显示数进地址(E2)
CRADD2   EQU   0E006H   ;读状态字地址(E2)
DRADD2   EQU   0E007H   ;读显示数据地址(E2)

         ORG   2080H
         ;LD    SP, #0100H
         JMP   MAIN

;---------------------------------------
; 初始化程序
INIT:    ;先锁定HSO.3,给液晶显示供电
         LDB    IOC2, #40H          ;允许锁定HSO命令
         LDB    HSO_COMMAND, #0A3H  ;触发正跳变事件
         ADD    HSO_TIME,T1, #000AH
         ;NOP
         ;NOP
         ;NOP
         ;NOP
         ;LDB    HSO_COMMAND, #83H  ;触发负跳变事件
         ;ADD    HSO_TIME,T1, #0A00H

         LDB   COM, #40H     ;设置显示起始列为第0列
         LCALL PRO
         LCALL PR3
         LDB   COM, #0B8H    ;设页码,第0页
         LCALL PRO
         LCALL PR3
         LDB   COM, #0C0H    ;设从第0行开始显示
         LCALL PRO
         LCALL PR3
         LDB   COM, #3FH     ;开显示设置
         LCALL PRO
         LCALL PR3
         RET
;------------------------------------------------
; 清屏
CLEAR:   LDB   R4,#00H       ;页面地址暂存器设置
CLEAR1:  LDB   AL,R4         ;取页地址值
         ORB   AL,#0B8H      ;"或"页面地址设置代码
         LDB   COM,AL        ;页面地址设置
         LCALL PRO
         LCALL PR3
         LDB   COM,#00H      ;列地址设置为"0"
         LCALL PRO
         LCALL PR3
         LDB   R3,#64        ;一页清64个字节
CLEAR2:  LDB   DAT,#0ffH     ;显示数据为"FF"
         LCALL PR1
         LCALL PR4
         DJNZ  R3,CLEAR2     ;页内字节清零循环
         INCB  R4            ;页地址暂存器加一
         CMPB  R4,#08
         JNE   CLEAR1        ;RAM区清零循环
         RET
;-----------------------------------
;1.写指令代码子程序(E1)
PRO:
PR01:    LDB   AL, CRADD1     ;读状态字
         JBS   AL,7,PR01      ;判"忙"标志为句"0",否再读
         LDB   AL,COM         ;取指令代码
         STB   AL, CWADD1     ;写指令代码
         RET
;------------------------------------
;2.写显示数据子程序(E1)
PR1:
PR11:    LDB   AL,CRADD1      ;读状态宇
         JBS   AL,7,PR11      ;判"忙"标志为"0",否再读
         LDB   AL,DAT         ;取数据
         STB   AL,DWADD1      ;写数据
         RET
;-------------------------------------
;3.读显示数据子程序(E1)
PR2:
PR21:    LDB   AL,CRADD1      ;读状态字
         JBS   AL,7,PR21      ;判"忙"标志为"0"否,否再读
         LDB   AL,DRADD1      ;读数据
         LDB   DAT,AL         ;存数据
         RET
;-------------------------------------
;4.写指令代码子程序(E2)
PR3:
PR31:    LDB    AL,CRADD2      ;读状态字
         JBS    AL, 7,PR31     ;判"忙"标志为"0"否,否再读
         LDB    AL,COM         ;取指令代码
         STB    AL,CWADD2      ;写指令代码
         RET
;-------------------------------------
;  5.写显示数据子程序(E2)
PR4:
PR41:    LDB    AL,CRADD2       ;读状态字
         JBS    AL,7,PR41       ;判"忙"标志为"0"否,否再读
         LDB    AL,DAT          ;取数据
         STB    AL,DWADD2       ;写数据
         RET
;---------------------------------------
;  6.读显示数据子程序(E2)
PR5:
PR51:    LDB    AL,CRADD2      ;读状态字
         JBS    AL, 7,PR51     ;判"忙"标志为"0",否再读
         LDB    AL,DRADD2      ;读数据
         LDB    DAT,AL        ;存数据
         RET



         

;  中文显示子程序

CCW_PR:  LD     BX,#CCTAB       ;确定字符字模块首地址
         LDB    AL,#0   ;CODE_        ;取代码
         LDB    AH,0
         MULUB  AX,#20H         ;代码×32
         ADD    BX,AX           ;字模库首地址+代码×32

         LDB    COL2, #0  ;COLUMN    ;列地址
         LDB    COL1,#00H      ;代码寄存器借用为间址寄存器
CCW_1:   LDB    COUNT,#10H      ;计数器设置为 16
         LDB    AL,#0 ;PAGE_        ;读页地址寄存器
         ANDB   AL,#03H         ;取页地址有效值
         ORB    AL,#0B8H        ;"或"页地址设置代码
         LDB    COM,AL          ;设置页地址
         LCALL  PRO
         LCALL  PR3
         LDB    COLUMN,COL2     ;取列地址值
         LDB    AL,#0   ;COLUMN       ;读列地址寄存器
         CMPB   AL,#0;#PD1
         JLT    CCW_2           ;<0为左半屏显示区域(E1)
         SUBB   AL,#0;#PD1
         LDB    COLUMN,AL       ;≥0为右半屏显示区域(E2)
         LDB    AL,#0;PAGE_
         ;SETB  ACC.3           ;设置区域标志位。
         ORB    AL,#08
         LDB    PAGE_,AL        ;"0"为E1,"1"为E2
CCW_2:   LDB    COM,COLUMN      ;设置列地址值
         LDB    AL,PAGE_         ;判区域标志以确定设置哪个控制器
         JBC    AL,3,CCW_3
         LCALL  PR3             ;区域E2
         LJMP   CCW_4
CCW_3:   LCALL  PRO             ;区域E1
CCW_4:   LDB    AL,COL1         ;取间址寄存器值
         LDB    AH,0
         ADD    AX,BX
         LDB    AL,[AX]         ;取汉字字模数据
         LDB    DAT,AL          ;写数据
         LDB    AL,PAGE_
         JBC    AL,3,CCW_5
         LCALL  PR4             ;区域E2
         LJMP   CCW_6
CCW_5:   LCALL  PR1             ;区域E1
CCW_6:   INCB   COL1            ;间址寄存器加一
         INCB   COLUMN          ;列地址寄存器加一
         LDB    AL,COLUMN       ;判列地址是否超出区域范围、
         CMPB   AL,#PD1
CCW_7:   JLT     CCW_8          ;未超出则继续
         LDB    AL,PAGE_        ;超出则判是否在区域E2
         JBS    AL, 3,CCW_8     ;在区域E2则退出
         ;SETB  ACC.3           ;在区域E1则修改成区域E2
         ORB    AL,#08
         LDB    PAGE_,AL
         LDB    COM,#00H        ;设置区域E2列地址为"0"
         LCALL  PR3
CCW_8:   DJNZ   COUNT,CCW_4     ;当页循环
         LDB    AL,PAGE_        ;读页地址寄存器
         JBS    AL,7,CCW_9      ;判完成标志D7位,"1"则完成退出
         INCB   AL              ;否则页地址加一
         ;SETB  ACC.7           ;置完成位为"1"
         ORB    AL,#80H
         ANDB   AL,#0F7H        ; CLR   ACC.3
         LDB    PAGE_,AL
         LDB    CODE_,#10H      ;间址寄存器设置为 16
         LJMP   CCW_1           ;大循环
CCW_9:   RET

;--------------------------------------
;中文字符库
CCTAB:
small0:
;db     38h,44h,44h,44h,44h,44h,38h,00h         ;0
small1:
;db     10h,30h,50h,10h,10h,10h,7ch,00h         ;1
small2:
;db     38h,44h,04h,08h,10h,20h,7ch,00h         ;2
small3:
;db     78h,84h,04h,38h,04h,84h,78h,00h         ;3

         DB   01h,  00h,  01h,  04h, 0FFh, 0FEh,  01h,  00h ;横排
         DB   01h,  04h,  7Fh, 0FEh,  48h,  24h,  44h,  44h
         DB   5Fh, 0F4h,  41h,  04h,  41h,  04h,  5Fh, 0F4h
         DB   41h,  04h,  41h,  04h,  41h,  14h,  40h,  08h
         
         DB   20h,  00h,  27h, 0FFh,  24h,  00h,  24h,  90h  ;上下列排
         DB   26h,  90h,  25h,  90h,  24h,  90h, 0FCh, 0FEh
         DB   24h,  90h,  25h,  90h,  26h,  90h,  24h,  92h
         DB   24h,  01h,  6Fh, 0FEh,  24h,  00h,  00h,  00h
         
         DB   00h,  04h, 0FFh, 0E4h,  00h,  24h,  09h,  24h  ;下上列排
         DB   09h,  64h,  09h, 0A4h,  09h,  24h,  7Fh,  3Fh
         DB   09h,  24h,  09h, 0A4h,  09h,  64h,  49h,  24h
         DB   80h,  24h,  7Fh, 0F6h,  00h,  24h,  00h,  00h

         DB 000H,004H,0e4H,024H,024H,064H,0b4H,02fH ; 南
         DB 024H,0a4H,064H,024H,024H,0e6H,004H,000H
         DB 000H,000H,07fH,004H,005H,005H,005H,07fH
         DB 005H,005H,005H,025H,044H,03fH,000H,000H

         ;DB 000H,004H,004H,0e4H,024H,024H,025H,026H ; 京
         ;DB 024H,024H,024H,0e4H,006H,004H,000H,000H
         ;DB 000H,020H,010H,019H,00DH,041H,081H,07fH
         ;DB 001H,001H,005H,00dH,038H,010H,000H,000H


         ;DB 000H,080H,060H,0f8H,007H,00aH,028H,028H ; 伟
         ;DB 028H,0ffH,028H,028H,028H,028H,000H,000H
         ;DB 001H,000H,000H,0fFH,000H,001H,001H,001H
         ;DB 001H,0ffH,001H,021H,041H,03fH,000H,000H

         ;DB 008H,008H,089H,0ceH,028H,018H,002H,07aH ; 福
         ;DB 04aH,04aH,04aH,04aH,04aH,07aH,002H,000H
         ;DB 002H,001H,000H,0ffH,001H,002H,0ffH,049H
         ;DB 049H,049H,07fH,049H,049H,049H,0ffH,000H
;------------------------------------.
; 中文演示显示程序段
MAIN:    LDB    SP,#0E0H
         LCALL  INIT
         LCALL  CLEAR
         LCALL  CCW_PR
         SJMP   MAIN
         LDB     CTEMP,#0
         LDB     DIR,#0
AAA:
         LDB     PAGE_,#02H
         LDB     COLUMN,CTEMP
         LDB     CODE_,#00H
         LCALL   CCW_PR

         LDB     PAGE_,#02H
         LDB     AL,CTEMP
         ADDB    AL,#10H
         LDB     COLUMN,AL
         LDB     CODE_,#01H
         LCALL   CCW_PR

         LDB     PAGE_,#02H
         LDB     AL,CTEMP
         ADDB    AL,#20H
         LDB     COLUMN,AL
         LDB     CODE_,#02H
         LCALL   CCW_PR

         LDB     PAGE_,#02H
         LDB     AL,CTEMP
         ADDB    AL,#30H
         LDB     COLUMN,AL
         LDB     CODE_,#03H
         LCALL   CCW_PR

         LCALL   DELAY
         LCALL   DELAY
         LCALL   DELAY
         LDB     AL, DIR
         CMPB    AL,#0
         JNE     LEFT
         INC     CTEMP
         LDB     AL,CTEMP
         CMPB    AL,#58
         JNE     AAA
         LDB     DIR,#1
         LJMP    AAA
 LEFT:
         DEC     CTEMP
         LDB     AL,CTEMP
         CMPB    AL,#0
         JNE     AAA
         LDB     DIR,#0
         LJMP    AAA

         SJMP    $

;----------------------------------
DELAY:   LDB        R6,#060H          ;延时子程序
         LDB        R5,#00H
DELAY1:  NOP
         DJNZ       R5,DELAY1
         DJNZ       R6,DELAY1
         RET

       END

⌨️ 快捷键说明

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