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

📄 液晶程序.txt

📁 51单片机液晶显示初始化及显示汉字程序
💻 TXT
字号:
;**********************************************************
;R2用于存放键盘的键值。R5-R6用于延时设置。R5还用于光标的移位设置
;
;
W_C_GLCD	XDATA	 8000H;8000H
W_D_GLCD	XDATA	 8200H;8001H
R_B_GLCD	XDATA	 8100H;8002H
R_D_GLCD	XDATA	 8300H;8003H
;===================================================
KEY      DATA  30H
N        DATA  31H ;行数变量
ADDR     DATA  32H ;起始的显示位置
X        DATA  33H
Y        DATA  34H
POS      DATA  35H
MOVE_UP  DATA  36H
MOVE_DN  DATA  37H
UP_DOWN  DATA  38H
MODENUM  DATA  39H  ;方式总数量减1
MODEFLAG DATA  3AH ;方式:00-AM,01-FM,02-ASK,03-FSK,04-PSK,05-DPSK,06-QPSK,07-OQPSK08-DQPSK
MODEFLAG1 DATA 3BH ;用于暂存方式的变量
FRSH      DATA  3CH  ;源
FRSL      DATA  3DH
FRDH     DATA  3EH   ;目标
FRDL     DATA  3FH

FR00     DATA  40H    ;存储输入的频率,
FR01     DATA  41H
FR02     DATA  42H
FR03     DATA  43H
FR04     DATA  44H


FR10     DATA  45H      ;暂存频率变量
FR11     DATA  46H
FR12     DATA  47H
FR13     DATA  48H
FR14     DATA  49H
;FR15     DATA  4AH

INFPOS   DATA  4AH       ;输入频率指示
NOWKEY   DATA  4BH
DELO     DATA  4CH   ;延时外层循环
DELI     DATA  4DH   ;延时内层循环
RRLONG   DATA  4EH   ;低位将要去掉的长度
USENUM   DATA  4FH   ;相位累加器的高段有效数
ACC0     DATA  50H
ACC1     DATA  51H

FRDATA0  DATA  52H
FRDATA1  DATA  53H

FR05     DATA  54H
FR06     DATA  55H
INFPOS1   DATA  56H

     ORG 0000H
     LJMP MAIN
     ORG 0100H
MAIN:
     MOV SP,#60h          ;设置堆栈 ,sp总是初始化到内部RAM地址07。
                          ;也可以改SP值,从而改变堆栈的位置


     LCALL INITIAL_GLCD	  ;调用LCD初试化
     LCALL DELAY

     CH_BUSY:
     MOV  DPTR,#8100H
     MOVX A,@DPTR
     ANL  A,#80H
     JNZ   CH_BUSY
             
     MOV  DPTR,#8000H
     MOV  A,#80H
     MOVX @DPTR,A
     LCALL DELAY
     
     MOV   DPTR,#HANG
     MOV   A,#00H
     MOVC  A,@A+DPTR
     MOV   DPTR,#8200H
     MOVX  @DPTR,A
     
     LCALL DELAY
     MOV   DPTR,#HANG
     MOV   A,#01H
     MOVC  A,@A+DPTR
     MOV   DPTR,#8200H
     MOVX  @DPTR,A
     
     JMP   $
 HANG: DB "王"        
     
;----------------------------------------------------------------------------
;光标移位控制,POS为移位数

CURSOR_MOVE:
           PUSH A

           MOV     A,#02H          ;光标回到第一行第一列
           CALL    COMMAND_GLCD
           MOV  A,POS
           JZ   END_MOVE
           MOV  R5,A
MOVE:
           MOV     A,#14H          ;光标移到
           CALL    COMMAND_GLCD
           DJNZ    R5,MOVE
    END_MOVE:
           POP A
           RET


;--------------------------------------------------------------------------
;显示汉字16X16点阵

DHZ:      MOV  	        B,N		 ;  显示数量
DHZ1:     MOV   	A,ADDR;
          ORL    	A,#80H  	 ;  送显示地址
          LCALL 	COMMAND_GLCD     ;  调写命令子程序
DHZ2:
          CLR  	A
          MOVC  	A,@A+DPTR        ;  查找汉字的高位码
          INC   	DPTR
	  LCALL 	WRITE_GLCD       ;  送显示

          CLR  	A
          MOVC  	A,@A+DPTR	 ;  查找汉字的低位码
          INC   	DPTR
          LCALL 	WRITE_GLCD   ;  送显示

          DJNZ  	B,DHZ2
          RET
;---------------------------------------------------------

;***************************************************************


INITIAL_GLCD:
        PUSH    ACC
        MOV     DELO,#01H
        MOV     DELI,#0FH
        MOV     A,#30H          ;功能设定
        CALL    COMMAND_GLCD
        LCALL    DELAY
        MOV     A,#30H          ;功能设定
        CALL    COMMAND_GLCD
        MOV     A,#30H
	LCALL    DELAY           ;功能设定
        CALL    COMMAND_GLCD
	LCALL    DELAY
        MOV     A,#06H          ;显示器控制:游标不显示;但是字会闪烁
        CALL    COMMAND_GLCD
        MOV     A,#01H
        LCALL    DELAY;清除显示器
        CALL    COMMAND_GLCD

        MOV     A,#0FH          ;进入模式设定
        CALL    COMMAND_GLCD

        POP     ACC
        RET
;----------------------------------------------------------------------------
;检查LCD 忙碌标志
CHKBUSY_GLCD:
        PUSH    DPH
	PUSH    DPL
        PUSH    ACC
        MOV     DPTR,#R_B_GLCD
CHK:    MOVX    A,@DPTR
        JB      ACC.7,CHK	  ;判别是不是忙?
        POP     ACC
        POP     DPL
	POP     DPH
        RET

;---------------------------------------------------------------
;写命令到 GLCD
COMMAND_GLCD:
        PUSH    DPH
	PUSH    DPL
        CALL    CHKBUSY_GLCD   ;判别是不是忙?
        MOV     DPTR,#W_C_GLCD
        MOVX    @DPTR,A		 ;写入命令
        POP     DPL
	POP     DPH

        RET

;---------------------------------------------------------------
;写资料到 GLCD
WRITE_GLCD:
        PUSH    DPH
	PUSH    DPL
        CALL    CHKBUSY_GLCD   ;判别是不是忙?
        MOV     DPTR,#W_D_GLCD ;写入数据
        MOVX    @DPTR,A
        POP     DPL
	POP     DPH

        RET

;清除 LCD 的显示幕
CLEAR_GLCD:
        PUSH    ACC
        MOV     A,#01H          ;清除显示器
        CALL    COMMAND_GLCD
        POP     ACC
        RET



;由此可计算出延时的总周期数N为:N=DELO*DELI*2+DELO*2+DELO*2+4=2*DELO*DELI+4*DELO+4
;延时的时间为:t=T*N,T为指令周期
DELAY:                 ;执行次数  周期个数
     MOV   R5,DELO     ;  1           2
  DELAY1:
     MOV   R6,DELI     ;  DELO        2
  DELAY2:
     DJNZ  R6,DELAY2   ;  DELO*DELI   2
     DJNZ  R5,DELAY1   ;  DELO        2
     RET               ;  1           2

END

⌨️ 快捷键说明

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