当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]PIC16Fxxx的LCD驱动程序(适用于HD44780兼容

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[!--empirenews.page--]
;
;*********************************************************************
;*      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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭