;************************************************************************ ;* ;Utført av: Kenneth Romsdal & Arnfinn Berg ;* Høgskolen i Narvik. 2003 * ;* Assembler version: 2.0000 * ;* Filename: * ;* eksLCD.asm (main routine) * ;*Oppg1 Lese fra potmeteret og skrive til LED og LCD ;Programmet avleser potmeteret og viser resultstet både vha. ;lysdiodene og LCD. Verdien vises binært vha diodene og ;desimalt i LCD ;* Dependents: * ;* p18lcd.asm * ;* 16f877.lkr * ;************************************************************************ list p=18f452 #include p18f452.inc ;Program Configuration Registers ; __CONFIG _CONFIG1H, _OSCS_OFF_1H & _EC_OSC_1H __CONFIG _CONFIG2L, _BOR_OFF_2L & _PWRT_ON_2L __CONFIG _CONFIG2H, _WDT_OFF_2H ; __CONFIG _CONFIG3H, _CCP2MX_OFF_3H __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_ON_4L __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L ; __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L ; __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L ; __CONFIG _CONFIG7H, _EBTRB_OFF_7H EXTERN LCDInit, temp_wr, d_write, i_write, LCDLine_1, LCDLine_2 variables UDATA ptr_pos RES 1 ptr_count RES 1 MsD RES 1 MSD RES 1 LSD RES 1 STARTUP CODE NOP goto start NOP NOP NOP PROG1 CODE stan_table data "Leser Potmetret " ; peker=0 movlw 0 ; Send 1. linje i stan_table til LCD movwf ptr_pos ; Sett peker til å peke inn i stan_table call stan_char_1 ; Posisjonerer til 1. linjei LCD,; skriver 1. linje i stan_table, ”Leser potmetret” skrives til første linje. movlw .16 ; Legger 16 i WREG movwf ptr_pos ; Sett peker til å peke inn i stan_table call stan_char_2 ; Posisjonerer til 2. linje i LCD,skriver 2. linje i stan_table start ; Initialisering av LCD: call LCDInit clrf PORTB clrf TRISB ;Register er valgt til utport ; Initialisering og "start" av AD-konvertering: bsf TRISA,0 ;PotMeter movlw b'01000001' ;Bit 7-6=Fosc/8,Bit 5-3=Velger kanal til pot, Bit 0 =ADON movwf ADCON0 movlw b'00001110' ;Venstrejustert, 1 analog channel movwf ADCON1 LesPot bsf ADCON0,GO ;Starter A/D-konvertering FERDIG_AD btfss ADCON0, DONE goto FERDIG_AD swapf ADRESH,W ;flytter resultatet til W reg, samtidig bytter plass på de 4 MSB og LSB andlw 0x0f ;utfører en logisk OG operasjon, for å få 0000 på MSB i W movwf PORTB ;innhold i W sendes til PORB (lysdioder) call bin_bcd movlw d'0' movwf ptr_pos call stan_char_1 call LCDLine_2 movlw a'V' ;send high digit movwf temp_wr call d_write movlw a'e' ;send high digit movwf temp_wr call d_write movlw a'r' ;send high digit movwf temp_wr call d_write movlw a'd' ;send high digit movwf temp_wr call d_write movlw a'i' ;send high digit movwf temp_wr call d_write movlw a' ' ;send high digit movwf temp_wr call d_write movlw a'=' ;send high digit movwf temp_wr call d_write movlw a' ' ;send high digit movwf temp_wr call d_write movf MSD,W ;send high digit movwf temp_wr call d_write movf MsD,W ;send middle digit movwf temp_wr call d_write movf LSD,W ;send low digit movwf temp_wr call d_write goto LesPot ; Les ADC-verdi, skriv verdi til LCD og LED, gå i evig løkke! ; *** FERDIGE RUTINER *** ;----Standard code, Place characters on line-1-------------------------- stan_char_1 call LCDLine_1 ;mvoe cursor to line 1 movlw .16 ;1-full line of LCD movwf ptr_count movlw UPPER stan_table movwf TBLPTRU movlw HIGH stan_table movwf TBLPTRH movlw LOW stan_table movwf TBLPTRL movf ptr_pos,W addwf TBLPTRL,F clrf WREG addwfc TBLPTRH,F addwfc TBLPTRU,F stan_next_char_1 tblrd *+ movff TABLAT,temp_wr call d_write ;send character to LCD decfsz ptr_count,F ;move pointer to next char bra stan_next_char_1 return ;----Standard code, Place characters on line-2-------------------------- stan_char_2 call LCDLine_2 ;move cursor to line 2 movlw .16 ;1-full line of LCD movwf ptr_count movlw UPPER stan_table movwf TBLPTRU movlw HIGH stan_table movwf TBLPTRH movlw LOW stan_table movwf TBLPTRL movf ptr_pos,W addwf TBLPTRL,F clrf WREG addwfc TBLPTRH,F addwfc TBLPTRU,F stan_next_char_2 tblrd *+ movff TABLAT,temp_wr call d_write ;send character to LCD decfsz ptr_count,F ;move pointer to next char bra stan_next_char_2 return ;---------------- Binary (8-bit) to BCD ----------------------- ; 255 = highest possible result bin_bcd clrf MSD clrf MsD movwf LSD ;move value to LSD ghundreth movlw .100 ;subtract 100 from LSD subwf LSD,W btfss STATUS,C ;is value greater then 100 bra gtenth ;NO goto tenths movwf LSD ;YES, move subtraction result into LSD incf MSD,F ;increment hundreths bra ghundreth gtenth movlw .10 ;take care of tenths subwf LSD,W btfss STATUS,C bra over ;finished conversion movwf LSD incf MsD,F ;increment tenths position bra gtenth over ;0 - 9, high nibble = 3 for LCD movf MSD,W ;get BCD values ready for LCD display xorlw 0x30 ;convert to LCD digit movwf MSD movf MsD,W xorlw 0x30 ;convert to LCD digit movwf MsD movf LSD,W xorlw 0x30 ;convert to LCD digit movwf LSD retlw 0 end