#include "p16f84a.inc" ; This includes PIC16F84A definitions for the MPASM assembler ; Controlling a Toshiba T6963C controller based graphical LCD errorlevel -302 DATA_BUFFER EQU 0x20 DATA_BUFFER2 EQU 0x21 CMD_BUFFER EQU 0x22 REF_BUFFER EQU 0x24 ADDR_INDEX EQU 0x25 ;STARTING ADDRESS IN EEPROM ADDR_L EQU 0x26 ;STARTING ADDRESS L ADDR_H EQU 0x27 ;STARTING ADDRESS H COUNTER_INDEX EQU 0x29 ;COUNTER BIT_INDEX EQU 0x2A ;BIT INDEX CMD_SET_CURSOR EQU 21H ;SET CURSOR CMD_TXHOME EQU 40H ;SET TXT HM ADD CMD_TXAREA EQU 41H ;SET TXT AREA CMD_GRHOME EQU 42H ;SET GR HM ADD CMD_GRAREA EQU 43H ;SET GR AREA CMD_OFFSET EQU 22H ;SET OFFSET ADD CMD_ADPSET EQU 24H ;SET ADD PTR CMD_SETDATA_INC EQU 0C0H ;WRITE DATA AND INCREASE ADP CMD_AWRON EQU 0B0H ;SET AUTO WRITE MODE CMD_AWROFF EQU 0B2H ;RESET AUTO WRITE MODE GOTO START ORG 0x10 ; DATA DATA_NUM EQU 23H TXPRT ; Text data "Grapical LCD T6963C for Multisim" ADDWF PCL, 1 RETLW 0x27 RETLW 0x52 RETLW 0x41 RETLW 0x50 RETLW 0x48 RETLW 0x49 RETLW 0x43 RETLW 0x41 RETLW 0x4c RETLW 0x00 RETLW 0x2C RETLW 0x23 RETLW 0x24 RETLW 0x00 RETLW 0x34 RETLW 0x16 RETLW 0x19 RETLW 0x16 RETLW 0x13 RETLW 0x23 RETLW 0x00 RETLW 0x00 RETLW 0x00 RETLW 0x46 RETLW 0x4f RETLW 0x52 RETLW 0x00 RETLW 0x2d RETLW 0x55 RETLW 0x4c RETLW 0x54 RETLW 0x49 RETLW 0x53 RETLW 0x49 RETLW 0x4d START BCF STATUS, RP0 ;BANK 0 CLRF PORTA CLRF PORTB BSF STATUS, RP0 ;BANK 1 MOVLW 0x80 ;DISABLE WEAK PULLUP RESISTORS MOVWF OPTION_REG MOVLW 0x00 ;SET PORTA AS OUTPUTS MOVWF TRISA MOVLW 0x00 ;SET PORTB AS OUTPUTS MOVWF TRISB BCF STATUS, RP0 ;BANK 0 MOVLW 0x0F ; 1111 no commands ready MOVWF PORTA ;1 SET DISPLAY MODE to GRAPH + TEXT mode, cursor off MOVLW 0x9C MOVWF CMD_BUFFER CALL CMD ;2 SET GRAPHIC MODE HOME ADDRESS to 0x0000 MOVLW 0x00 MOVWF DATA_BUFFER MOVLW 0x00 MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_GRHOME MOVWF CMD_BUFFER CALL CMD ;3 SET TEXT MODE HOME ADDRESS to 0x2941 MOVLW 0x41 MOVWF DATA_BUFFER MOVLW 0x29 MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_TXHOME MOVWF CMD_BUFFER CALL CMD ;4 SET CHARACTER MODE to use OR, use internal CG MOVLW 0x80 MOVWF CMD_BUFFER CALL CMD MOVLW 0x00 ; Initial the address 0 MOVWF ADDR_L LOOP_MAIN ;5 write string MOVLW 0x7D MOVWF DATA_BUFFER MOVLW 0x29 MOVWF DATA_BUFFER2 ; external CG start at: 1400h CALL DT2 MOVLW CMD_ADPSET MOVWF CMD_BUFFER CALL CMD MOVLW CMD_AWRON MOVWF CMD_BUFFER CALL CMD MOVLW 0x00 ; Initial the counter MOVWF ADDR_INDEX LOOP_READ_DATA2 MOVF ADDR_INDEX,0 ; STARTING data ADDRESS CALL TXPRT MOVWF DATA_BUFFER ; LOAD CHAR data TO W CALL ADT INCF ADDR_INDEX,1 MOVF ADDR_INDEX, 0 SUBLW DATA_NUM ; 35 chars BTFSS STATUS, Z GOTO LOOP_READ_DATA2 MOVLW CMD_AWROFF MOVWF CMD_BUFFER CALL CMD ;6 draw wave once MOVF ADDR_L, 0 BTFSC STATUS, Z CALL DRAW_WAVE ;show text only ;7 SET DISPLAY MODE to TEXT mode, cursor off MOVLW 0x94 MOVWF CMD_BUFFER CALL CMD ;8 show graph only ; SET DISPLAY MODE to GRAPH mode, cursor off MOVLW 0x98 MOVWF CMD_BUFFER CALL CMD ;9 show both ; SET DISPLAY MODE to GRAPH + TEXT mode, cursor off MOVLW 0x9C MOVWF CMD_BUFFER CALL CMD ;10 move text right in 20 steps MOVLW 0x00 ; Initial the counter MOVWF ADDR_INDEX LOOP_MOVE_RIGHT INCF ADDR_INDEX,1 MOVF ADDR_INDEX, 0 SUBLW 0x41 MOVWF DATA_BUFFER MOVLW 0x29 MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_TXHOME MOVWF CMD_BUFFER CALL CMD MOVF ADDR_INDEX, 0 SUBLW 0x14 ; 20 times BTFSS STATUS, Z GOTO LOOP_MOVE_RIGHT ;11 move left in 20 steps MOVLW 0x14 ; Initial the counter MOVWF ADDR_INDEX LOOP_MOVE_LEFT DECF ADDR_INDEX,1 MOVF ADDR_INDEX, 0 SUBLW 0x41 MOVWF DATA_BUFFER MOVLW 0x29 MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_TXHOME MOVWF CMD_BUFFER CALL CMD MOVF ADDR_INDEX, 0 SUBLW 0x00 ; 20 times BTFSS STATUS, Z GOTO LOOP_MOVE_LEFT ;5x for set display on/off ;12 SET DISPLAY off MOVLW 0x90 MOVWF CMD_BUFFER CALL CMD ;13 wait 256 cycles MOVLW 0x00 ; Initial the counter MOVWF ADDR_INDEX LOOP_SET_ON_OFF INCF ADDR_INDEX,1 MOVF ADDR_INDEX, 0 SUBLW 0xFF ; 256 cycles BTFSS STATUS, Z GOTO LOOP_SET_ON_OFF ;14 SET DISPLAY MODE to TEXT mode, cursor off MOVLW 0x9C MOVWF CMD_BUFFER CALL CMD ;6x for set cursor ;15 SET CURSOR ON MOVLW 0x9F MOVWF CMD_BUFFER CALL CMD ;16 wait 64 cycles MOVLW 0x00 ; Initial the counter MOVWF ADDR_INDEX LOOP_SET_CURSOR MOVF ADDR_INDEX,0 ; STARTING data ADDRESS MOVWF DATA_BUFFER ;17 SET CURSOR SIZE ANDLW 0x07 ADDLW 0xA0 MOVWF CMD_BUFFER CALL CMD ;18 MOVE CURSOR MOVLW 0x04 MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_SET_CURSOR MOVWF CMD_BUFFER CALL CMD INCF ADDR_INDEX,1 MOVF ADDR_INDEX, 0 SUBLW 0x14 ; 20 cycles BTFSS STATUS, Z GOTO LOOP_SET_CURSOR ;19 SET DISPLAY MODE to GRAPH + TEXT mode, cursor off MOVLW 0x9C MOVWF CMD_BUFFER CALL CMD ;7x refresh screen MOVLW 0x00 ; Initial the counter MOVWF ADDR_INDEX LOOP_REFRESH_1 ;20 SET TEXT HOME ADDRESS to 0x0000 MOVLW 0x40 MOVWF DATA_BUFFER MOVLW 0x49 MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_TXHOME MOVWF CMD_BUFFER CALL CMD ;21 SET TEXT HOME ADDRESS to 0x0040 MOVLW 0x41 MOVWF DATA_BUFFER MOVLW 0x29 MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_TXHOME MOVWF CMD_BUFFER CALL CMD INCF ADDR_INDEX,1 MOVF ADDR_INDEX, 0 SUBLW 0x05 ; 5 cycles BTFSS STATUS, Z GOTO LOOP_REFRESH_1 ;22 clean 1 MOVLW 0x7D MOVWF DATA_BUFFER MOVLW 0x29 MOVWF DATA_BUFFER2 ; external CG start at: 1400h CALL DT2 MOVLW CMD_ADPSET MOVWF CMD_BUFFER CALL CMD MOVLW CMD_AWRON MOVWF CMD_BUFFER CALL CMD MOVLW 0x00 ; Initial the counter MOVWF ADDR_INDEX LOOP_CLEAN_ALL_1 MOVLW 0x00 MOVWF DATA_BUFFER ; LOAD CHAR data TO W CALL ADT INCF ADDR_INDEX,1 MOVF ADDR_INDEX, 0 SUBLW DATA_NUM ; 35 chars BTFSS STATUS, Z GOTO LOOP_CLEAN_ALL_1 MOVLW CMD_AWROFF MOVWF CMD_BUFFER CALL CMD GOTO LOOP_MAIN DRAW_WAVE ;23 draw a wave MOVLW 0xC1 ; Initial the address 0 MOVWF ADDR_L MOVLW 0x03 MOVWF ADDR_H MOVLW 0x00 ; Initial the counter 0 MOVWF COUNTER_INDEX MOVLW 0x07 ; Initial the bit index MOVWF BIT_INDEX ; draw a horizontal line LOOP_WRITE_DATA_1 MOVF ADDR_L,0 ; get address MOVWF DATA_BUFFER MOVF ADDR_H,0 ; get address MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_ADPSET ; set ADP MOVWF CMD_BUFFER CALL CMD MOVF BIT_INDEX,0 ; get bit index ADDLW 0xF8 MOVWF CMD_BUFFER CALL CMD ; send a set bit command MOVF BIT_INDEX, 0 SUBLW 0x00 BTFSS STATUS, Z GOTO LOOP_SET_BIT_INDEX_1 MOVLW 0x08 ; Initial the bit index MOVWF BIT_INDEX MOVF ADDR_L, 0 ADDLW 1 MOVWF ADDR_L BTFSS STATUS, C GOTO LOOP_SET_BIT_INDEX_1 INCF ADDR_H,1 LOOP_SET_BIT_INDEX_1 DECF BIT_INDEX,1 INCF COUNTER_INDEX,1 MOVF COUNTER_INDEX, 0 SUBLW 0x08 BTFSS STATUS, Z GOTO LOOP_WRITE_DATA_1 MOVF ADDR_L, 0 ADDLW 0xEC MOVWF ADDR_L BTFSC STATUS, C GOTO LOOP_ADD_ADDR_1 DECF ADDR_H,1 LOOP_ADD_ADDR_1 ; draw a sloped line 1 MOVLW 0x00 ; Initial the counter 0 MOVWF COUNTER_INDEX MOVLW 0x07 ; Initial the bit index MOVWF BIT_INDEX LOOP_WRITE_DATA_2 MOVF ADDR_L,0 ; get address MOVWF DATA_BUFFER MOVF ADDR_H,0 ; get address MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_ADPSET ; set ADP MOVWF CMD_BUFFER CALL CMD MOVF BIT_INDEX,0 ; get bit index ADDLW 0xF8 MOVWF CMD_BUFFER CALL CMD ; send a set bit command MOVF BIT_INDEX, 0 SUBLW 0x00 BTFSS STATUS, Z GOTO LOOP_SET_BIT_INDEX_2 MOVLW 0x08 ; Initial the bit index MOVWF BIT_INDEX MOVF ADDR_L, 0 ADDLW 1 MOVWF ADDR_L BTFSS STATUS, C GOTO LOOP_SET_BIT_INDEX_2 INCF ADDR_H,1 LOOP_SET_BIT_INDEX_2 DECF BIT_INDEX,1 INCF COUNTER_INDEX,1 MOVF COUNTER_INDEX, 0 SUBLW 0x20 BTFSC STATUS, Z GOTO LOOP_WRITE_DATA_END_2 MOVF ADDR_L, 0 ADDLW 0xEC MOVWF ADDR_L BTFSC STATUS, C GOTO LOOP_ADD_ADDR_2 DECF ADDR_H,1 LOOP_ADD_ADDR_2 GOTO LOOP_WRITE_DATA_2 LOOP_WRITE_DATA_END_2 ; draw a sloped line 2 MOVLW 0x00 ; Initial the counter 0 MOVWF COUNTER_INDEX MOVLW 0x07 ; Initial the bit index MOVWF BIT_INDEX LOOP_WRITE_DATA_3 MOVF ADDR_L,0 ; get address MOVWF DATA_BUFFER MOVF ADDR_H,0 ; get address MOVWF DATA_BUFFER2 CALL DT2 MOVLW CMD_ADPSET ; set ADP MOVWF CMD_BUFFER CALL CMD MOVF BIT_INDEX,0 ; get bit index ADDLW 0xF8 MOVWF CMD_BUFFER CALL CMD ; send a set bit command MOVF BIT_INDEX, 0 SUBLW 0x00 BTFSS STATUS, Z GOTO LOOP_SET_BIT_INDEX_3 MOVLW 0x08 ; Initial the bit index MOVWF BIT_INDEX MOVF ADDR_L, 0 ADDLW 1 MOVWF ADDR_L BTFSS STATUS, C GOTO LOOP_SET_BIT_INDEX_3 INCF ADDR_H,1 LOOP_SET_BIT_INDEX_3 DECF BIT_INDEX,1 INCF COUNTER_INDEX,1 MOVF COUNTER_INDEX, 0 SUBLW 0x20 BTFSC STATUS, Z GOTO LOOP_WRITE_DATA_END_3 MOVF ADDR_L, 0 ADDLW 0x14 MOVWF ADDR_L BTFSS STATUS, C GOTO LOOP_ADD_ADDR_3 INCF ADDR_H,1 LOOP_ADD_ADDR_3 GOTO LOOP_WRITE_DATA_3 LOOP_WRITE_DATA_END_3 RETURN CMD CALL SEND_CMD RETURN DT1 CALL SEND_DATA ;from DATA_BUFFER RETURN DT2 CALL SEND_DATA MOVF DATA_BUFFER2, 0 MOVWF DATA_BUFFER CALL SEND_DATA RETURN ADT CALL SEND_DATA ;from DATA_BUFFER RETURN SET_PORT_B_INPUT CLRF PORTB BSF STATUS, RP0 ;BANK 1 MOVLW 0xFF ;SET PORT B AS INPUT MOVWF TRISB BCF STATUS, RP0 ;BANK 0 RETURN SET_PORT_B_OUTPUT CLRF PORTB BSF STATUS, RP0 ;BANK 1 MOVLW 0x00 ;SET PORT B AS OUTPUT MOVWF TRISB BCF STATUS, RP0 ;BANK 0 RETURN READ_DATA CALL SET_PORT_B_INPUT MOVLW 0x04 ; 0100 read data ready MOVWF PORTA MOVF PORTB,0 ; GET PORTB DATA MOVWF DATA_BUFFER RETURN SEND_DATA CALL SET_PORT_B_OUTPUT MOVF DATA_BUFFER, 0 ;output data MOVWF PORTB MOVLW 0x0A ; 1010 write data ready MOVWF PORTA BSF PORTA, 2 RETURN SEND_CMD CALL SET_PORT_B_OUTPUT MOVF CMD_BUFFER, 0 ;output cmd MOVWF PORTB MOVLW 0x0B ; 1011 write cmd ready MOVWF PORTA BSF PORTA, 2 RETURN END