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

📄 eyelcd9.asm

📁 《单片机应用系统开发实例详解》 光盘 程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                MOV     R3,#00H         ; 设置循环量(8K字节)
                MOV     R4,#20H
                MOV     COM,#0B0H       ; 设置自动写方式
                LCALL   PR12
        CLEAR1: LCALL   ST3             ; 判状态位S2
                MOV     A,#00H          ; 置数据"0"
                LCALL   PR2            ; 写入数据
                DJNZ    R3,CLEAR1       ; 循环
                DJNZ    R4,CLEAR1
                MOV     COM,#0B2H       ; 设置自动写结束指令
                LCALL   PR12
                RET
; 汉字写入子程序(文本方式)
;  在文本方式下显示汉字, 首先要建立汉字CGRAM,要定义汉字代码.
;  在文本方式下写汉字需要写入4 个代码以组成一个汉字
;  占用内部寄存器:O_XL,O_YL,CODE1,A,B
;  内部调用子程序:PR1
;  连接字库:      CGRAM
;  程序调用入口:  CCW1_PR
;  程序输入变量:  O_XL,O_YL,CODE1
       CCW1_PR: MOV     A,O_YL          ; 计算显示RAM地址
                MOV     B,#PARA1
                MUL     AB
                ADD     A,O_XL
                MOV     O_XL,A
                MOV	DAT1,A
                MOV     A,B
                ADDC    A,#00H          ; 文本显示区首地址为0000H
                MOV     O_YL,A
                MOV     DAT2,A          ; 设置显示RAM地址
                MOV     COM,#24H
                LCALL   PR1
                MOV     A,CODE1          ; 取汉字代码
                MOV     DAT2,A          ; 写入左上半部汉字代码
                MOV     COM,#0C0H
                LCALL   PR11
                MOV     A,CODE1
                ADD     A,#02H
                MOV     DAT2,A          ; 写入右上半部汉字代码
                LCALL   PR11
                MOV     A,#PARA1        ; 显示RAM地址修正
                ADD     A,O_XL
                MOV     DAT1,A
                CLR     A
                ADDC    A,O_YL
                MOV     DAT2,A
                MOV     COM,#24H        ; 设置显示RAM地址
                LCALL   PR1
                MOV     A,CODE1
                INC     A
                MOV     DAT2,A          ; 写入左下半部汉字代码
                MOV     COM,#0C0H
                LCALL   PR11
                MOV     A,CODE1
                ADD     A,#03H
                MOV     DAT2,A          ; 写入右下半部汉字代码
                LCALL   PR11
                RET
; 汉字写入子程序(图形方式)CCW2_PR
;    占用内部资源:O_XL,O_YL,CODE1,COUNT1,A,B,DPTR
;    内部调用子程序:PR1
;    连接字库:      CCTAB
;    程序调用入口:  CCW2_PR
;    程序输入变量:  O_XL,O_YL,CODE1
       CCW2_PR: MOV     A,O_YL           ; 计算图形显示RAM地址
                MOV     B,#PARA1         ; 图形显示区宽度PARA1
                MUL     AB
                ADD     A,O_XL
                MOV     O_XL,A
                MOV     A,B
                ADDC    A,#08H           ; 图形显示区首地址为0800H
                MOV     O_YL,A
                MOV     DPTR,#CCTAB      ; 计算汉字库字符首地址
                MOV     A,CODE1
                MOV     B,#20H
                MUL     AB
                ADD     A,DPL
                MOV     DPL,A
                MOV     A,B
                ADDC    A,DPH
                MOV     DPH,A
                PUSH    DPH              ; 存字库地址指针
                PUSH    DPL
                MOV     COUNT1,#10H      ; 计数器设置为16次
       CCW2_PR1:MOV     DAT1,O_XL        ; 设置显示RAM地址
                MOV     DAT2,O_YL
                MOV     COM,#24H
                LCALL   PR1
                POP     DPL              ; 取字库地址指针
                POP     DPH
                CLR     A
                MOVC    A,@A+DPTR        ; 取左部字模数据
                MOV     DAT2,A           ; 设置数据
                MOV     A,#10H           ; 偏置地址为16
                MOVC    A,@A+DPTR        ; 取右部字模数据
                MOV     DAT1,A           ; 暂存数据
                INC     DPTR             ; 字库地址指针加一
                PUSH    DPH              ; 存字库地址指针
                PUSH    DPL
                MOV     COM,#0C0H        ; 设置一次写数据指令代码
                LCALL   PR11             ; 写入数据
                MOV     DAT2,DAT1        ; 设置右部数据
                LCALL   PR11             ; 写入数据
                MOV     A,#PARA1         ; 显示RAM地址修正
                ADD     A,O_XL
                MOV     O_XL,A
                CLR     A
                ADDC    A,O_YL
                MOV     O_YL,A
                DJNZ    COUNT1,CCW2_PR1  ; 计数器循环
                POP     ACC              ; 修正栈指针
                POP     ACC
                RET
; 西文字符写入子程序CW1_PR
;      占用内部资源:O_XL,O_YL,CODE1,A,B
;      内部调用子程序:PR1
;      程序调用入口: CW1_PR
;      程序输入变量: O_XL,O_YL,CODE1
       CW1_PR:  MOV     A,O_YL          ; 计算文本显示RAM 地址
                MOV     B,#PARA1        ; 文本显示区宽度为PARA1
                MUL     AB
                ADD     A,O_XL
                MOV     DAT1,A
                MOV     A,B
                ADDC    A,#00H
                MOV     DAT2,A
                MOV     COM,#24H        ; 设置地址指针
                LCALL   PR1
                MOV     DAT2,CODE1       ; 写入字符代码
                MOV     COM,#0C4H
                LCALL   PR11
                RET
; 西文字符写入子程序CW2_PR
;       占用内部资源:O_XL,O_YL,CODE1,ATTR,A,B
;       内部调用子程序:PR1
;       程序调用入口: CW1_PR
;       程序输入变量:O_XL,O_YL,CODE1,ATTR
       CW2_PR:  MOV     A,O_YL          ; 计算文本显示RAM 地址
                MOV     B,#PARA1        ; 文本显示区宽度为PARA1
                MUL     AB
                ADD     A,O_XL
                MOV     DAT1,A
                MOV     A,B
                ADDC    A,#00H
                MOV     DAT2,A
                PUSH    ACC             ; 存地址的高8位
                MOV     COM,#24H        ; 设置地址指针
                LCALL   PR1
                MOV     DAT2,CODE1       ; 写入字符代码
                MOV     COM,#0C4H
                LCALL   PR11
                POP     ACC             ; 取地址的高8位
                ADD     A,#08H          ; 计算相应的属性区RAM地址
                MOV     DAT2,A
                MOV     COM,#24H        ; 设置地址指针
                LCALL   PR1
                MOV     DAT2,ATTR       ; 写入属性参数
                MOV     COM,#0C4H
                LCALL   PR11
                RET
;  直接访问方式的驱动子程序
;  程序口地址设置CWADD1,DWADD1
;  占用内部资源DAT1,DAT2,A,DPTR
;  程序输入变量: DAT1,DAT2,COM
;===============直接访问方式驱动子程序======================
; 读状态字子程序
        PR0:    MOV     DPTR,#CWADD1     ; 设置指令通道地址
                MOVX    A,@DPTR
                RET
;---------------------------------------------
; 判状态位S1,S0 子程序(读写指令和读写数据状态)
        ST01:   LCALL   PR0
                JNB     ACC.0,ST01
                JNB     ACC.1,ST01
                RET
;----------------------------------------------
; 判状态位S2子程序(数据自动读状态)
        ST2:    LCALL   PR0
                JNB     ACC.2,ST2
                RET
;----------------------------------------------
; 判状态位S3子程序(数据自动写状态)
        ST3:    LCALL   PR0
                JNB     ACC.3,ST3
                RET
;----------------------------------------------
; 判状态位S6子程序(屏读/屏拷贝状态)
        ST6:    LCALL   PR0
                JB      ACC.6,ERR
                RET
        ERR:    LJMP    ST6             ; 出错处理程序
;======================================
; 写指令和写数据子程序
        PR1:    LCALL   ST01            ; 双字节参数指令写入入口
                MOV     A,DAT1          ; 取第一参数单元数据
                LCALL   PR2             ; 写入参数
        PR11:   LCALL   ST01            ; 单字节参数指令写入入口
                MOV     A,DAT2          ; 取第二参数单元数据
                LCALL   PR2             ; 写入参数
        PR12:   LCALL   ST01            ; 无参数指令写入入口
                MOV     A,COM           ; 取指令代码单元数据
                LJMP    PR21            ; 写入指令代码
        PR2:    MOV     DPTR,#DWADD1    ; 设置数据通道地址/数据写入入口
        PR21:   MOVX    @DPTR,A         ; 写入操作
                RET
;=====================================
; 读数据子程序
        PR3:    LCALL   ST01            ; 判状态位
                MOV     DPTR,#DWADD1    ; 设置数据通道地址
                MOVX    A,@DPTR         ; 读数据操作
                MOV     DAT1,A          ; 数据存入第二参数/数据单元
                RET
                end

⌨️ 快捷键说明

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