日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
以組合語(yǔ)言寫的PIC18Fxxxx 的LCD驅(qū)動(dòng)程序
以組合語(yǔ)言寫的PIC18Fxxxx 的LCD驅(qū)動(dòng)程序
 更新時(shí)間:2009-7-22 16:39:50  點(diǎn)擊數(shù):0
【字體: 字體顏色
/script>

;************************************************
;*     18F_LCD.asm *
;* Microchip Taiwan    *
;* Date : Sept. 24 2002  *
;* Version : v1.00   *
;************************************************
;* Contains subroutines to control an external  *
;* lcd panel in 4-bit mode.  These routines     *
;* were designed specifically for the panel on  *
;* the PICdemo 2 Plus 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=18F452
   #include  <P18F452.inc>
;
   global  InitLCD
   global  putcLCD
   global  clrLCD
   global  L1homeLCD
   global  L2homeLCD
   global   Send_Cmd
   global  PutHexLCD
   global  Hex2ASCII
   global  Delay_xMS
   global  Delay_1mS 
;
; Defines for I/O ports that provide LCD data & control
; PORTD[0:3]-->DB[4:7]: Higher order 4 lines data bus with bidirectional
;  : DB7 can be used as a BUSY flag
; PORTA,1 --> [E] : LCD operation start signal control
; PORTA,2 --> [RW]: LCD Read/Write control
; PORTA,3 --> [RS]: LCD Register Select control
; : "0" for Instrunction register (Write), Busy Flag (Read)
; : "1" for data register (Read/Write)
;
  
;
LCD_CTRL equ   TRISD
LCD_DATA equ   PORTD
#define  LCD_E_DIR TRISA,1 
#define  LCD_RW_DIR TRISA,2 
#define  LCD_RS_DIR TRISA,3
#define  LCD_E  PORTA,1
#define  LCD_RW   PORTA,2
#define  LCD_RS  PORTA,3 


; LCD Module commands
CLR_DISP equ  b'00000001'  ; 1.64mS , Clear display and return cursor to home
Cursor_Home equ  b'00000010'  ; 1.64mS , Return cursor to home position

ENTRY_DEC equ  b'00000100'  ; 40uS , Decrement cursor position & No display shift
ENTRY_DEC_S equ  b'00000101'  ; 40uS , Decrement cursor position & display shift
ENTRY_INC equ  b'00000110'  ; 40uS , Increment cursor position & No display shift
ENTRY_INC_S equ  b'00000111'  ; 40uS , Increment cursor position & display shift

DISP_OFF equ  b'00001000'  ; 40uS , Display off
DISP_ON  equ  b'00001100'  ; 40uS , Display on control
DISP_ON_C equ  b'00001110'  ; 40uS , Display on, Cursor on
DISP_ON_B equ  b'00001111'  ; 40uS , Display on, Cursor on, Blink cursor

FUNC_SET equ  b'00101000'  ; 40uS , 4-bit interface , 2-lines & 5x7 dots
CG_RAM_ADDR equ  b'01000000'  ; 40uS , Least Significant 6-bit are for CGRAM address
DD_RAM_ADDR equ  b'10000000'  ; 40uS , Least Significant 7-bit are for DDRAM address
;

; Directs linker to provide 4 variables in GPR memory
   UDATA
LCD_Byte RES  1
LCD_Temp RES  1
Count_uS RES  1
Count_mS RES  1
W_BUFR  RES  1
Hex_Bfr   RES  1
;
LCD_CODE  CODE  
;*******************************************************************
;* The LCD Module Subroutines   *
;* Command sequence for 2 lines of 5x16 characters  *
;*******************************************************************
InitLCD
   bcf  LCD_E   ; Clear LCD control line to Zero
   bcf  LCD_RW
   bcf  LCD_RS
;
   bcf  LCD_E_DIR  ;configure control lines for Output pin
   bcf  LCD_RW_DIR
   bcf  LCD_RS_DIR
;
   movlw b'00001110'  ; configure AN0 as A/D inut pin
   movwf ADCON1 
   movf LCD_CTRL,W  ; get I/O directional settng
   andlw 0xF0
   movwf LCD_CTRL  ; set LCD bus  DB[4:7] for output
;
   movlw .50    ; Power-On delay 50mS
   rcall  Delay_xMS
;
   movlw   b'00000011'  ; #1 , Init for 4-bit interface
   rcall Send_Low_4bit
;
   movlw .10    ;  Delay 10 mS
   rcall  Delay_xMS
;
   movlw b'00000011'  ; #2 , Fully Initial LCD module
   rcall Send_Low_4bit ; Sent '0011' data 
   rcall  Delay_1mS
;
   movlw b'00000011'  ; #3 , Fully Initial LCD module
   rcall Send_Low_4bit ; Sent '0011' data 
   rcall  Delay_1mS
;
   movlw b'00000010'  ; #4 , Fully Initial LCD module
   rcall Send_Low_4bit ; Sent '0010' data 
   rcall  Delay_1mS
;
   movlw FUNC_SET  ; #5,#6 , Set 4-bit mode , 2 lines & 5 x 7 dots
   rcall Send_Cmd
   rcall  Delay_1mS
;
   movlw DISP_ON   ; #7,#8 , Turn display on (0x0C)
   rcall Send_Cmd
   rcall  Delay_1mS
;
   movlw CLR_DISP  ; #9,#10 , Clear LCD Screen
   rcall Send_Cmd
   movlw .5    ; Delay 5mS for Clear LCD Command execution
   rcall  Delay_xMS
;
   movlw ENTRY_INC  ; #11,#12 , Configure cursor movement
   rcall Send_Cmd
   rcall  Delay_1mS
;
   movlw DD_RAM_ADDR  ; Set writes for display memory
   rcall Send_Cmd
   rcall  Delay_1mS
;
   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
   movwf LCD_Byte  ; Save WREG in Byte variable
   rcall Send_High_LCD ; Send upper nibble first 
   movf LCD_Byte,W
   rcall Send_Low_LCD ; Send lower nibble data
   rcall Delay_100uS
   return
;   
Send_High_LCD
   swapf WREG,W    ; swap high/low nibble
Send_Low_LCD
   bcf  LCD_RW   ; set LCD Write Mode
   andlw 0x0F   ; Clear high nibble 
   movwf LCD_Temp 
   movf LCD_DATA,W  ; Read back PORT
   andlw 0xF0   ; keep data for PORTD[4:7]
   iorwf LCD_Temp,W
   movwf  LCD_DATA  ; Write data to LCD bus for low nibble bus DB[4:7]
   bsf  LCD_RS   ; Set for data input
   nop
   bsf  LCD_E   ; Clock nibble into LCD
   nop
   bcf  LCD_E
   return
;
;*********************************************************************
;* To put the HEX value to LCD Display ,,
;* High nibble first than Low nibble
;* Input : W Reg.
;*********************************************************************
PutHexLCD
   movwf W_BUFR   ; Save W Register !!
   swapf W_BUFR,W  ; High nibble first !! 
   rcall Hex2ASCII
   rcall putcLCD
;
   movf W_BUFR,W
   rcall Hex2ASCII
   rcall 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
   bra  _Add_W_30 
_Add_W_37 movlw 0x37
   bra  _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.     *
;*******************************************************************
;     _    ______________________________
; RS  _>--<______________________________
;     _____
; RW  \_____________________________
;   __________________
; E   ____________/   \___
;     _____________ ______
; DB  _____________>--------------<______
;
Send_Cmd
   movwf LCD_Byte  ; Save WREG in Byte variable
   rcall Send_High_4bit ; Send upper nibble first 
   movf LCD_Byte,W
   rcall Send_Low_4bit ; Send lower nibble data
   rcall Delay_100uS
   return
;   
Send_High_4bit
   swapf WREG,W    ; swap high/low nibble
Send_Low_4bit
   bcf  LCD_RW   ; set LCD Write Mode
   andlw 0x0F   ; Clear high nibble 
   movwf LCD_Temp 
   movf LCD_DATA,W  ; Read back PORT
   andlw 0xF0   ; keep data for PORTD[4:7]
   iorwf LCD_Temp,W
   movwf  LCD_DATA  ; Write data to LCD bus for low nibble bus DB[4:7]
   bcf  LCD_RS   ; Clear for command inut
   nop
   bsf  LCD_E   ; Clock nibble into LCD
   nop
   bcf  LCD_E
   return
;
;*******************************************************************
;* clrLCD - Clear the contents of the LCD *
;*******************************************************************
clrLCD
   movlw CLR_DISP  ; Clear LCD screen
   rcall Send_Cmd
   movlw .5    ; Delay 5mS for Clear LCD Command execution
   bra  Delay_xMS
;
;*******************************************************************
;* L1homeLCD - Moves the cursor to home position on Line 1    *
;*******************************************************************
L1homeLCD
   movlw DD_RAM_ADDR|0x00 ; Send command to move cursor to
   rcall Send_Cmd  ; home position on line 1
   bra  Delay_100uS
;
;*******************************************************************
;* L2homeLCD - Moves the cursor to home position on Line 2    *
;*******************************************************************
L2homeLCD
   movlw DD_RAM_ADDR|0x40 ; Send command to move cursor to
   rcall Send_Cmd     ; home position on line 2
   bra  Delay_100uS
;
;*******************************************************************
;*  Delay - 1mS base delay        *
;*  input : W Reg.    *
;*     *
;*******************************************************************
Delay_xMS
   movwf Count_mS
;
_D_1mS  call Delay_1mS
   decfsz Count_mS,F
   goto _D_1mS
   return
;
;*******************************************************************
;* Delay_1mS - Generic LCD delay  (1.00mS @ 4MHz)   *
;* Delay_100uS - Generic LCD delay 100us @ 4Mhz   *     *
;*******************************************************************
Delay_1mS
   movlw .248   ; Load 1mS Dealy Value
   bra  Delay_uS
;
Delay_100uS
   movlw .25    ; Load delay 100uS value
Delay_uS movwf Count_uS  ; Save to Count2
_D_uS  nop
   decfsz Count_uS,F  ; Count2 - 1 = 0 ?
   bra  _D_uS  
   return
;
   END

  • 上一篇: 用PIC16F877的c語(yǔ)言寫的一個(gè)時(shí)鬧鐘程序
  • 下一篇: 用PIC C寫PIC16C57
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1