pic18f4550-examples/c/lcd/main.asm

738 lines
14 KiB
NASM

;--------------------------------------------------------
; File Created by SDCC : free open source ISO C Compiler
; Version 4.5.0 #15242 (Linux)
;--------------------------------------------------------
; PIC16 port for the Microchip 16-bit core micros
;--------------------------------------------------------
list p=18f4550
radix dec
CONFIG XINST=OFF
CONFIG FOSC=HS
CONFIG WDT=OFF
CONFIG LVP=OFF
CONFIG MCLRE=OFF
;--------------------------------------------------------
; public variables in this module
;--------------------------------------------------------
global _LCD_Initialize
global _LCDWriteNibble
global _LCDPutChar
global _LCDPutCmd
global _LCDPutStr
global _LCDGoto
global _sram_end
global _main
;--------------------------------------------------------
; extern variables in this module
;--------------------------------------------------------
extern __gptrload
extern __gptrget1
extern _stdin
extern _stdout
extern _SPPCFGbits
extern _SPPEPSbits
extern _SPPCONbits
extern _UFRMLbits
extern _UFRMHbits
extern _UIRbits
extern _UIEbits
extern _UEIRbits
extern _UEIEbits
extern _USTATbits
extern _UCONbits
extern _UADDRbits
extern _UCFGbits
extern _UEP0bits
extern _UEP1bits
extern _UEP2bits
extern _UEP3bits
extern _UEP4bits
extern _UEP5bits
extern _UEP6bits
extern _UEP7bits
extern _UEP8bits
extern _UEP9bits
extern _UEP10bits
extern _UEP11bits
extern _UEP12bits
extern _UEP13bits
extern _UEP14bits
extern _UEP15bits
extern _PORTAbits
extern _PORTBbits
extern _PORTCbits
extern _PORTDbits
extern _PORTEbits
extern _LATAbits
extern _LATBbits
extern _LATCbits
extern _LATDbits
extern _LATEbits
extern _DDRAbits
extern _TRISAbits
extern _DDRBbits
extern _TRISBbits
extern _DDRCbits
extern _TRISCbits
extern _DDRDbits
extern _TRISDbits
extern _DDREbits
extern _TRISEbits
extern _OSCTUNEbits
extern _PIE1bits
extern _PIR1bits
extern _IPR1bits
extern _PIE2bits
extern _PIR2bits
extern _IPR2bits
extern _EECON1bits
extern _RCSTAbits
extern _TXSTAbits
extern _T3CONbits
extern _CMCONbits
extern _CVRCONbits
extern _CCP1ASbits
extern _ECCP1ASbits
extern _CCP1DELbits
extern _ECCP1DELbits
extern _BAUDCONbits
extern _BAUDCTLbits
extern _CCP2CONbits
extern _CCP1CONbits
extern _ECCP1CONbits
extern _ADCON2bits
extern _ADCON1bits
extern _ADCON0bits
extern _SSPCON2bits
extern _SSPCON1bits
extern _SSPSTATbits
extern _T2CONbits
extern _T1CONbits
extern _RCONbits
extern _WDTCONbits
extern _HLVDCONbits
extern _LVDCONbits
extern _OSCCONbits
extern _T0CONbits
extern _STATUSbits
extern _INTCON3bits
extern _INTCON2bits
extern _INTCONbits
extern _STKPTRbits
extern _SPPDATA
extern _SPPCFG
extern _SPPEPS
extern _SPPCON
extern _UFRM
extern _UFRML
extern _UFRMH
extern _UIR
extern _UIE
extern _UEIR
extern _UEIE
extern _USTAT
extern _UCON
extern _UADDR
extern _UCFG
extern _UEP0
extern _UEP1
extern _UEP2
extern _UEP3
extern _UEP4
extern _UEP5
extern _UEP6
extern _UEP7
extern _UEP8
extern _UEP9
extern _UEP10
extern _UEP11
extern _UEP12
extern _UEP13
extern _UEP14
extern _UEP15
extern _PORTA
extern _PORTB
extern _PORTC
extern _PORTD
extern _PORTE
extern _LATA
extern _LATB
extern _LATC
extern _LATD
extern _LATE
extern _DDRA
extern _TRISA
extern _DDRB
extern _TRISB
extern _DDRC
extern _TRISC
extern _DDRD
extern _TRISD
extern _DDRE
extern _TRISE
extern _OSCTUNE
extern _PIE1
extern _PIR1
extern _IPR1
extern _PIE2
extern _PIR2
extern _IPR2
extern _EECON1
extern _EECON2
extern _EEDATA
extern _EEADR
extern _RCSTA
extern _TXSTA
extern _TXREG
extern _RCREG
extern _SPBRG
extern _SPBRGH
extern _T3CON
extern _TMR3
extern _TMR3L
extern _TMR3H
extern _CMCON
extern _CVRCON
extern _CCP1AS
extern _ECCP1AS
extern _CCP1DEL
extern _ECCP1DEL
extern _BAUDCON
extern _BAUDCTL
extern _CCP2CON
extern _CCPR2
extern _CCPR2L
extern _CCPR2H
extern _CCP1CON
extern _ECCP1CON
extern _CCPR1
extern _CCPR1L
extern _CCPR1H
extern _ADCON2
extern _ADCON1
extern _ADCON0
extern _ADRES
extern _ADRESL
extern _ADRESH
extern _SSPCON2
extern _SSPCON1
extern _SSPSTAT
extern _SSPADD
extern _SSPBUF
extern _T2CON
extern _PR2
extern _TMR2
extern _T1CON
extern _TMR1
extern _TMR1L
extern _TMR1H
extern _RCON
extern _WDTCON
extern _HLVDCON
extern _LVDCON
extern _OSCCON
extern _T0CON
extern _TMR0
extern _TMR0L
extern _TMR0H
extern _STATUS
extern _FSR2L
extern _FSR2H
extern _PLUSW2
extern _PREINC2
extern _POSTDEC2
extern _POSTINC2
extern _INDF2
extern _BSR
extern _FSR1L
extern _FSR1H
extern _PLUSW1
extern _PREINC1
extern _POSTDEC1
extern _POSTINC1
extern _INDF1
extern _WREG
extern _FSR0L
extern _FSR0H
extern _PLUSW0
extern _PREINC0
extern _POSTDEC0
extern _POSTINC0
extern _INDF0
extern _INTCON3
extern _INTCON2
extern _INTCON
extern _PROD
extern _PRODL
extern _PRODH
extern _TABLAT
extern _TBLPTR
extern _TBLPTRL
extern _TBLPTRH
extern _TBLPTRU
extern _PC
extern _PCL
extern _PCLATH
extern _PCLATU
extern _STKPTR
extern _TOS
extern _TOSL
extern _TOSH
extern _TOSU
extern _delay1ktcy
;--------------------------------------------------------
; Equates to used internal registers
;--------------------------------------------------------
STATUS equ 0xfd8
PCLATH equ 0xffa
WREG equ 0xfe8
TBLPTRL equ 0xff6
TBLPTRH equ 0xff7
FSR1L equ 0xfe1
FSR2L equ 0xfd9
POSTINC1 equ 0xfe6
POSTDEC1 equ 0xfe5
PREINC1 equ 0xfe4
PLUSW2 equ 0xfdb
PRODH equ 0xff4
; Internal registers
.registers udata_ovr 0x0000
r0x00 res 1
r0x01 res 1
r0x02 res 1
r0x03 res 1
r0x04 res 1
r0x05 res 1
r0x06 res 1
ustat_main_00 udata 0X07FF
_sram_end res 0
;--------------------------------------------------------
; interrupt vector
;--------------------------------------------------------
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
; I code from now on!
; ; Starting pCode block
S_main__main code
_main:
; .line 72; main.c OSCCON=0x72; // Select internal oscillator with frequency = 8MHz
MOVLW 0x72
MOVWF _OSCCON
; .line 73; main.c LCD_Initialize();
CALL _LCD_Initialize
; .line 74; main.c LCDPutStr(" Hello World!"); //Display String "Hello World"
MOVLW UPPER(___str_0)
MOVWF r0x02
MOVLW HIGH(___str_0)
MOVWF r0x01
MOVLW LOW(___str_0)
MOVWF r0x00
MOVF r0x02, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
CALL _LCDPutStr
MOVLW 0x03
ADDWF FSR1L, F
; .line 75; main.c LCDGoto(8,1); //Go to column 8 of second line
MOVLW 0x01
MOVWF POSTDEC1
MOVLW 0x08
MOVWF POSTDEC1
CALL _LCDGoto
MOVF POSTINC1, F
MOVF POSTINC1, F
; .line 76; main.c LCDPutChar('1'); //Display character '1'
MOVLW 0x31
MOVWF POSTDEC1
CALL _LCDPutChar
MOVF POSTINC1, F
; .line 77; main.c DisplayClr(); // Clear the display
MOVLW 0x01
MOVWF POSTDEC1
CALL _LCDPutCmd
MOVF POSTINC1, F
; .line 79; main.c LCDPutStr(" LCD Display"); // Dispay a string "LCD Display"
MOVLW UPPER(___str_1)
MOVWF r0x02
MOVLW HIGH(___str_1)
MOVWF r0x01
MOVLW LOW(___str_1)
MOVWF r0x00
MOVF r0x02, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
CALL _LCDPutStr
MOVLW 0x03
ADDWF FSR1L, F
; .line 80; main.c LCDGoto(0,1); //Go to second line
MOVLW 0x01
MOVWF POSTDEC1
MOVLW 0x00
MOVWF POSTDEC1
CALL _LCDGoto
MOVF POSTINC1, F
MOVF POSTINC1, F
; .line 81; main.c LCDPutStr("Micro Lab"); //Display String "Micro Lab"
MOVLW UPPER(___str_2)
MOVWF r0x02
MOVLW HIGH(___str_2)
MOVWF r0x01
MOVLW LOW(___str_2)
MOVWF r0x00
MOVF r0x02, W
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
CALL _LCDPutStr
MOVLW 0x03
ADDWF FSR1L, F
_00106_DS_:
; .line 82; main.c while (1)
BRA _00106_DS_
; .line 87; main.c }
RETURN
; ; Starting pCode block
S_main__LCDGoto code
_LCDGoto:
; .line 191; main.c void LCDGoto(char pos,char ln)
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
MOVLW 0x03
MOVFF PLUSW2, r0x01
; .line 194; main.c if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1)))
MOVF r0x01, W
MOVWF r0x02
MOVF r0x02, W
ADDLW 0x80
ADDLW 0x7e
BC _00141_DS_
MOVLW 0x10
SUBWF r0x00, W
BNC _00142_DS_
_00141_DS_:
; .line 197; main.c return;
BRA _00144_DS_
_00142_DS_:
; .line 201; main.c LCDPutCmd((ln == 1) ? (0xC0 | pos) : (0x80 | pos));
MOVF r0x01, W
XORLW 0x01
BNZ _00146_DS_
MOVLW 0xc0
IORWF r0x00, W
MOVWF r0x01
BRA _00147_DS_
_00146_DS_:
MOVLW 0x80
IORWF r0x00, W
MOVWF r0x01
_00147_DS_:
MOVF r0x01, W
MOVWF POSTDEC1
CALL _LCDPutCmd
MOVF POSTINC1, F
; .line 204; main.c delay1ktcy(LCD_delay);
MOVLW 0x05
CALL _delay1ktcy
_00144_DS_:
; .line 205; main.c }
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__LCDPutStr code
_LCDPutStr:
; .line 178; main.c void LCDPutStr(const char *str)
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVFF r0x05, POSTDEC1
MOVFF r0x06, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
MOVLW 0x03
MOVFF PLUSW2, r0x01
MOVLW 0x04
MOVFF PLUSW2, r0x02
; .line 183; main.c while (str[i])
CLRF r0x03
_00133_DS_:
MOVF r0x03, W
ADDWF r0x00, W
MOVWF r0x04
CLRF WREG
ADDWFC r0x01, W
MOVWF r0x05
CLRF WREG
ADDWFC r0x02, W
MOVWF r0x06
MOVFF r0x04, TBLPTRL
MOVFF r0x05, TBLPTRH
MOVFF r0x06, PCLATH
CALL __gptrload
CALL __gptrget1
MOVWF r0x04
MOVF r0x04, W
BZ _00136_DS_
; .line 186; main.c LCDPutChar(str[i++]);
MOVF r0x03, W
ADDWF r0x00, W
MOVWF r0x04
CLRF WREG
ADDWFC r0x01, W
MOVWF r0x05
CLRF WREG
ADDWFC r0x02, W
MOVWF r0x06
INCF r0x03, F
MOVFF r0x04, TBLPTRL
MOVFF r0x05, TBLPTRH
MOVFF r0x06, PCLATH
CALL __gptrload
CALL __gptrget1
MOVWF r0x04
MOVF r0x04, W
MOVWF POSTDEC1
CALL _LCDPutChar
MOVF POSTINC1, F
BRA _00133_DS_
_00136_DS_:
; .line 189; main.c }
MOVFF PREINC1, r0x06
MOVFF PREINC1, r0x05
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__LCDPutCmd code
_LCDPutCmd:
; .line 161; main.c void LCDPutCmd(char ch)
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
; .line 163; main.c delay1ktcy(LCD_delay);
MOVLW 0x05
CALL _delay1ktcy
; .line 166; main.c LCDWriteNibble(ch,instr);
MOVLW 0x00
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
CALL _LCDWriteNibble
MOVF POSTINC1, F
MOVF POSTINC1, F
; .line 169; main.c ch = (ch << 4);
SWAPF r0x00, W
ANDLW 0xf0
MOVWF r0x01
; .line 171; main.c delay1ktcy(1);
MOVLW 0x01
CALL _delay1ktcy
; .line 174; main.c LCDWriteNibble(ch,instr);
MOVLW 0x00
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
CALL _LCDWriteNibble
MOVF POSTINC1, F
MOVF POSTINC1, F
; .line 175; main.c }
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__LCDPutChar code
_LCDPutChar:
; .line 146; main.c void LCDPutChar(char ch)
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
; .line 148; main.c delay1ktcy(LCD_delay);
MOVLW 0x05
CALL _delay1ktcy
; .line 151; main.c LCDWriteNibble(ch,data);
MOVLW 0x01
MOVWF POSTDEC1
MOVF r0x00, W
MOVWF POSTDEC1
CALL _LCDWriteNibble
MOVF POSTINC1, F
MOVF POSTINC1, F
; .line 154; main.c ch = (ch << 4);
SWAPF r0x00, W
ANDLW 0xf0
MOVWF r0x01
; .line 157; main.c LCDWriteNibble(ch,data);
MOVLW 0x01
MOVWF POSTDEC1
MOVF r0x01, W
MOVWF POSTDEC1
CALL _LCDWriteNibble
MOVF POSTINC1, F
MOVF POSTINC1, F
; .line 158; main.c }
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__LCDWriteNibble code
_LCDWriteNibble:
; .line 119; main.c void LCDWriteNibble(char ch, char rs)
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
MOVLW 0x03
MOVFF PLUSW2, r0x01
; .line 122; main.c ch = (ch >> 4);
SWAPF r0x00, W
ANDLW 0x0f
MOVWF r0x00
; .line 125; main.c ch = (ch & 0x0F);
MOVLW 0x0f
ANDWF r0x00, F
; .line 128; main.c LCD_PORT = (LCD_PORT & 0xF0);
MOVFF _PORTD, r0x02
MOVLW 0xf0
ANDWF r0x02, W
MOVWF _PORTD
; .line 131; main.c LCD_PORT = (LCD_PORT | ch);
MOVF r0x00, W
IORWF _PORTD, F
; .line 134; main.c LCD_RS = rs;
MOVF r0x01, W
ANDLW 0x01
SWAPF WREG, W
MOVWF PRODH
MOVF _PORTDbits, W
ANDLW 0xef
IORWF PRODH, W
MOVWF _PORTDbits
; .line 137; main.c LCD_RW = 0;
BCF _PORTDbits, 5
; .line 140; main.c LCD_EN = 1;
BSF _PORTDbits, 6
; .line 143; main.c LCD_EN = 0;
BCF _PORTDbits, 6
; .line 144; main.c }
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__LCD_Initialize code
_LCD_Initialize:
; .line 89; main.c void LCD_Initialize()
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
; .line 92; main.c LCD_PORT = 0;
CLRF _PORTD
; .line 94; main.c TRISD = 0x00;
CLRF _TRISD
; .line 97; main.c LCD_PWR = 1;
BSF _PORTDbits, 7
; .line 100; main.c delay1ktcy(LCD_Startup);
MOVLW 0x0f
CALL _delay1ktcy
; .line 103; main.c LCDPutCmd(0x32);
MOVLW 0x32
MOVWF POSTDEC1
CALL _LCDPutCmd
MOVF POSTINC1, F
; .line 106; main.c LCDPutCmd(FUNCTION_SET);
MOVLW 0x28
MOVWF POSTDEC1
CALL _LCDPutCmd
MOVF POSTINC1, F
; .line 109; main.c LCDPutCmd(DISPLAY_SETUP);
MOVLW 0x0c
MOVWF POSTDEC1
CALL _LCDPutCmd
MOVF POSTINC1, F
; .line 111; main.c DisplayClr();
MOVLW 0x01
MOVWF POSTDEC1
CALL _LCDPutCmd
MOVF POSTINC1, F
; .line 114; main.c LCDPutCmd(ENTRY_MODE);
MOVLW 0x06
MOVWF POSTDEC1
CALL _LCDPutCmd
MOVF POSTINC1, F
; .line 116; main.c }
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
___str_0:
DB 0x20, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64
DB 0x21, 0x00
; ; Starting pCode block
___str_1:
DB 0x20, 0x4c, 0x43, 0x44, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79
DB 0x00
; ; Starting pCode block
___str_2:
DB 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x20, 0x4c, 0x61, 0x62, 0x00
; Statistics:
; code size: 802 (0x0322) bytes ( 0.61%)
; 401 (0x0191) words
; udata size: 0 (0x0000) bytes ( 0.00%)
; access size: 7 (0x0007) bytes
end