📄 diagnose_whl.asm
字号:
MOVLW HIGH TABLE10
MOVWF PCLATH
MOVF TEMP,W ;用来计查表量的值
CALL TABLE10
MOVWF TEMP_STACK
CLRF PCLATH
MOVLW HIGH INIT_PORT
MOVWF PCLATH
MOVF TEMP_STACK,W
CALL WRITE2
INCF TEMP,F
DECFSZ COUNT,F
GOTO DISP_DISP2_LOOP1
BTFSC FLAG,0 ;来判断是否已经完成了一个字
GOTO DISP_DISP2_END
INCF PAGEADD,F
MOVLW .16
SUBWF CLMADD,F ;其默认值是多少!
BSF FLAG,0 ;置FLAG0为1
GOTO DISP_DISP2_LOOP
DISP_DISP2_END
BCF FLAG,0
DECF PAGEADD,F ;返回上一页
DECFSZ TOTAL,F
GOTO DISP_DISP2_LOOP
NOP
NOP
NOP
RETURN
;*********************************************************
RETURN
;************************************************
INIT_PORT
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD ;清除所有的控制口
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTE
BSF STATUS,RP0 ;select bank1
MOVLW 0X00
MOVWF TRISD ;initial portd,RE0,RB0,RB1,RA3 as output port!
BCF TRISC,RW ;;E-RE2,CS1-RB0,CS2-RA3,R/W-RE0,D/I-RE1
BCF TRISC,DI
BCF TRISC,E
BCF TRISB,CS1
BCF TRISB,CS2
BCF TRISB,4
BCF TRISA,1
BCF TRISA,2
BCF TRISB,0 ;为中断口进入提供条件
MOVLW 0x87
MOVWF ADCON1 ;config the porta and porte as digital port
bcf STATUS,RP0 ;返回BANK0
BSF PORTB,CS1
BSF PORTB,4 ;置高为,不复位
BCF PORTA,1 ;关闭数据入口
BCF PORTA,2 ;
;***************************
CALL DISPOFF1 ;E1边初始化
CALL DISPOFF2 ;E2边初始化
call delay40ms
call delay40ms
call delay40ms
CALL CLEAR1
CALL CLEAR2
MOVLW 0XC0
CALL SEND1 ;初始化从0行开始
CALL SEND2 ;初始化从0行开始
CALL DISPON1
CALL DISPON2
call delay40ms ;添加delay40ms消LCD
call delay40ms
MOVLW 0XC0
CALL SEND1 ;初始化从0行开始
CALL SEND2 ;初始化从0行开始
; CALL DISP_INIT ;显示采集显示
CALL DISP_DISP
call delay40ms
call delay40ms
RETURN
;*****************DISON1***************************************
DISPON1
MOVLW DISP_ON ;将控制命令放在W中
CALL SEND1 ;送出控制命令
CALL LCDSTA1 ;判断是否空闲
BANKSEL TRISD
MOVLW 0XFF
MOVWF TRISD
BANKSEL PORTB
BSF PORTB,CS1 ;CS1=1
BCF PORTB,CS2 ;CS2=0
BSF PORTC,RW ;R/W=1
BCF PORTC,DI ;DI=0
BSF PORTC,E ;E=1,当RW=1,DI=0,在E=1的作用下,状态分别输出到数据总线(DB7~DB0)的相应位
MOVF PORTD,W ;读入液晶的状态时,需要判断其是否为忙
MOVWF LCDFLAG ;读入状态并查询
BTFSC LCDFLAG,5 ;判是否关闭ON/OFF=R/W
GOTO DISPON1 ;如果没有关闭则继续关
RETURN
;*****************DISON2************************************************
DISPON2
MOVLW DISP_ON ;将控制命令放在W中
CALL SEND2 ;送出控制命令
CALL LCDSTA2 ;判断是否空闲
BANKSEL TRISD
MOVLW 0XFF
MOVWF TRISD
BANKSEL PORTB
BCF PORTB,CS1 ;CS1=0
BSF PORTB,CS2 ;CS2=1
BSF PORTC,RW ;R/W=1
BCF PORTC,DI ;DI=0
BSF PORTC,E ;E=1,当RW=1,DI=0,在E=1的作用下,状态分别输出到数据总线(DB7~DB0)的相应位
MOVF PORTD,W ;读入液晶的状态时,需要判断其是否为忙
MOVWF LCDFLAG ;读入状态并查询
BTFSC LCDFLAG,5 ;判是否关闭ON/OFF=R/W
GOTO DISPON2 ;如果没有关闭则继续关
RETURN
;******************DISOFF1*******************************
DISPOFF1
MOVLW DISP_OFF ;将控制命令放在W中FOR REVISE$$$$
CALL SEND1 ;送出控制命令
CALL LCDSTA1 ;判断是否空闲
BANKSEL TRISD
MOVLW 0XFF
MOVWF TRISD
BANKSEL PORTB
BSF PORTB,CS1 ;CS1=1
BCF PORTB,CS2 ;CS2=0
BSF PORTC,RW ;R/W=1
BCF PORTC,DI ;DI=0 读数据
BSF PORTC,E ;E=1,当RW=1,DI=0,在E=1的作用下,状态分别输出到数据总线(DB7~DB0)的相应位
MOVF PORTD,W ;读入液晶的状态时,需要判断其是否为OFF STATUS
MOVWF LCDFLAG ;读入状态并查询
BTFSS LCDFLAG,5 ;判是否关闭OFF=1 ON=0
GOTO DISPOFF1 ;如果没有关闭则继续关
RETURN
;*****************DISOFF2***************************************
DISPOFF2
MOVLW DISP_OFF ;将控制命令放在W中
CALL SEND2 ;送出控制命令
CALL LCDSTA2 ;判断是否空闲
BANKSEL TRISD
MOVLW 0XFF
MOVWF TRISD ;置PORTD为输入状态
BANKSEL PORTB
BCF PORTB,CS1 ;CS1=1
BSF PORTB,CS2 ;CS2=0
BSF PORTC,RW ;R/W=1
BCF PORTC,DI ;DI=0 读数据
BSF PORTC,E ;E=1,当RW=0,DI=0,在E=1的作用下,状态分别输出到数据总线(DB7~DB0)的相应位
MOVF PORTD,W ;读入液晶的状态时,需要判断其是否为忙
MOVWF LCDFLAG ;读入状态并查询
BTFSS LCDFLAG,5 ;判是否关闭ON/OFF=R/W
GOTO DISPOFF2 ;如果没有关闭则继续关
RETURN
;*********************************
CLEAR1 ;清屏
MOVLW 0XB8 ;设置页地址
MOVWF PAGEADD
MOVLW 0X08 ;
MOVWF PAGENUM ;设置总页数
CLR11
MOVF PAGEADD,W
CALL SEND1
MOVLW 0X40 ;设置总列数
MOVWF CLMSUM ;64列
MOVLW 0X40
MOVWF CLMADD ;设置起始列
CLR12
CALL LCDSTA1
MOVLW 0X00 ;写入00H
CALL WRITE1
CLRZ
DECFSZ CLMSUM,F ;本页未清完
GOTO CLR12 ;返回继续
INCF PAGEADD,F ;页号增1
CLRZ
DECFSZ PAGENUM,F ;8页未清完
GOTO CLR11 ;返回继续
RETURN
;*********************************
CLEAR2 ;清屏
MOVLW 0XB8 ;设置页地址
MOVWF PAGEADD
MOVLW 0X08 ;
MOVWF PAGENUM ;设置总页数
CLR21
MOVF PAGEADD,W
CALL SEND2
MOVLW 0X40 ;设置总列数
MOVWF CLMSUM ;64列
MOVLW 0X40
MOVWF CLMADD ;设置起始列
CLR22
CALL LCDSTA1
MOVLW 0X00 ;写入00H
CALL WRITE2
CLRZ
DECFSZ CLMSUM,1 ;本页未清完
GOTO CLR22 ;返回继续
INCF PAGEADD,1 ;页号增1
CLRZ
DECFSZ PAGENUM,1 ;8页未清完
GOTO CLR21 ;返回继续
RETURN
;***********************************
SEND2
MOVWF INTSCODE ;指令暂存INTSCODE
CALL LCDSTA2
BANKSEL TRISD ;select bank1
CLRF TRISD ;set PORTD AS output PORT
BANKSEL PORTB ;选择BANK0
BSF PORTC,E ;E=1
BCF PORTB,CS1 ;CH1=0
BSF PORTB,CS2 ;CH2=1
BCF PORTC,RW ;R/W=0
BCF PORTC,DI ;D/I=0 write status register for control
MOVF INTSCODE,W
MOVWF PORTD
BCF PORTC,E ;E=0 在E的下降沿锁存数据
NOP ;当D/I=0时,在E信号下降沿的作用下,指令码写入IR.
BSF PORTC,RW ;R/W=1
RETURN
;*********SEND INSTRUCTION SUB-ROUTINE TO LCD(SAVE CODE IN W REGISTER)
SEND1
MOVWF INTSCODE ;指令暂存INTSCODE
CALL LCDSTA1 ;to judge the state "busy"???
BANKSEL TRISD
CLRF TRISD ;set PORTD AS output PORT
BANKSEL PORTB ;select bank0
BSF PORTB,CS1 ;CH1=1
BCF PORTB,CS2 ;CH2=0
BCF PORTC,RW ;R/W=0
BCF PORTC,DI ;D/I=0 write status register for control
BSF PORTC,E ;E=1
MOVF INTSCODE,W
MOVWF PORTD
BCF PORTC,E ;E=0 在E的下降沿锁存数据
NOP ;当D/I=0时,在E信号下降沿的作用下,指令码写入IR.
BSF PORTC,RW ;R/W=1
RETURN
;*********************************************
WRITE1
MOVWF SBDATA ;将数据暂存SBDATA
MOVF CLMADD,W ;设置列地址
CALL SEND1 ;写入列地址
CALL LCDSTA1 ;查询液晶是否为忙
BANKSEL TRISD
CLRF TRISD ;设置PORTD为输出
BANKSEL PORTB
BSF PORTC,E ;E=1,in high level to send data
BSF PORTC,DI ;RW=0,DI=1
BCF PORTC,RW
BSF PORTB,CS1
BCF PORTB,CS2
MOVF SBDATA,W
MOVWF PORTD
; BSF PORTB,E ;什么时候为下降沿啊????
NOP
BCF PORTC,E ;E=0在下降沿的时候触发写入数据
; BSF PORTA,5
INCF CLMADD,1 ;REVISE
; NOP
BSF PORTC,RW
RETURN
;***********************8
WRITE2
MOVWF SBDATA ;将数据暂存SBDATA
MOVF CLMADD,W ;设置列地址
CALL SEND2 ;写入列地址
CALL LCDSTA2 ;查询液晶是否为忙
BANKSEL TRISD
CLRF TRISD ;设置PORTD为输出
BANKSEL PORTB
; BSF PORTB,E ;E=1,in high level to send data
BSF PORTC,DI ;RW=0,DI=1
BCF PORTC,RW
BCF PORTB,CS1
BSF PORTB,CS2
MOVF SBDATA,W
MOVWF PORTD
BSF PORTC,E ;什么时候为下降沿啊????
NOP
BCF PORTC,E ;E=0在下降沿的时候触发写入数据
; BSF PORTA,5
INCF CLMADD,F ;REVISE
; NOP
BSF PORTC,RW
RETURN
;****************************************8
LCDSTA1
BANKSEL TRISD
MOVLW 0XFF ;set portd as input state
MOVWF TRISD
BANKSEL PORTB ;E-RE2,CS1-RB0,CS2-RA3,R/W-RE0,D/I-RE1
BSF PORTB,CS1
BCF PORTB,CS2
BSF PORTC,RW ;在E信号为“H”的作用下R/W=1,D/I=0情况下读取值
; BSF PORTB,E ;修改;2005,5,16:19
BCF PORTC,DI ;读显示数据DI=0
BSF PORTC,E ;修改;2005,5,16:12
BUSY1
MOVF PORTD,W
MOVWF LCDFLAG
BCF PORTC,E ;修改;2005,5,16:12
BTFSC LCDFLAG,7 ;判断是否处于“BUSY”状态
GOTO BUSY1
RETURN
;*************************************
LCDSTA2
BANKSEL TRISD
MOVLW 0XFF ;set portd as input state
MOVWF TRISD
BANKSEL PORTB ;E-RE2,CS1-RB0,CS2-RA3,R/W-RE0,D/I-RE1
BCF PORTB,CS1
BSF PORTB,CS2
BSF PORTC,RW ;在E信号为“H”的作用下R/W=1,D/I=1情况下读取值
; BSF PORTB,E
BCF PORTC,DI ;读显示数据DI=0
BSF PORTC,E ;修改;2005,5,16:12
BUSY2
MOVF PORTD,W
MOVWF LCDFLAG
BSF PORTC,E ;修改;2005,5,16:12
BTFSC LCDFLAG,7 ;判断是否处于“BUSY”状态
GOTO BUSY2
RETURN
delay40ms
movlw 0x30
movwf LOOP1_STACK
loop1
movlw 0xF9
movwf LOOP2_STACK
loop2
nop
nop
decfsz LOOP2_STACK,F
goto loop2
decfsz LOOP1_STACK,F
goto loop1
return
;*******************************************************
ORG 0X1800
TABLE1 ;共256列8个字
ADDWF PCL,1
;***************CS1,PAGE1********************
RETLW 0X10
RETLW 0X92
RETLW 0X54
RETLW 0X38
RETLW 0XFF
RETLW 0X38
RETLW 0X54
RETLW 0X52
RETLW 0X80
RETLW 0XF0
RETLW 0X1F
RETLW 0X12
RETLW 0X10
RETLW 0XF0
RETLW 0X10
RETLW 0X00; "数"的上部分
RETLW 0X08
RETLW 0X08
RETLW 0X08
RETLW 0XFF
RETLW 0X88
RETLW 0X40
RETLW 0XFE
RETLW 0X92
RETLW 0X92
RETLW 0X92
RETLW 0XF2
RETLW 0X92
RETLW 0X92
RETLW 0X9E
RETLW 0X80
RETLW 0X00; "据"的上部分
RETLW 0X00
RETLW 0X02
RETLW 0X02
RETLW 0XC2
RETLW 0X02
RETLW 0X02
RETLW 0X02
RETLW 0X02
RETLW 0XFE
RETLW 0X82
RETLW 0X82
RETLW 0X82
RETLW 0X82
RETLW 0X82
RETLW 0X02
RETLW 0X00; "正"的上部分
RETLW 0X00
RETLW 0X04
RETLW 0X04
RETLW 0XC4
RETLW 0X64
RETLW 0X9C
RETLW 0X87
RETLW 0X84
RETLW 0X84
RETLW 0XE4
RETLW 0X84
RETLW 0X84
RETLW 0X84
RETLW 0X84
RETLW 0X04
RETLW 0X00; "在",的上部分
RETLW 0X42
RETLW 0X42
RETLW 0X2A
RETLW 0X2E
RETLW 0X13
RETLW 0X1A
RETLW 0X26
RETLW 0X02
RETLW 0X40
RETLW 0X20
RETLW 0X13
RETLW 0X0C
RETLW 0X33
RETLW 0X60
RETLW 0X20
RETLW 0X00 ;"数"的下部分
RETLW 0X02
RETLW 0X42
RETLW 0X81
RETLW 0X7F
RETLW 0X40
RETLW 0X30
RETLW 0X0F
RETLW 0XFC;
RETLW 0X44
RETLW 0X44
RETLW 0X47
RETLW 0X44
RETLW 0X44
RETLW 0XFC
RETLW 0X00
RETLW 0X00;"据"的下部分
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X3F
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X3F
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X00;"正"的下部分
RETLW 0X04
RETLW 0X02
RETLW 0X01
RETLW 0X7F
RETLW 0X00
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X3F
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X20
RETLW 0X00;";"在",的下部分
RETLW 0X40
RETLW 0X42
RETLW 0X4C
RETLW 0XC4
RETLW 0X00
RETLW 0X22
RETLW 0XAA
RETLW 0XAA;
RETLW 0XAA
RETLW 0XBF
RETLW 0XAA
RETLW 0XAA
RETLW 0XAA
RETLW 0X22
RETLW 0X20
RETLW 0X00; "请",的上部分
RETLW 0X00
RETLW 0X12
RETLW 0X92
RETLW 0X72
RETLW 0XFF
RETLW 0X51
RETLW 0X81
RETLW 0XF2
RETLW 0X9C
RETLW 0X90
RETLW 0X9F
RETLW 0X90
RETLW 0X98
RETLW 0XF4
RETLW 0X02
RETLW 0X00; ;"稍"的上部分
;*************************CS1 PAGE3********************
RETLW 0X40
RETLW 0X20
RETLW 0XF8
RETLW 0X07
RETLW 0XF2
RETLW 0X08
RETLW 0X0A
RETLW 0XFA
RETLW 0X4A
RETLW 0XCA
RETLW 0X4A
RETLW 0X4E
RETLW 0X4A
RETLW 0X48
RETLW 0X08
RETLW 0X00; "候",的上部分
;腾粗出一个字的空间
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X7F
RETLW 0X20
RETLW 0X10
RETLW 0XFF
RETLW 0X0A;
RETLW 0X0A
RETLW 0X0A
RETLW 0X4A
RETLW 0X8A
RETLW 0X7F
RETLW 0X00
RETLW 0X00
RETLW 0X00;"请",的下部分
RETLW 0X08
RETLW 0X06
RETLW 0X01
RETLW 0X00
RETLW 0XFF
RETLW 0X00
RETLW 0X00
R
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -