PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 04-10-2005, 09:43 AM   #1
hamchoi
Nhập môn đệ tử
 
Tham gia ngày: Sep 2005
Bài gửi: 5
:
Chào falleaf và noisePIC, sao mình tìm hoài trong MPASM mà không thấy có files có đuôi (.h) nhỉ? Các bác có thể post nó lên để mình download nó về dùng được không?
Cảm ơn trước nhé!
hamchoi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-10-2005, 02:42 PM   #2
mafd_47a
Đệ tử 3 túi
 
Tham gia ngày: Sep 2005
Bài gửi: 54
:
Moi nguoi khi hoc F88 hay ho 16x noi chung , chu y doc qua ca quan " PICmicro™Mid-Range MCU family Reference Manual" Quan nay viet rat chi tiet va co code mau bang MPASM.

Co the down tai ( 2.7MB):
http://www.microchip.com/stellent/id...elect=&x=5&y=4
mafd_47a vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-10-2005, 04:25 PM   #3
mafd_47a
Đệ tử 3 túi
 
Tham gia ngày: Sep 2005
Bài gửi: 54
:
Khi moi lap trinh cho F88 chac co nhieu ban bo ngo ve phan "Configuration Bits", va toi cung vay. Sau day la mot so diem khac biet so voi F84

+ Cac bit Configuration duoc luu o hai dia chi bo nho 2007h( gom 14 bit) va 2008h (2 bit) va cac bit nay duoc dinh nghia trong MPASM do la
PHP Code:
_CONFIG1                    EQU     H'2007'
_CONFIG2                     EQU     H'2008'

;Configuration Byte 1 Options
_CP_ALL                      EQU     H
'1FFF'
_CP_OFF                      EQU     H'3FFF'
_CCP1_RB0                    EQU     H'3FFF'
_CCP1_RB3                    EQU     H'2FFF'
_DEBUG_OFF                   EQU     H'3FFF'
_DEBUG_ON                    EQU     H'37FF'
_WRT_PROTECT_OFF             EQU     H'3FFF'    ;No program memory write protection
_WRT_PROTECT_256             EQU     H
'3DFF'    ;First 256 program memory protected
_WRT_PROTECT_2048            EQU     H'3BFF'    ;First 2048 program memory protected
_WRT_PROTECT_ALL             EQU     H'39FF'    ;All of program memory protected
_CPD_ON                      EQU     H'3EFF'
_CPD_OFF                     EQU     H'3FFF'
_LVP_ON                      EQU     H'3FFF'
_LVP_OFF                     EQU     H'3F7F'
_BODEN_ON                    EQU     H'3FFF'
_BODEN_OFF                   EQU     H'3FBF'
_MCLR_ON                            EQU     H'3FFF'
_MCLR_OFF                    EQU     H'3FDF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_EXTRC_CLKOUT                EQU     H'3FFF'
_EXTRC_IO                    EQU     H'3FFE'
_INTRC_CLKOUT                EQU     H'3FFD'
_INTRC_IO                    EQU     H'3FFC'
_EXTCLK                      EQU     H'3FEF'
_HS_OSC                      EQU     H'3FEE'
_XT_OSC                      EQU     H'3FED'
_LP_OSC                      EQU     H'3FEC'

;Configuration Byte 2 Options
_IESO_ON                     EQU     H
'3FFF'
_IESO_OFF                    EQU     H'3FFD'
_FCMEN_ON                    EQU     H'3FFF'
_FCMEN_OFF                   EQU     H'3FFE' 
Chac co mot so ban ko hieu duoc y nghia tung Bit phai ko , cac ban co the tham khao trang 129,130,131 cua Datasheet 16f88, viet rat chi tiet

Nhu vay khac voi F84 , F88 co lenh thong thuong de dua ra _config_ trong MPASM do la

PHP Code:
    __CONFIG    _CONFIG1_CP_OFF _CCP1_RB0 _DEBUG_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _MCLR_OFF _PWRTE_ON _WDT_OFF _HS_OSC   
__CONFIG    _CONFIG2
_IESO_OFF _FCMEN_OFF 
Chia se mot chut voi anh em
mafd_47a vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-10-2005, 01:49 AM   #4
mafd_47a
Đệ tử 3 túi
 
Tham gia ngày: Sep 2005
Bài gửi: 54
:
Mot dieu dac biet o PortA ma moi nguoi can phai chu y: sau khi Reset hoac bat dau mot chuong trinh thi PortA( 5 pin RA4,RA3,RA2,RA1,RA0), va hai pin RB7,RB6 ko phai la dang I/O nua ma la analog input
va trang thai nay duoc quy dinh boi thanh ghi ANSEL (9bh) ( cac ban tham khao them o trang 51 datasheet)

Do do de ban dau thiet lap trang thai cua cac chan nay la dang I/O thi ta phai
CLRF ANSEL

Den day moi thiet lap trang thai I/O:

Do la nhung loi tuong nhu nho nhat, nhung rat de mac phai doi voi nhung newbie, Rat mong duoc su hop tac cua moi nguoi

thay đổi nội dung bởi: mafd_47a, 08-10-2005 lúc 01:54 AM.
mafd_47a vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-10-2005, 04:51 PM   #5
mafd_47a
Đệ tử 3 túi
 
Tham gia ngày: Sep 2005
Bài gửi: 54
:
Hi everybody, sau một thời gian vật lộn với con 16f88 cuối cùng mình cũng thành công với bản đầu tay, nay muốn chia sẻ cho tất cả mọi người

Đây là chương trình hiển thị LCD dung 16f88, trong chương trình có sử dụng kỹ thuật bảng , dung thạch anh 4M , dung 4 chân data ( trong đó D7=>D4 của LCD nối với Port7=>Port4 của F88) và các chân EN, RS, RW của LCD được nối với port2,1,0 của F88). Các bạn có thể tham khảo kiến thức cơ bản của LCD ở

http://www.dientuvietnam.net/board/s...1&page=1&pp=10


PHP Code:
;**********************************************************************
;                                                                     *
;    
Filename:        LCD.asm                                           *
;    
Date:          25-9-2005                                         *
;    
File Version:  V1_1                                              *
;                                                                     *
;    
Author:        MAFD_47A                                          *
;    
Company:       BACHKHOA                                          *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Files requiredConvert 8051 Assembler to PIC                    *
;                    
Chi dung Rom de hien thi ra ngoai                *
;                    
Ky thuat bang                                    *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Notes:    EN noi voi chan 2 PORTA                                     *
;              
RS noi voi chan 1 PORTA                                     *
;              
RW noi voi chan 0 PORTA                                      *
;              
Data noi tu 7,6,5,4 voi D7,D6,D5,D4 cua LCD            *
;                                                                     *
;**********************************************************************

    list      
p=16f88           ; list directive to define processor
    
#include <p16F88.inc>        ; processor specific variable definitions

    
errorlevel  -302              suppress message 302 from list file  _WRT_ENABLE_OFF

    __CONFIG    _CONFIG1
_CP_OFF _CCP1_RB0 _DEBUG_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _MCLR_OFF _PWRTE_ON _WDT_OFF _HS_OSC   
    __CONFIG    _CONFIG2
_IESO_OFF _FCMEN_OFF




;***** VARIABLE DEFINITIONS
w_temp        EQU     0x71        
variable used for context saving 
status_temp   EQU     0x72        
variable used for context saving
pclath_temp   EQU     0x73          
variable used for context saving
ACC           EQU     0x74
RO            EQU     0x78
R1            EQU     0x79
R2            EQU     0x7A
R3            EQU     0x7B
R4            EQU     0x7C
R5            EQU     0x7D
R6            EQU     0x7E
R7            EQU     0x7F
EN            EQU     H
'0002'
RS            EQU     H'0001'
RW            EQU     H'0000'
P7            EQU     H'0007'



;**********************************************************************
        
ORG     0x000             processor reset vector
        
goto    main              go to beginning of program
    

        ORG     0x004             
interrupt vector location
        movwf   w_temp            
save off current W register contents
        movf    STATUS
,w          move STATUS register into W register
        movwf    status_temp       
save off contents of STATUS register
        movf    PCLATH
,W          move PCLATH register into W register
        movwf    pclath_temp       
save off contents of PCLATH register

isr code can go here or be located as a call subroutine elsewhere


        movf    pclath_temp
,w     retrieve copy of PCLATH register
        movwf    PCLATH            
restore pre-isr PCLATH register contents
        movf    status_temp
,w     retrieve copy of STATUS register
        movwf    STATUS            
restore pre-isr STATUS register contents
        swapf   w_temp
,f
        swapf   w_temp
,w          restore pre-isr W register contents
        retfie                    
; return from interrupt

main        
        BANKSEL ANSEL
        MOVLW   0x00
        MOVWF   ANSEL
        CALL    INIT_LCD
        CALL    CLEAR_LCD
        MOVLW   0x00
        MOVWF   R1
AGAIN1   MOVF    R1
,W
        CALL    TABLE
        ADDLW   0x00
        BTFSC   STATUS
,Z
        
GOTO    NEXT
        CALL    WRITE_TEXT
        INCF    R1
,F
        
GOTO    AGAIN1
NEXT    
        MOVLW   0x02
        CALL    GOTOLINE2
        MOVLW   0x00
        MOVWF   R1
AGAIN2   MOVF    R1
,W
        CALL    THUY
        ADDLW   0x00
        BTFSC   STATUS
,Z
        
GOTO    NEXT1
        CALL    WRITE_TEXT
        INCF    R1
,F
        
GOTO    AGAIN2

NEXT1        
        
GOTO    $


TABLE   ADDWF   PCL,F
        RETLW   
'H'
        
RETLW   'E'
        
RETLW   'L'
        
RETLW   'L'
        
RETLW   '0'
        
RETLW   ' '
        
RETLW   'W'
        
RETLW   'O'
        
RETLW   'R'
        
RETLW   'L'
        
RETLW   'D'
        
RETLW   0x00

THUY    ADDWF   PCL
,F
        RETLW   
'T'
        
RETLW   'H'
        
RETLW   'U'
        
RETLW   'Y'
        
RETLW   0x00
        
WRITE_2_NIBBLES
        MOVWF   ACC
        BANKSEL TRISB
        MOVLW   
B'00001111'       Chon data lam dau ra
        ANDWF   TRISB
,F
        BANKSEL PORTB
        MOVLW   0xF0
        IORWF   PORTB
,F
        MOVF    ACC
,W
        IORLW   0x0F
        ANDWF   PORTB
,F           Dua 4 bit cao ra PortB
        BSF     PORTA
,EN
        NOP
        BCF     PORTA
,EN
        MOVLW   0xF0
        IORWF   PORTB
,F
        SWAPF   ACC
,W
        IORLW   0x0F
        ANDWF   PORTB
,F           Dua 4 bit cao ra PortB
        BSF     PORTA
,EN
        NOP
        BCF     PORTA
,EN
        
RETURN


        
INIT_LCD
        CALL    DELAY100
        BANKSEL TRISA
        MOVLW   
B'00000'
        
MOVWF   TRISB
        MOVWF   TRISA
        BANKSEL PORTA    
        BCF     PORTA
,RS
        BCF     PORTA
,RW
        BCF     PORTA
,EN
        BSF     PORTA
,EN
        MOVLW   0x28
        MOVWF   PORTB
        BCF     PORTA
,EN
        CALL    DELAY5
        MOVLW   0x28
        CALL    WRITE_2_NIBBLES   
Write A as two separate nibbles to LCD
        CALL    DELAY5
        MOVLW   0x0E
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        MOVLW   0x06
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        
RETURN

CLEAR_LCD
        BCF     PORTA
,RS
        MOVLW   0x01
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        
RETURN

WRITE_TEXT
        BSF    PORTA
,RS
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN  

GOTOLINE1
        BCF    PORTA
,RS
        ADDLW  0x80
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN 

GOTOLINE2
        BCF    PORTA
,RS
        ADDLW  0xC0
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN 




DELAY255    movlw    0xff        ;delay 255 mS
        
goto    D0
DELAY100    movlw    d
'100'        ;delay 100mS
        
goto    D0
DELAY50        movlw    d
'50'        ;delay 50mS
        
goto    D0
DELAY20        movlw    d
'20'        ;delay 20mS
        
goto    D0
DELAY5        movlw    0x05        
;delay 5.000 ms (4 MHz clock)
D0        movwf    R2
D1        movlw    0xC7            
;delay 1mS
        movwf    R3
        movlw    0x01
        movwf    R4
Delay_0
        decfsz    R3
f
        
goto    $+2
        decfsz    R4
f
        
goto    Delay_0

        decfsz    R2    
,f
        
goto    D1
        retlw    0x00
            
remaining code goes here



initialize eeprom locations

        ORG    0x2100
        DE    0x00
0x010x020x03


        END                       
directive 'end of program'


( em ko the nao dinh kem duoc file ?????? )
Rất mong chương trình này giúp đỡ được một phần nào cho các bạn

Nếu bạn nào thác mắc vấn đề về chương trình này thì hãy mở một luông mới để thảo luận về vấn đề này nhé


thay đổi nội dung bởi: mafd_47a, 09-10-2005 lúc 04:58 PM.
mafd_47a vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-10-2005, 02:05 AM   #6
mafd_47a
Đệ tử 3 túi
 
Tham gia ngày: Sep 2005
Bài gửi: 54
:
Chào các bạn ở bài viết này mình muốn đề cập đến sử dụng I2C trong F88

+ I2C là chuẩn giao tiếp của hang Philp và hiện đang đựoc sử dụng rất rộng rãi, ưu điểm tốc độ truyền nhanh, chỉ cần 2 dây SDA, SCL nhưng chỉ truyền trong phạm vi ngắn , Tốc độ đường truyền vào khoảng 100Kb => 400Kb ……
Các bạn có thể tham khảo tại :
http://users.pandora.be/educypedia/electronics/I2C.htm
http://www.semiconductors.philips.co...protocols/i2c/

+ Trong 16F88 có hỗ trợ I2C nhưng chỉ hỗ trợ các chế độ Slave Mode, do đó để có thể giao tiếp với các IC như DS1307 ( hoạt động ở chế dộ Slave mode ) ta phải tự xây dựng các giao tiếp chế độ Master Mode

+ Về tài liệu giao tiếp I2C trong PIC các bạn có thể tham khảo vidu của Ngài Nigel ( VD6 ) Project dưới đây tôi cũng dựa theo VD đó

+ Để các bạn hình dung được hơn về I2C mình Up lên cho các bạn Project mình vừa mới hoàn thành xong. Giao tiếp DS1307 với 16F88..
Các đặc điểm của chương trình:
Dây nối SDA, SCL được nối với RB1,RB4 của RTC, SQW/OUT của RTC được nối với RB0 ( chân này được sử dụng để tạo ngắt.ngoài )
Cơ chế hoạt động: cho RTC hoạt động với mức tạo xung ra ở chân SQW 1Hz, xung tín hiêu được đưa vào RB0 tạo ngăt, cứ mỗi khi có ngắt xảy ra thì Pic sẽ đọc dữ liệu từ RTC đưa ra màn hình LCD.

Trong chương trình ko sử dụng nut bắm để điều chinh thời gian , ko hiển thị ngày tháng năm, các bạn hoàn toàn có thể đưa vào để nâng cấp chương trình. Rât mong được nhận các chương trình từ các bạn

Phan 1
PHP Code:
;**********************************************************************
;                                                                     *
;    
Filename:        DS1307.asm                                        *
;    
Date:          20-10-2005                                        *
;    
File Version:  V1.0                                              *
;                                                                     *
;    
Author:        MAFD_47A                                            *
;    
Company:       BACHKHOA                                          *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Files requiredHien thi thoi gian dung DS1307                   *
;                    
Ket noi va hien thi dung LCD                     *
;                    
Su dung ngat ngoai de thuc hien bao thoi diem    *
;                    
Nhap du lieu                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Notes:    EN noi voi chan 7                                      *
;              
RS noi voi chan 6                                      *
;              
RW noi voi chan 3                                      *
;              
Data noi tu 3,2,1,(portAvoi D7,D6,D5,D4 cua LCD    *
;              
Su dung thach anh 4MH                                  *
;              
Chan SDASCL cua DS1307 ket noi voi SDASCL cua VDK  *
;              
Chan PTout duoc noi voi chan RB0 tao ngat)           *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Upgrade:  HIEN THI GIOPHUTGIAY LEN MAN HINH LCD              *
;              
SU DUNG NGAT DE NHAN BIET THOI GIAN (dung ngat RB0)    *
;                                                                     *
;                                                                     *
;**********************************************************************

    list      
p=16f88             ; list directive to define processor
    
#include <p16F88.inc>         ; processor specific variable definitions

    
errorlevel  -302              suppress message 302 from list file  _WRT_ENABLE_OFF

    __CONFIG    _CONFIG1
_CP_OFF _CCP1_RB0 _DEBUG_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _MCLR_OFF _PWRTE_ON _WDT_OFF _HS_OSC   
    __CONFIG    _CONFIG2
_IESO_OFF _FCMEN_OFF


;***** VARIABLE DEFINITIONS
w_temp        EQU     0x71        
variable used for context saving 
status_temp   EQU     0x72        
variable used for context saving
pclath_temp   EQU     0x73          
variable used for context saving
ACC           EQU     0x74
MODE          EQU     0x75
RO            EQU     0x78
R1            EQU     0x79
R2            EQU     0x7A
R3            EQU     0x7B
R4            EQU     0x7C
R5            EQU     0x7D
R6            EQU     0x7E
R7            EQU     0x7F
EN            EQU     H
'0007'
RS            EQU     H'0006'
RW            EQU     H'0003'
P7            EQU     H'0007'
START_RAM     EQU     0x60


PORT_DAT      EQU     PORTA
TRIS_DAT      EQU     TRISA
PORT_CON      EQU     PORTB
TRIS_CON      EQU     TRISB
SCL           EQU     0x04
SDA           EQU     0x01
I2C_PORT      Equ        PORTB
I2C_TRIS      Equ      TRISB


        CBLOCK     0x20            
;start of general purpose registers
            count
            Flags
            Flags2
            Adr_Lo            
RTC memory address to be accessed
            Adr_Hi
            DAT_VAL
            _N
            InputByte        
byte read from RTC is stored in this register
            OutputByte        
used for holding byte to be output to RTC
            I2Cflags        
flag bit register
            RAM_SEC      
            RAM_MIN       
            RAM_HOU       
            RAM_DAY       
            RAM_DAT       
            RAM_MON       
            RAM_YEA       
         endc

ErrFlag        Equ    0x00
StartFlag    Equ    0x01            
;flags used for received bit
One            Equ    0x02
Zero        Equ    0x03

Chip_Read     Equ    0xD1            
;RTC address values
Chip_Write    Equ    0xD0

      ORG 0x0000
        
goto MAIN
      ORG 0x0004

        movwf   w_temp            
save off current W register contents
        movf    STATUS
,w          move STATUS register into W register
        movwf    status_temp       
save off contents of STATUS register
        movf    PCLATH
,W          move PCLATH register into W register
        movwf    pclath_temp       
save off contents of PCLATH register
;==============================================================================
        
CLRF    Adr_Lo
        CALL    Read_RTC
        MOVWF   RAM_SEC
        INCF    Adr_Lo
        CALL    Read_RTC
        MOVWF   RAM_MIN
        INCF    Adr_Lo
        CALL    Read_RTC
        MOVWF   RAM_HOU
        CALL    CONVERT
        CALL    WRITE_TIMER_LCD
        BCF     INTCON
,1
;==============================================================================
          
movf    pclath_temp,w     retrieve copy of PCLATH register
        movwf    PCLATH            
restore pre-isr PCLATH register contents
        movf    status_temp
,w     retrieve copy of STATUS register
        movwf    STATUS            
restore pre-isr STATUS register contents
        swapf   w_temp
,f
        swapf   w_temp
,w          restore pre-isr W register contents
        retfie                    
; return from interrupt


MAIN
        BANKSEL ANSEL
        CLRF    ANSEL
        BANKSEL PORTA
        CALL    INIT_LCD
Kiem tra trang thai ban dau co nen nhap so lieu hay ko
        MOVLW   0x07
        MOVWF   Adr_Lo
        CALL    Read_RTC
        SUBLW   0x10
        BTFSC   STATUS
,Z
        
GOTO    NEXT_MAIN
Ham INIT Timer 
        MOVLW   0x00
        MOVWF   Adr_Lo
        CALL    Write_RTC
        MOVLW   0x07
        MOVWF   Adr_Lo
        MOVLW   0x10
        CALL    Write_RTC
        MOVLW   0x01
        MOVWF   Adr_Lo
        MOVLW   0x25
        CALL    Write_RTC
        MOVLW   0x02
        MOVWF   Adr_Lo
        MOVLW   0x00
        CALL    Write_RTC
NEXT_MAIN
        BANKSEL TRISB
        BSF     TRISB
,0
        BANKSEL PORTB
        MOVLW   
B'11010000'
        
MOVWF   INTCON

        
goto    $ 
mafd_47a vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-10-2005, 02:08 AM   #7
mafd_47a
Đệ tử 3 túi
 
Tham gia ngày: Sep 2005
Bài gửi: 54
:
Phan 2( cac module ve I2C va LCD )

PHP Code:
;================================== Cac chuong trinh con ======================
CONVERT
        MOVLW   START_RAM
        MOVWF   FSR
        MOVF    RAM_HOU
,W         Xu ly du lieu gio
        ANDLW   
B'00010000'
        
MOVWF   INDF
        SWAPF   INDF
,F            Luu vao trong Ram
        INCF    FSR
,F
        MOVF    RAM_HOU
,W    
        ANDLW   
B'00001111'
        
MOVWF   INDF              Ket thuc qua trinh xu ly hour
       
        INCF    FSR
,F             Bat dau xu ly minute
        MOVF    RAM_MIN
,W         Xy ly bien High truoc
        ANDLW   
B'01110000'
        
MOVWF   INDF
        SWAPF   INDF
,F
        INCF    FSR
,F
        MOVF    RAM_MIN
,W
        ANDLW   
B'00001111'
        
MOVWF   INDF
    
        INCF    FSR
,F             Bat dau xu ly SECOND
        MOVF    RAM_SEC
,W         Xy ly bien High truoc
        ANDLW   
B'01110000'
        
MOVWF   INDF
        SWAPF   INDF
,F
        INCF    FSR
,F
        MOVF    RAM_SEC
,W
        ANDLW   
B'00001111'
        
MOVWF   INDF
       
RETURN
WRITE_TIMER_LCD
        MOVLW   START_RAM
        MOVWF   FSR
        MOVLW   0x02
        MOVWF   R7
        MOVLW   0x05
        CALL    GOTOLINE1
LOOP_WTL1
        MOVF    INDF
,W            Qua trinh hien thi giophutgiay len dong 1 cua LCD
        ADDLW   0x30
        CALL    WRITE_TEXT
        INCF    FSR
,F
        MOVF    INDF
,W
        ADDLW   0x30
        CALL    WRITE_TEXT
        MOVLW   
':'
        
CALL    WRITE_TEXT
        INCF    FSR
,F
        DECFSZ  R7
,F
        
GOTO    LOOP_WTL1        Ket thuc qua trinh hien thi timer
        MOVF    INDF
,W            Qua trinh hien thi giophutgiay len dong 1 cua LCD
        ADDLW   0x30
        CALL    WRITE_TEXT
        INCF    FSR
,F
        MOVF    INDF
,W
        ADDLW   0x30
        CALL    WRITE_TEXT
        
RETURN

Write_RTC                    write W register to address Adr_Lo
        movwf    DAT_VAL            
save W
        call    I2C_Start
        call    I2C_Set_Write

; If ACK error display 'e'

        
btfsc    I2Cflags0
        call    Error_Routine

;            call    I2C_Hi_Adr        used for extendd addressing (24L64/5)

        
call    I2C_Lo_Adr

; If ACK error display 'f'

        
btfsc    I2Cflags0
        call    Error_Routine1

           movf    DAT_VAL
,     W    send the actual data
           movwf    OutputByte
           call    I2C_Out
           call    I2C_NAK

; If ACK error display 'g'

        
btfsc    I2Cflags0
        call    Error_Routine2

           call    I2C_Stop 
        call    WaitForWrite
           
return

Read_RTC                    reads data at location specified in Adr_Lo (& Adr_Hi for 24LC64)                    
        
call     I2C_Start         ; and page specified in Data_Page
        call    I2C_Set_Write     
returns result in W

; If ACK error display 'e'

        
btfsc    I2Cflags0
        call    Error_Routine
        call    I2C_Lo_Adr

; If ACK error display 'f'

        
btfsc    I2Cflags0
        call    Error_Routine1

           call     I2C_Start        
note there is no STOP
        call    I2C_Set_Read

; If ACK error display 'g'

        
btfsc    I2Cflags0
        call    Error_Routine2

           call     I2C_Read        
fetch the byte
           call     I2C_Send_NAK        
send no acknowledgement

           call     I2C_Stop
        movf     InputByte
,     W    ; return the byte in W
           
return


The following routines are low level I2C routines applicable to most
interfaces with I2C devices.

I2C_Read                    read byte on i2c bus
        clrf     InputByte
        movlw     0x08
        movwf     _N            
set index to 8    
        call    HIGH_SDA        
be sure SDA is configured as input
In_Bit
        call     HIGH_SCL        
clock high
        btfss     I2C_PORT
,    SDA    test SDA bit
        
goto    In_Zero
        
goto    In_One

In_Zero
        bcf     STATUS
,     C    clear carry
        rlf     InputByte
,     f    i_byte i_byte << 0
        
goto     Cont_In

In_One
        bsf    STATUS
,     C    set carry
        rlf     InputByte
,     f

Cont_In
        call    LOW_SCL            
bring clock low
        decfsz     _N
,     F        decrement index
        
goto     In_Bit
        
return

I2C_Out:                    ; send w register on I2C bus
           movwf     OutputByte
        movlw     0x08
        movwf     _N
Out_Bit
:
        
bcf     STATUS,        C    clear carry
        rlf     OutputByte
,     f    left shiftmost sig bit is now in carry
        btfss     STATUS
,     C    ; if onesend a one
        
goto     Out_Zero
        
goto     Out_One

Out_Zero
:
        
call     LOW_SDA            SDA at zero
        call     Clock_Pulse    
        call     HIGH_SDA
        
goto     Out_Cont

Out_One
:
        
call     HIGH_SDA        SDA at logic one
        call     Clock_Pulse
Out_Cont
:
        
decfsz     _N,        F    decrement index
        
goto     Out_Bit
        
return    

;;;;;;
        
I2C_NAK:                    ; bring SDA high and clock
        call     HIGH_SDA
        call     HIGH_SCL

        clrf    count            
wait for ACK
WaitForACK    
        incf    count
f        increase timeout counter each time ACK is not received
        btfsc    STATUS
Z
        
goto    No_ACK_Rec
        btfsc    I2C_PORT
,    SDA    test pin. If clearRTC is pulling SDA low for ACK
        
goto    WaitForACK        ; ...otherwise, continue to wait
        bcf        I2Cflags
0        clear flag bit (ACK received)
        
call     LOW_SCL
        
return

I2C_Send_NAK:                    ; bring SDA high and clock
        call     HIGH_SDA
        call     Clock_Pulse
        
return

WaitForWrite                    poll ACK for write timing
        call     I2C_Start
        call    I2C_Set_Write
        btfsc    I2Cflags
0
        
goto    WaitForWrite
        
return


;------ 
No ACK received from slave (must use "return" from here)
;; 
Typicallyset a flag bit to indicate failed write and check for it upon return.
No_ACK_Rec
        bsf    I2Cflags
0        set flag bit
        
return    

I2C_ACK:
        
call     LOW_SDA
        call     Clock_Pulse
        
return

I2C_Start:                
        
call     LOW_SCL
        call     HIGH_SDA
        call     HIGH_SCL
        call     LOW_SDA            
bring SDA low while SCL is high
        call     LOW_SCL
        
return

I2C_Stop:
        
call     LOW_SCL
        call     LOW_SDA
        call     HIGH_SCL
        call     HIGH_SDA        
bring SDA high while SCL is high
        call     LOW_SCL
        
return
 
I2C_Set_Write
        MOVLW     Chip_Write
        call     I2C_Out
        call     I2C_NAK
        
return

I2C_Set_Read
        MOVLW    Chip_Read
        call     I2C_Out
        call     I2C_NAK
        
return

I2C_Lo_Adr      movf     Adr_Lo,     W    send low byte of address
        call     I2C_Out
        call     I2C_NAK
        
return

Clock_Pulse:                    ; SCL momentarily to logic one
        call     HIGH_SCL
        call     LOW_SCL
        
return        

HIGH_SDA:                    ; high impedance by making SDA an input
        bsf     STATUS
,     RP0    bank 1
        bsf     I2C_TRIS
,     SDA    make SDA pin an input
        bcf     STATUS
,     RP0    back to bank 0
        
return

LOW_SDA:
        
bcf     I2C_PORT,     SDA    
        bsf     STATUS
,     RP0    bank 1
        bcf     I2C_TRIS
,     SDA    make SDA pin an output
        bcf     STATUS
,     RP0    back to bank 0
        
return

HIGH_SCL:
        
bsf     STATUS,     RP0    bank 1
        bsf     I2C_TRIS
,     SCL    make SCL pin an input
        bcf     STATUS
,     RP0    back to bank 0
        
return

LOW_SCL:
        
bcf        I2C_PORT,     SCL
        bsf     STATUS
,     RP0    bank 1
        bcf     I2C_TRIS
,     SCL    make SCL pin an output
        bcf     STATUS
,     RP0    back to bank 0
        
return

;------ 
No ACK received from slave.  This is the error handler.
Error_Routine
Output error messageetchere
        MOVLW   0x04
        CALL    GOTOLINE2
        movlw    
'e'
        
call    WRITE_TEXT
        
return                ; returns to INITIAL calling routine

Error_Routine1
Output error messageetchere
        MOVLW   0x05
        CALL    GOTOLINE2
        movlw    
'f'
        
call    WRITE_TEXT
        
return

Error_Routine2
Output error messageetchere
        MOVLW   0x06
        CALL    GOTOLINE2
        movlw    
'g'
        
call    WRITE_TEXT
        
return

End of I2C routines

;======================== MODULE LCD ====================================
WRITE_2_NIBBLES
        MOVWF   ACC
        BANKSEL TRISB
        MOVLW   
B'11110000'       Chon data lam dau ra
        ANDWF   TRIS_DAT
,F
        BANKSEL PORTB
        MOVLW   0x0F
        IORWF   PORT_DAT
,F
        SWAPF   ACC
,W
        IORLW   0xF0
        ANDWF   PORT_DAT
,F        Dua 4 bit CAO ra Port_CON
        BSF     PORT_CON
,EN
        NOP
        BCF     PORT_CON
,EN
        MOVLW   0x0F
        IORWF   PORT_DAT
,F
        MOVF    ACC
,W
        IORLW   0xF0
        ANDWF   PORT_DAT
,F        Dua 4 bit THAP ra Port_CON
        BSF     PORT_CON
,EN
        NOP
        BCF     PORT_CON
,EN
        
RETURN


        
INIT_LCD
        CALL    DELAY100
        BANKSEL TRISA
        MOVLW   
B'00000'
        
MOVWF   TRIS_DAT
        BCF     TRIS_CON
,EN
        BCF     TRIS_CON
,RS
        BCF     TRIS_CON
,RW
        BANKSEL PORTA    
        BCF     PORT_CON
,RS
        BCF     PORT_CON
,RW
        BCF     PORT_CON
,EN
        BSF     PORT_CON
,EN
        MOVLW   0x82
        MOVWF   PORT_DAT
        BCF     PORT_CON
,EN
        CALL    DELAY5
        MOVLW   0x28
        CALL    WRITE_2_NIBBLES   
Write A as two separate nibbles to LCD
        CALL    DELAY5
        MOVLW   0x0E
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        MOVLW   0x06
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        
RETURN

CLEAR_LCD
        BCF     PORT_CON
,RS
        MOVLW   0x01
        CALL    WRITE_2_NIBBLES
        CALL    DELAY50
        
RETURN

WRITE_TEXT
        BSF    PORT_CON
,RS
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN  

GOTOLINE1
        BCF    PORT_CON
,RS
        ADDLW  0x80
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN 

GOTOLINE2
        BCF    PORT_CON
,RS
        ADDLW  0xC0
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN 




DELAY255    movlw    0xff        ;delay 255 mS
        
goto    D0
DELAY100    movlw    d
'100'        ;delay 100mS
        
goto    D0
DELAY50        movlw    d
'50'        ;delay 50mS
        
goto    D0
DELAY20        movlw    d
'20'        ;delay 20mS
        
goto    D0
DELAY5        movlw    0x05        
;delay 5.000 ms (4 MHz clock)
D0        movwf    R2
D1        movlw    0xC7            
;delay 1mS
        movwf    R3
        movlw    0x01
        movwf    R4
Delay_0
        decfsz    R3
f
        
goto    $+2
        decfsz    R4
f
        
goto    Delay_0

        decfsz    R2    
,f
        
goto    D1
        retlw    0x00
            

        END 

Luu y voi cac ban la: cac ky tu f,g,e trong chuong trinh tren la cac ky tu bao loi duong truyen
File Kèm Theo
File Type: doc sodokhoi.doc (25.5 KB, 55 lần tải)

thay đổi nội dung bởi: mafd_47a, 26-10-2005 lúc 01:39 AM. Lý do: Quen Up len so do khoi
mafd_47a vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
Tìm mua PIC 16F84 or 16F88 rmitoday Tìm mua sản phẩm 4 09-08-2008 02:36 PM
Can mua 16f88 Khikom Tìm mua sản phẩm 1 09-03-2007 08:17 AM
Khai giảng lớp vi điều khiển ,cung cấp tài liệu tamphong Quảng cáo và bán sản phẩm 2 12-11-2006 08:40 PM
Tìm mua 16F88 ndtoan Tìm mua sản phẩm 2 24-04-2006 11:59 AM
Cách khai báo biến và liên kết chương trình tuan795 Cơ bản về vi điều khiển và PIC 3 13-01-2006 09:06 AM


Múi giờ GMT. Hiện tại là 06:45 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam