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

📄 subprogram.asm

📁 this file for bank in keil
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        MOVX    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
        MOV     A,COUNT1
        ADD     A,#06H
        MOV     COUNT1,A 
     
        INC     DPTR
       ; MOV	A,COUNT1
        CJNE    A,#0F0H,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
        
        MOVX    A,@DPTR       /*左边的字模*/
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;;
        LCALL   _GRAY         ; 调灰度生成子程序
         
        INC     DPTR
        MOVX    A,@DPTR        /*中间的字模*/ 
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;; 
	LCALL   _GRAY          ; 调灰度生成子程序
         
        INC     DPTR
        MOVX    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        ; 计数器加一
        INC     COUNT1
        INC     COUNT1
        INC     DPTR
        MOV     A,COUNT1
        CJNE    A,#48H,CC24PR1; 循环
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 西文字符写入子程序C816_PR     childprogram  (3) 
;  占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
;  内部调用子程序:PR1,PR2,GRAY
;  程序参数: PARA1
;  连接字库: CHTAB816
;  程序调用入口: CW_PR
;  程序输入变量:  O_XL,O_YL,O_YH,CODE
;  我们得到的是8*16的字符
;  西文字符写入子程序如
_C816_PR: MOV     O_XL,R7	
        MOV    O_YL,R5	
        MOV    O_YH,R4
	MOV     CODEE,R3
	MOV     COUNT1,#00H   ; 计数器=0
        MOV     DPTR,#CHTAB816   ; 设置西文字库指针
        MOV     A,CODEE        ; 取字符代码
        MOV     B,#10H        ; 计算字符字模的首地址
        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
C816_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
        MOVX    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        ; 计数器加一
		INC     DPTR
        MOV  	A,COUNT1
        CJNE    A,#10H,C816_PR1 ; 循环
        RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  西文写入子程序(16*16点阵字库)C1616_PR      childprogra           (5)m
;  占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
;  内部调用子程序:PR1,PR2,GRAY
;  连接字库:      CCTAB
;  程序参数: PARA1
;  程序调用入口:  CCW_PR
;
;  程序输入变量:  O_XL,O_YL,O_YH,CODE ,之所以O_XL只用一个字节是因为横向是以字节为单位的640*480横向也就是60个字节
;  汉字写入子程序如下:  基本的过程就是首先计算地址而后取字模的数据
_C1616_PR:MOV     A,R7             ;注意参数的传递的顺序奇数是低字节,而偶数是高字节
        MOV     O_XL,A
	    MOV     A,R5
        MOV     O_YL,A
	    MOV     A,R4
        MOV     O_YH,A
	    MOV     A,R3
	    MOV     CODEE,A
        MOV     COUNT1,#00H   ; 计数器=0
        MOV     DPTR,#CHTAB1616   ; 设置汉字字库指针
        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

C1616_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             
         
        MOVX    A,@DPTR        ; 取左半部字模数
       ;MOV   R7,A             ; ;;;;;;;;;;;
        ;MOV  R6,#48H    ;;;;;;;;;;;;;;;
        LCALL   _GRAY          ; 调灰度生成子程序
        INC     COUNT1 
        INC     DPTR
        MOVX    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        ; 计数器加一
        INC     DPTR
        MOV	A,COUNT1
        CJNE    A,#20H,C1616_PR1; 循环
        RET


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  西文写入子程序(16*16点阵字库)_C1632_PR     childprogra           (5)m
;  占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
;  内部调用子程序:PR1,PR2,GRAY
;  连接字库:      CCTAB
;  程序参数: PARA1           不断的修改子程序达到我们所期望的要求
;  程序调用入口:  CCW_PR
;  16*32的效果,是通过拉伸来实现的 
;  程序输入变量:  O_XL,O_YL,O_YH,CODE ,之所以O_XL只用一个字节是因为横向是以字节为单位的640*480横向也就是60个字节
;  汉字写入子程序如下:  基本的过程就是首先计算地址而后取字模的数据
 

_C1632_PR:MOV     A,R7             ;注意参数的传递的顺序奇数是低字节,而偶数是高字节
        MOV     O_XL,A
	    MOV     A,R5
        MOV     O_YL,A
	    MOV     A,R4
        MOV     O_YH,A
	    MOV     A,R3
	    MOV     CODEE,A
        MOV     COUNT1,#00H   ; 计数器=0
        MOV     DPTR,#CHTAB1616   ; 设置汉字字库指针
        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
C1632_PR0:
        MOV     R0,#00H    
	
C1632_PR1:
     	PUSH    DPL         ;首先将地址入栈
		PUSH    DPH         
        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             
         
        MOVX    A,@DPTR        ; 取左半部字模数
       ;MOV   R7,A             ; ;;;;;;;;;;;
        ;MOV  R6,#48H    ;;;;;;;;;;;;;;;
        LCALL   _GRAY          ; 调灰度生成子程序
         
        INC     DPTR
        MOVX    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      R0
	   POP      DPH             ;将进入循环之前保存的地址再次弹出
	   POP      DPL  
	   CJNE    R0,#02H,C1632_PR1
        INC     COUNT1        ; 计数器加一
        INC     DPTR
		INC     DPTR
        MOV	A,COUNT1
        CJNE    A,#10H,C1632_PR0; 循环
        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,#CHTAB1616   ; 设置西文字库指针
        MOV     A,CODEE        ; 取字符代码

⌨️ 快捷键说明

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