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

📄 subprogram.asm

📁 this file is for keil LCD
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        MOV     DPTR,#CCTAB   ; 设置汉字字库指针
        MOV     A,CODEE        ; 取汉字代码
        MOV     B,#20H        ; 计算字模首地址
        MUL     AB             ; 
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
        MOV	A,O_XL	      ; 8点占2个字节
	RL	A	      ; X*2(change the acc to a)
	MOV	O_XL,A
        MOV     A,O_YL        ; XY坐标值转换成显示RAM 地址值
        MOV     B,#PARA1      ; 显示域宽度值
        MUL     AB            ;所使用的正好是多字节乘法的内容
	ADD	A,O_XL
	MOV	O_XL,A
	MOV	A,B
	ADDC	A,#00H
	MOV	O_YL,A
        MOV     A,O_YH
        MOV     B,#PARA1
        MUL     AB
        ADD     A,O_YL
        MOV     O_YL,A        ; 地址存入O_XL,O_YL和O_YH,也就是说显示的地址占用三个字节,由低到高依次排列,使用的是多字节乘法错位相加的思路
       MOV     A,B
	ADDC	A,#00H          ;因为是128K所以必然要使用三个字节因为两个字节就是64K的地址 
        MOV     O_YH,A

CCW_PR1:MOV	A,O_YH
	MOV	C,ACC.0	      ; 取A16值.因为一共是128K所以要判断A16的值来确定上低64K还是高64K
	CLR	A
	MOV	ACC.2,C
	MOV	COM,A
	ORL     COM,#08H        ; 设置显示RAM单元地址
        LCALL   PR1
        MOV     DAT1,O_XL      ;所以第三个字节仅仅就是一个标志位
        LCALL   PR2
        INC	COM
        LCALL   PR1
        MOV     DAT1,O_YL
        LCALL   PR2
        INC	COM            ; 设置显示数据读写状态
        LCALL   PR1
        MOV     A,COUNT1
        MOVC    A,@A+DPTR     ; 取左半部字模数
        ;MOV   R7,A            ;;;;;;;;;;;;
        ;MOV  R6,#48H    ;;;;;;;;;;;;;;;
        LCALL   _GRAY          ; 调灰度生成子程序
        MOV     A,COUNT1
        ORL     A,#10H        ; 计算右半部字模地址,这个偏移地址的确定与字模数据的存储的形式有关
        MOVC    A,@A+DPTR     ; 取右半部字模数据  
         ;MOV   R7,A            ;;;;;;;;;;;;
        ;MOV  R6,#48H    ;;;;;;;;;;;;;;;
	LCALL   _GRAY          ; 调灰度生成子程序
        MOV     A,O_XL        ; 修正地址
        ADD     A,#PARA1      ;相当于光标向下移动一行
        MOV     O_XL,A
        MOV     A,O_YL        ;双字节加法的简单的应用
        ADDC    A,#00H
        MOV     O_YL,A
	CLR	A
	ADDC	A,O_YH          ;防止进入下一个显示区域 
	MOV	O_YH,A
        INC     COUNT1        ; 计数器加一
        MOV	A,COUNT1
        CJNE    A,#10H,CCW_PR1; 循环
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 汉字写入子程序(24*24点阵字库)CC24PR    childpam(4)
;  占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
;  内部调用子程序:PR1,PR2
;  连接字库:      CCTAB24
;  程序参数: PARA1
;  程序调用入口:  CC24PR
;  程序输入变量:  O_XL,O_YL,O_YH,CODE
;  汉字写入子程序如下:
_CC24PR:  MOV     O_XL,R7	
          MOV     O_YL,R5	
          MOV     O_YH,R4
	  MOV     CODEE,R3
         MOV     COUNT1,#00H   ; 计数器=0
        MOV     DPTR,#CCTAB24 ; 设置汉字字库指针
        MOV     A,CODEE        ; 取汉字代码
        MOV     B,#48H        ; 计算字模数据首地址
        MUL     AB
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
	MOV	A,O_XL	      ; 8点占2个字节
	RL	A	      ; X*2(change the acc to the a)
	MOV	O_XL,A
        MOV     A,O_YL        ; XY坐标值转换成显示RAM 地址值
        MOV     B,#PARA1      ; 显示域宽度值
        MUL     AB
	ADD	A,O_XL
	MOV	O_XL,A
	MOV	A,B
	ADDC	A,#00H
	MOV	O_YL,A
        MOV     A,O_YH
        MOV     B,#PARA1
        MUL     AB
        ADD     A,O_YL
        MOV     O_YL,A         ; 地址存入O_XL,O_YL和O_YH
        MOV     A,B
	ADDC	A,#00H
        MOV     O_YH,A
CC24PR1:MOV	A,O_YH
	MOV	C,ACC.0	   ; 取A16值
	CLR	A
	MOV	ACC.2,C
	MOV	COM,A
	ORL     COM,#08H        ; 设置显示RAM单元地址
        LCALL   PR1
        MOV     DAT1,O_XL
        LCALL   PR2
        INC	COM
        LCALL   PR1
        MOV     DAT1,O_YL
        LCALL   PR2
        INC	COM             ; 设置显示数据读写状态,真正的或读或写动作由后续的指令来完成 
        LCALL   PR1
        MOV     A,COUNT1
        MOVC    A,@A+DPTR     ; 取左半部字模数
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;;
        LCALL   _GRAY         ; 调灰度生成子程序
        MOV     A,COUNT1
        ADD     A,#18H        ; 计算中部字模地址
        MOVC    A,@A+DPTR     ; 取中部字模数据
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;; 
	LCALL   _GRAY          ; 调灰度生成子程序
        MOV     A,COUNT1
        ADD     A,#30H        ; 计算右半部字模地址
        MOVC    A,@A+DPTR     ; 取右半部字模数据
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;;
	LCALL   _GRAY          ; 调灰度生成子程序
        MOV     A,O_XL        ; 修正地址
        ADD     A,#PARA1      ; 显示地址向下移动一列
        MOV     O_XL,A
        MOV     A,O_YL
        ADDC    A,#00H
        MOV     O_YL,A
	CLR	A
	ADDC	A,O_YH
	MOV	O_YH,A
        INC     COUNT1        ; 计数器加一
        MOV	A,COUNT1
        CJNE    A,#18H,CC24PR1; 循环
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 西文字符写入子程序CW_PR     childprogram  (3)
;  占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
;  内部调用子程序:PR1,PR2,GRAY
;  程序参数: PARA1
;  连接字库: CHTAB
;  程序调用入口: CW_PR
;  程序输入变量:  O_XL,O_YL,O_YH,CODE
;  西文字符写入子程序如
_CW_PR: MOV     O_XL,R7	
        MOV    O_YL,R5	
        MOV    O_YH,R4
	MOV     CODEE,R3
	MOV     COUNT1,#00H   ; 计数器=0
        MOV     DPTR,#CHTAB   ; 设置西文字库指针
        MOV     A,CODEE        ; 取字符代码
        MOV     B,#08H        ; 计算字符字模的首地址
        MUL     AB            ; 建立字模指针
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
 	MOV	A,O_XL
	RL	A	       ; X*2(change the acc to a)
	MOV	O_XL,A
	MOV	A,O_YL         ; 坐标值转换地址值计算
        MOV     B,#PARA1       ; 显示域宽度
        MUL     AB
	ADD	A,O_XL
        MOV     O_XL,A
	MOV	A,B
	ADDC	A,#00H
	MOV	O_YL,A
        MOV     A,O_YH
        MOV     B,#PARA1
        MUL     AB
        ADD     A,O_YL
        MOV     O_YL,A        ; 地址存入O_XL,O_YL和O_YH
        CLR	A
        ADDC    A,#00H
        MOV     O_YH,A
CW_PR1: MOV	A,O_YH
	MOV	C,ACC.0	      ; 取A16值
	CLR	A
	MOV	ACC.2,C
	MOV	COM,A
	ORL     COM,#08H      ; 设置显示RAM 单元地址
        LCALL   PR1
        MOV     DAT1,O_XL
        LCALL   PR2
	INC	COM
        LCALL   PR1
        MOV     DAT1,O_YL
        LCALL   PR2
	INC	COM	      ; 设置写入显示数据指令
        LCALL   PR1
        MOV     A,COUNT1      ; 取间址
        MOVC    A,@A+DPTR     ; 取字模数据
       ; MOV   R7,A            ;;;;;;;;;;;;
        ;MOV  R6,#48H    ;;;;;;;;;;;;;;;	
        LCALL   _GRAY          ; 调灰度生成子程序
        MOV     A,O_XL        ; 修正地址值
        ADD     A,#PARA1      
        MOV     O_XL,A
        MOV     A,O_YL
        ADDC    A,#00H
        MOV     O_YL,A
	MOV	A,O_YH
	ADDC	A,#00H
	MOV	O_YH,A
        INC     COUNT1        ; 计数器加一
        MOV	A,COUNT1
        CJNE    A,#08H,CW_PR1 ; 循环
        RET
;;this place i want to write 16*8 english charactors to display on the screen
;;I WANT IT TO WORKS ,LET us TEST IT!他的这个16*8是靠8*8拉长形成的.  

_CW_PRR:  MOV     O_XL,R7	
        MOV    O_YL,R5	
        MOV    O_YH,R4
	MOV     CODEE,R3
	MOV     COUNT1,#00H    ; 计数器=0
        MOV     DPTR,#CHTAB   ; 设置西文字库指针
        MOV     A,CODEE       ; 取字符代码
        MOV     B,#08H        ; 计算字符字模的首地址
        MUL     AB            ; 建立字模指针
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
 	MOV	A,O_XL
	RL	A	       ; X*2(change the acc to a)
	MOV	O_XL,A
	MOV	A,O_YL         ; 坐标值转换地址值计算
        MOV     B,#PARA1       ; 显示域宽度
        MUL     AB
	 ADD	A,O_XL
        MOV     O_XL,A
	 MOV	A,B
	 ADDC	A,#00H
	 MOV	O_YL,A
        MOV     A,O_YH
        MOV     B,#PARA1
        MUL     AB
        ADD     A,O_YL
        MOV     O_YL,A        ; 地址存入O_XL,O_YL和O_YH
        CLR	A
        ADDC  A,#00H
        MOV   O_YH,A
     PP:MOV   R0,#00H
CW_PR51: MOV	A,O_YH
	MOV	C,ACC.0	      ; 取A16值
	CLR	A
	MOV	ACC.2,C
	MOV	COM,A
	ORL     COM,#08H      ; 设置显示RAM 单元地址
        LCALL   PR1
        MOV     DAT1,O_XL
        LCALL   PR2
	INC	COM
        LCALL   PR1
        MOV     DAT1,O_YL
        LCALL   PR2
	INC	COM	          ; 设置写入显示数据指令
        LCALL   PR1
        MOV     A,COUNT1      ; 取间址
        MOVC    A,@A+DPTR     ; 取字模数据
      	LCALL   _GRAY          ; 调灰度生成子程?
        INC R0
        MOV     A,O_XL        ; 修正地址值
        ADD     A,#PARA1
        MOV     O_XL,A
        MOV     A,O_YL
        ADDC    A,#00H
        MOV     O_YL,A
	MOV	A,O_YH
	ADDC	A,#00H
	MOV	O_YH,A
        MOV A,R0
        MOV B,#02H
        DIV AB
        MOV A,B
        JNZ CW_PR51
        INC     COUNT1 
       ;IF COUNT/2!=0; LCALL CW_PR51
        ; ELSE UNDER
         
        MOV	A,COUNT1
       CJNE   A,#08H,CW_PR51 ; 循环
        RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;this   place i want to wipe the 16*8 english charactors on the screen
_CLCW_PRR:  MOV     O_XL,R7	
        MOV    O_YL,R5	
        MOV    O_YH,R4
	;MOV     CODEE,R3
	MOV     COUNT1,#00H   ; 计数器=0
        MOV     DPTR,#CHTAB   ; 设置西文字库指针
        MOV     A,CODEE        ; 取字符代码
        MOV     B,#08H        ; 计算字符字模的首地址
        MUL     AB            ; 建立字模指针
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
 	MOV	A,O_XL
	RL	A	       ; X*2(change the acc to a)
	MOV	O_XL,A
	MOV	A,O_YL         ; 坐标值转换地址值计算
        MOV     B,#PARA1       ; 显示域宽度
        MUL     AB
	ADD	A,O_XL
        MOV     O_XL,A
	MOV	A,B
	ADDC	A,#00H
	MOV	O_YL,A
        MOV     A,O_YH
        MOV     B,#PARA1
        MUL     AB
        ADD     A,O_YL
        MOV     O_YL,A        ; 地址存入O_XL,O_YL和O_YH
        CLR	A
        ADDC    A,#00H
        MOV     O_YH,A
    cPP:MOV R0,#00H
C_PR51: MOV	A,O_YH
	MOV	C,ACC.0	      ; 取A16值
	CLR	A
	MOV	ACC.2,C
	MOV	COM,A
	ORL     COM,#08H      ; 设置显示RAM 单元地址
        LCALL   PR1
        MOV     DAT1,O_XL

⌨️ 快捷键说明

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