《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > PIC16Fxxx的LCD驅動程序

PIC16Fxxx的LCD驅動程序

2009-01-16
關鍵詞: 驅動程序 單片機

PIC16Fxxx的LCD驅動程序(適用于HD44780兼容的驅動器)

;************************************************
;* 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
  #i nclude <p16f877.inc>
;
; Defines for I/O ports that provide LCD data & control
; PORTB.0 - PORTB.3 are Data Pins for LCD Module
; PORTB.4 is E Control Signal for LCD
; PORTB.5 is RS Control Signal for LCD
; 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 PORTB
LCD_CNTL equ PORTB

; Defines for I/O pins that provide LCD control
RS  equ 5
E  equ 4

; 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 TRISB
  movlw 0xc0  ; Initialize inputs/outputs for LCD
  movwf TRISB
  BANKSEL LCD_DATA
  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 LCD_CNTL, RS ; Set for data
  bsf LCD_CNTL, E ; Clock nibble into LCD
  bcf LCD_CNTL, E
  movf Byte,W  ; Write lower nibble last
  andlw 0x0f
  movwf LCD_DATA
  bsf LCD_CNTL, RS ; Set for data
  bsf LCD_CNTL, E ; Clock nibble into LCD
  bcf LCD_CNTL, 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 LCD_CNTL,RS ; Clear for command
  bsf LCD_CNTL,E ; Clock nibble into LCD
  bcf LCD_CNTL,E
  movf Byte,W  ; Write lower nibble last
Send_4bit andlw 0x0f
  movwf LCD_DATA
  bcf LCD_CNTL,RS ; Clear for command
  bsf LCD_CNTL,E ; Clock nibble into LCD
  bcf LCD_CNTL,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

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
久久精品一区二区三区不卡牛牛 | 欧美一级欧美一级在线播放| 亚洲日本中文字幕| 狠狠色丁香久久婷婷综合丁香| 国产精品一二| 国产九色精品成人porny| 国产精品日韩一区二区| 国产精品国产三级国产普通话99| 欧美日韩视频在线一区二区| 欧美理论在线播放| 欧美日韩不卡视频| 欧美国产日韩免费| 欧美激情一区二区三区| 欧美黑人国产人伦爽爽爽| 欧美福利影院| 欧美巨乳在线| 国产精品成人午夜| 国产精品美女久久久久久免费| 国产精品成人va在线观看| 国产精品免费电影| 国产精品自拍在线| 国产日韩综合一区二区性色av| 国产欧美日韩视频在线观看| 国产日韩一区二区三区在线| 国产亚洲欧美日韩在线一区| 黄色成人免费观看| 亚洲高清在线观看一区| 亚洲精品精选| 中文精品视频| 性做久久久久久久久| 久久精品免视看| 亚洲精品日韩综合观看成人91 | 亚洲精选大片| 亚洲天堂av图片| 欧美一区二区三区在线免费观看| 久久黄金**| 美女视频黄 久久| 欧美久久视频| 国产女同一区二区| 亚洲第一页自拍| 一二三区精品| 午夜久久久久久久久久一区二区| 久久精品视频亚洲| 99视频+国产日韩欧美| 亚洲欧美国内爽妇网| 久久久久久一区二区| 欧美激情视频给我| 国产精品日韩在线播放| 在线观看精品一区| 宅男精品视频| 久久精品99国产精品| 99国产精品久久久久久久成人热 | 美女黄毛**国产精品啪啪| 欧美激情国产日韩精品一区18| 欧美亚洲第一区| 国内精品模特av私拍在线观看| 亚洲国产精品va在线看黑人| 亚洲小视频在线| 久久精品国产综合精品| 一区电影在线观看| 久久成人免费视频| 欧美黄色aa电影| 国产精品亚洲欧美| 亚洲人体影院| 欧美在线播放| 亚洲私人黄色宅男| 久久夜色精品国产噜噜av| 欧美日韩国产三区| 国产午夜精品久久| 日韩视频在线观看免费| 欧美一区二区视频97| 宅男精品导航| 巨乳诱惑日韩免费av| 国产精品美女久久久免费| 在线观看日韩国产| 亚洲欧美日韩在线| 一本一本久久| 久久综合网色—综合色88| 国产精品国产三级国产aⅴ入口| 在线国产精品一区| 性欧美videos另类喷潮| 一区二区欧美在线| 欧美sm重口味系列视频在线观看| 国产精品午夜国产小视频| 亚洲日韩欧美视频一区| 亚洲国产精品成人一区二区| 欧美一区二区在线观看| 欧美天天影院| 亚洲黄色在线| 亚洲国产精品欧美一二99| 小处雏高清一区二区三区| 欧美日韩高清在线| 在线免费观看成人网| 久久不射中文字幕| 欧美一区二区三区四区高清| 欧美系列一区| 亚洲日本aⅴ片在线观看香蕉| 亚洲第一在线综合网站| 欧美影院久久久| 欧美性一区二区| 日韩系列欧美系列| 日韩一区二区福利| 欧美国产日韩在线| 亚洲第一精品影视| 亚洲国产精品小视频| 久久久久久精| 国产一区二区三区成人欧美日韩在线观看 | 国产精品国产三级国产aⅴ浪潮 | 亚洲综合99| 亚洲在线网站| 国产精品xxxxx| 一区二区三区福利| 亚洲一区亚洲| 国产精品成人在线| 一区二区三区高清视频在线观看 | 性欧美大战久久久久久久免费观看| 欧美日韩一区二区三区免费| 亚洲精品在线一区二区| 日韩午夜在线视频| 欧美黄在线观看| 亚洲精品综合在线| 亚洲天堂av电影| 国产精品成人一区二区网站软件| 99综合视频| 亚洲欧美亚洲| 国产欧美另类| 欧美一区二区三区免费在线看 | 欧美性猛交xxxx免费看久久久| 99国内精品久久| 亚洲视频在线观看视频| 欧美亚一区二区| 亚洲主播在线| 久久精品综合一区| 一区二区视频欧美| 亚洲精品在线看| 欧美日本国产一区| 中日韩午夜理伦电影免费| 午夜精品www| 国产一区二区在线观看免费播放 | 亚洲女人天堂成人av在线| 99riav久久精品riav| 亚洲欧美日韩在线高清直播| 国产精品亚洲人在线观看| 欧美一区亚洲| 欧美成人激情视频免费观看| 亚洲七七久久综合桃花剧情介绍| 一区二区三区不卡视频在线观看| 欧美视频在线不卡| 欧美一区二视频| 女女同性女同一区二区三区91| 亚洲日本视频| 翔田千里一区二区| 黄色欧美日韩| 99热免费精品在线观看| 国产精品国色综合久久| 欧美一区三区二区在线观看| 欧美大片va欧美在线播放| 一本色道88久久加勒比精品| 欧美一区二区在线观看| 精品99一区二区| 国产精品99久久久久久人| 国产伦精品一区二区三区免费迷| 亚洲国产成人在线| 欧美日韩精品综合| 午夜亚洲伦理| 欧美激情一区二区三区不卡| 亚洲自啪免费| 欧美国产日韩在线| 亚洲欧美一区二区原创| 欧美成人综合网站| 亚洲一区二区三区免费视频| 老司机aⅴ在线精品导航| 亚洲精选视频在线| 久久九九热免费视频| 日韩视频在线免费观看| 久久久久久一区二区| 日韩午夜激情av| 久久久免费精品视频| 在线中文字幕一区| 模特精品裸拍一区| 亚洲综合欧美| 欧美激情视频在线播放| 午夜在线电影亚洲一区| 欧美日韩精品福利| 久久精品久久综合| 国产精品日韩久久久久| 亚洲精品久久久久久久久| 国产欧美一区二区三区久久人妖 | 一本色道久久综合亚洲精品不 | 欧美中文字幕视频| 国产精品sss| 亚洲免费大片| 国内精品视频在线观看| 亚洲一区二区不卡免费| 在线观看日韩专区| 久久久精品午夜少妇| 亚洲午夜精品久久| 欧美精品 国产精品| 久久国产精品72免费观看| 国产精品视频久久久|