資深會員
Joined
: 2007/4/20 23:02 最後登入時間
: 2017/5/18 11:04
From Taipei.
Group:
註冊會員
Level : 15 HP : 0 / 353 MP : 87 / 18043 EXP : 14
|
我用W201裡面的(LAB_ANS\lcd.asm)設定檔 主程式也是用用W201範例裡的(LAB_ANS\lab2.asm) (W201 is FOR APP001) 然後依照APP025的設定 更改如下 MCU PIC16F877-20/P ICD2
但 燒錄後 LCD只出現第一排的方塊 只有方塊 = =
請問LCD 定義檔設定錯在哪 ?
;************************************************ ;* LCD.ASM * ;************************************************ ;* Contains subroutines to control an external * ;* lcd panel in 4-bit mode. These routines * ;* were designed specifically for the panel on * ;* the MCU201 workshop demo board, but should * ;* work with other LCDs with a HD44780 type * ;* controller. * ;* Routines include: * ;* - InitLCD to initialize the LCD panel * ;* - putcLCD to write a character to LCD * ;* - SendCmd to write a command to LCD * ;* - clrLCD to clear the LCD display * ;* - L1homeLCD to return cursor to line 1 home* ;* - L2homeLCD to return cursor to line 2 home* ;* - PutHexLCD to write a HEX Code to LCD * ;* - Hex2ASCII to convert 4 bits to ASCII Code* ;************************************************ ; list p=16f877 #include <p16f877.inc> ; ; Defines for I/O ports that provide LCD data & control ; PORTB.0 - PORTB.3 are Data Pins for LCD Module => PORTE,2 --> [E] : LCD operation start signal control ; PORTB.4 is E Control Signal for LCD => PORTE,0 --> [RS]: ; PORTB.5 is RS Control Signal for LCD => PORTE,1 --> [RW]: ; PORTC.2 is BackLight Control pin for LCD Module ; global InitLCD global putcLCD global clrLCD global L1homeLCD global L2homeLCD global SendCmd global PutHexLCD global Hex2ASCII ; LCD_DATA equ PORTD LCD_CNTL equ PORTD
; Defines for I/O pins that provide LCD control #define RS PORTE,0 #define RW PORTE,1 #define E PORTE,2
; LCD Module commands DISP_ON EQU 0x00C ; Display on DISP_ON_C EQU 0x00E ; Display on, Cursor on DISP_ON_B EQU 0x00F ; Display on, Cursor on, Blink cursor DISP_OFF EQU 0x008 ; Display off CLR_DISP EQU 0x001 ; Clear the Display ENTRY_INC EQU 0x006 ; ENTRY_INC_S EQU 0x007 ; ENTRY_DEC EQU 0x004 ; ENTRY_DEC_S EQU 0x005 ; DD_RAM_ADDR EQU 0x080 ; Least Significant 7-bit are for address DD_RAM_UL EQU 0x080 ; Upper Left coner of the Display ;
; Directs linker to provide 4 variables in GPR memory UDATA Byte RES 1 Byte1 RES 1 Count RES 1 Count1 RES 1 W_BUFR RES 1 Hex_Bfr RES 1 ; PROG1 CODE ;******************************************************************* ;* The LCD Module Subroutines * ;* Command sequence for 2 lines of 5x16 characters * ;******************************************************************* InitLCD BANKSEL TRISD bcf TRISE,2 clrf TRISE
movlw 0x0F ; Initialize inputs/outputs for LCD movwf TRISD BANKSEL LCD_DATA CLRF PORTE clrf LCD_DATA ; Clear LCD data & control bits ; movlw .50 ; Power=On delay 50mS Call Delay_MS ; movlw 0x02 ; Init for 4-bit interface call Send_4bit movlw .10 ; Delay 10 mS Call Delay_MS ; movlw b'00000011' ; Fully Initial LCD module call Send_4bit ; Sent '0011' data 4 time movlw .5 ; Delay 5mS Call Delay_MS movlw b'00000011' call Send_4bit call Delay_1MS ; Delay 1mS movlw b'00000011' call Send_4bit movlw b'00000010' call Send_4bit ; movlw b'00101000' ; Set 2 lines & 5 x 7 dots call SendCmd movlw DISP_ON ; Turn display on (0x0C) call SendCmd movlw ENTRY_INC ; Configure cursor movement call SendCmd movlw DD_RAM_ADDR ; Set writes for display memory call SendCmd return ; ;******************************************************************* ;*SendChar - Sends character to LCD * ;*This routine splits the character into the upper and lower * ;*nibbles and sends them to the LCD, upper nibble first. * ;******************************************************************* putcLCD banksel Byte movwf Byte ; Save WREG in Byte variable call Delay_1MS swapf Byte,W ; Write upper nibble first andlw 0x0f movwf LCD_DATA bsf RS ; Set for data bsf E ; Clock nibble into LCD bcf E movf Byte,W ; Write lower nibble last andlw 0x0f movwf LCD_DATA bsf RS ; Set for data bsf E ; Clock nibble into LCD bcf E return ; ;********************************************************************* ;* To put the HEX value to LCD Display ,, ;* High nibble first than Low nibble ;* Input : W Reg. ;********************************************************************* PutHexLCD banksel W_BUFR movwf W_BUFR ; Save W Register !! swapf W_BUFR,W ; High nibble first !! call Hex2ASCII call putcLCD ; movf W_BUFR,W call Hex2ASCII call putcLCD return ; ;****************************************************************** ;* Convert a low nibble to ASCII code ;* Input : W Reg. ;* Output: W Reg. ;****************************************************************** Hex2ASCII andlw 0x0f ; Mask Bit 4 to 7 movwf Hex_Bfr sublw .09 btfsc STATUS,C ; If W less than A (C=1) --> only add 30h goto Add_W_30 Add_W_37 movlw 0x37 goto Hex_cont Add_W_30 movlw 0x30 Hex_cont addwf Hex_Bfr,W ; The correct ASCII code for this char !! return ; ;******************************************************************* ;* SendCmd - Sends command to LCD * ;* This routine splits the command into the upper and lower * ;* nibbles and sends them to the LCD, upper nibble first. * ;******************************************************************* SendCmd banksel Byte movwf Byte ; Save WREG in Byte variable call Delay_1MS swapf Byte,W ; Send upper nibble first andlw 0x0f movwf LCD_DATA bcf RS ; Clear for command bsf E ; Clock nibble into LCD bcf E movf Byte,W ; Write lower nibble last Send_4bit andlw 0x0f movwf LCD_DATA bcf RS ; Clear for command bsf E ; Clock nibble into LCD bcf E return ; ;******************************************************************* ;* clrLCD - Clear the contents of the LCD * ;******************************************************************* clrLCD movlw CLR_DISP ; Send the command to clear display call SendCmd return ; ;******************************************************************* ;* L1homeLCD - Moves the cursor to home position on Line 1 * ;******************************************************************* L1homeLCD movlw DD_RAM_ADDR|0x00 ; Send command to move cursor to call SendCmd ; home position on line 1 return
;******************************************************************* ;* L2homeLCD - Moves the cursor to home position on Line 2 * ;******************************************************************* L2homeLCD movlw DD_RAM_ADDR|0x28 ; Send command to move cursor to call SendCmd ; home position on line 2 return
;******************************************************************* ;* Delay - Generic LCD delay (1.024mS @ 4MHz) * ;* Since the microcontroller can not read the busy flag of the * ;* LCD, a specific delay needs to be executed between writes to * ;* the LCD. * ;******************************************************************* Delay_1MS ; 2 cycles for call clrf Count ; 1 cycle to clear counter variable Dloop nop decfsz Count,F ; These two instructions provide a goto Dloop ; (256 * 3) -1 cycle count return ; 2 cycles for return ; ;******************************************************************* ;* Delay - 1mS base delay * ;* input : W Reg. * ;* * ;******************************************************************* Delay_MS movwf Count1 ; DLop1 call Delay_1MS decfsz Count1,F goto DLop1 return ; END
發表於: 2007/12/11 12:26
|