View Full Version : Cùng khai hoang con 16F88
noisePIC
29-09-2005, 06:25 PM
Sau một thời gian làm quen với PIC noisepic thấy học 16F84 là dễ nhất, và thấy 16F88 nhiều chức năng hơn như:
- ADC
- PWM
- Comparator (bộ so sánh)
.. Nói chung hơn hẳn 16F84. Hiện nay phong trào học PIC đang diễn ra sôi nổi, noisepic biết bên BKHN có hẳn một nhóm học PIC. Hi vọng chúng ta cùng học và khám phá nó. Bắt đầu nhé!
http://i11.photobucket.com/albums/a168/noisepic/PORTA1.jpg
//************************************************** ****
PORTA
Các chức năng có thể làm:
- Biến đổi AD
- Bộ so sánh
- I/O
Các thanh ghi liên qua đến PORTA, các bạn có thể xem thêm trong datasheet.
- Thanh ghi PORTA (RA7:RA0)
- Thanh ghi TRISA(TRISA7:TRISA0)--> I/O?
- Thanh ghi ADCON1(ADFM,ADCS2,VCFG1,VCFG0)
- Thanh ghi ANSEL (Bit ANS4:ANS0)--> cấu hình cho 1 chân là Analog/digital
Nếu dùng chức năng A/D, comparator thì dùng thanh ghi ADCON1.
//************************************************** ****
http://i11.photobucket.com/albums/a168/noisepic/thanhghi1.jpg
Chương trình sau viết bằng CCS_ làm cho 1 LED nháy tại chân RA0 với khoảng thời gian là 1s
#include<16F88.h>
#include<def_16F88.h>
#use delay(clock=4000000)
#fuses NOWDT,MCLR,HS
main()
{
TRISA=0;// Chân RA0 là Output
ANS0 =0;// Chân RA là Digital
RA0 =1;// RA0~5V
while(1)
{
RA0=!RA0;
delay_ms(1000);
}
}
Nếu 10 người cùng học thì tốc độ học sẽ nhanh gấp 10 lần!!..rất mong các bạn hưởng ứng!
mafd_47a
30-09-2005, 12:37 AM
Chào Noisepic:
Tớ là thành viên của nhóm BK ấy đây, Hôm nay vừa mới nhận được Pic+Mach Nạp từ anh BinhAnh , cho nên bây giờ mới đủ diều kiện thực hành về Pic.( mấy hôm trước chỉ viết chay)
Cậu dung CCS còn tớ dung Mpasm như thế sẽ có sự tương đương . Chúng ta sẽ làm từng phần một, khi làm đến phần nào cậu viết lý thuyết ( bao gồm các thanh ghi, các chức năng ) . Coi như cậu là người cầm trịch của box này, đẫn dắt anh em
Anh em sẽ theo sau để hỗ trợ và bổ sung nếu cần thiết
Tài liệu chính của chúng ta sẽ là cuốn datasheet 16f88
Có lẽ nhưng người tham gia box này đều là những người mới học Pic( như tui) hoặc mới bẳt đầu làm trên 16f88 ( như bác NoisePic) , do đó kinh nghiệm ko nhiều Và chắc chắn ko tránh khỏi sai sót , rất mong sự giúp đỡ của các bậc tiền bối đi trước
Working together to improve ourselves
Bắt đầu thôi ……………….
noisePIC
30-09-2005, 03:00 PM
Có nhiều nguồn cấp xung nhịp cho 16F88
http://i11.photobucket.com/albums/a168/noisepic/OSC1.jpg
Có 3 nguồn tạo dao động chính:
- Bộ dao động sơ cấp (Primary Oscillator)
- Bộ dao động thứ cấp (Secondary Oscillator)
- Bộ dao động bên trong (Internal Oscillator)
Việc cấu hình các bit trong thanh ghi CONFIG1, OSCCON sẽ để PIC làm việc với bộ dao động nào! tần số bao nhiêu?
//*********************************************
thanh ghi CONFIG1
FOSC2:FOSC0
= 010 // Làm việc với bộ dao động thạch anh, tần số >= 4MHz, cách này thường sử dụng
= 101 // Làm việc với bộ dao động bên trong (INTRC), RA7: I/O
= 100 // INTRC, RA6,RA7: I/O
Thanh ghi OSCCON (0x8F)
SCS<1:0>
= 00 // Chế độ dao động chọn bởi FOSC2:FOSC0
= 01 // xung nhịp hệ thống lấy từ Timer1
= 10 // xung nhịp hệ thống lấy từ bộ dao động RC bên trong.
OSCCON<6:4> 3 bit này sẽ quyết định xung nhịp của bộ dao động bên trong.
//**********************************************
Có 8 chế độ dao động:
LP Lowpower Crystal
XT Crystal/ Resonator
HS High Speed Crystal/Resonator
RC External Resitor/ Capacitor với Fosc/4 tại lối ra RA6
RCIO External Resitor/ Capacitor với I/O trên RA6
INTIO1 Bộ dao động bên trong với Fosc/4 lối ra trên RA6 và I/O trên RA7
INTIO2 Bộ dao động bên trong với I/O trên RA6, và RA7
ECIO Xung nhịp bên ngoài với I/O trên RA6
Do vậy khi lắp bộ dao động thế nào, bạn phải cấu hình bit cho phù hợp!
vietsonxp
01-10-2005, 09:34 PM
NoiPIC viết rất hay. cảm ơn em nhiều.
hamchoi
03-10-2005, 06:09 PM
Khoan đã nào, chương trình thì hay thiệt nhưng sau mình thử chạy chương trình của bạn noisePIC thi máy lại báo lỗi ở phần def_16F88.h nhỉ? Bạn hãy giải thích giùm mình đi.
noisePIC
03-10-2005, 08:47 PM
Bạn hamchoi chắc chưa đọc những bài viết cũ của noisepic, vì file def_16f88.h chứa định nghĩa các thanh ghi và các bit của 16F88. Cách lập trình này giúp bạn hiểu rõ hơn về phần cứng. Trong các bài viết của noisepic, dùng đến thanh ghi nào noisepic sẽ bổ sung vào file def_16F88.h--> khi làm xong hết chắc là đủ số thanh ghi và các bit.
Ví dụ file def_16F88.h dủng trong chương trình trên
// dinh nghia cac thanh ghi
#byte TMR0=0x01 // Dia chi thanh ghi TRM0
#byte PORTA=0x05 // Dia chi thanh ghi PORTA
#byte PORTB=0x06 // Dia chi thanh ghi PORTB
#byte TRISA=0x85
.................................................. .................
#byte ADCON=0x1F
// dinh nghia cac bit
#bit TRISA0 = 0x85.0
#bit TRISA1 = 0x85.1
.....
Khi các bạn tự tay viết địa chỉ, các bit trong thanh ghi thì sẽ ngấm hơn bạn sẽ biết chương trình tác động vào thanh ghi nào? bit nào?... dần dần bạn sẽ làm chủ được các chương trình của mình.
Chúc bạn vui vẻ!
falleaf
03-10-2005, 11:05 PM
Em có thể lấy các file .h này trong MPASM, nó đã định nghĩa sẵn rồi, và nó định nghĩa tất cả các thanh ghi có trong danh sách của nó. Nó có rất đầy đủ, em không cần phải viết lại như thế này.
Với CCS C, nó cũng có đầy đủ rồi, không cần viết lại.
Ngoại trừ một số thanh ghi mà em muốn tạo thêm, tuy nhiên, nói chung không nên đặt thêm nhiều ngoài các thanh ghi có trong map registers của nó. Bởi vì mỗi chương trình có một đặc thù riêng, dùng của nó là đủ rồi.
hamchoi
04-10-2005, 09:43 AM
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é!
mafd_47a
07-10-2005, 02:42 PM
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/idcplg?IdcService=SS_GET_PAGE&nodeId=1999&ty=&dty=§ion=&NextRow=&ssUserText=DS00097D&DesignDocSelect=&x=5&y=4
mafd_47a
07-10-2005, 04:25 PM
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
_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
__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
08-10-2005, 01:49 AM
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
mafd_47a
09-10-2005, 04:51 PM
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/showthread.php?t=281&page=1&pp=10
;************************************************* *********************
; *
; Filename: LCD.asm *
; Date: 25-9-2005 *
; File Version: V1_1 *
; *
; Author: MAFD_47A *
; Company: BACHKHOA *
; *
; *
;************************************************* *********************
; *
; Files required: Convert 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, 0x01, 0x02, 0x03
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é
:)
mafd_47a
24-10-2005, 02:05 AM
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.com/markets/mms/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
;************************************************* *********************
; *
; Filename: DS1307.asm *
; Date: 20-10-2005 *
; File Version: V1.0 *
; *
; Author: MAFD_47A *
; Company: BACHKHOA *
; *
; *
;************************************************* *********************
; *
; Files required: Hien 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,0 (portA) voi D7,D6,D5,D4 cua LCD *
; Su dung thach anh 4MH *
; Chan SDA, SCL cua DS1307 ket noi voi SDA, SCL cua VDK *
; Chan PTout duoc noi voi chan RB0 ( tao ngat) *
; *
;************************************************* *********************
; *
; Upgrade: HIEN THI GIO, PHUT, GIAY 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
24-10-2005, 02:08 AM
;================================== 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 gio, phut, giay 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 gio, phut, giay 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 I2Cflags, 0
call Error_Routine
; call I2C_Hi_Adr ; used for extendd addressing (24L64/5)
call I2C_Lo_Adr
; If ACK error display 'f'
btfsc I2Cflags, 0
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 I2Cflags, 0
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 I2Cflags, 0
call Error_Routine
call I2C_Lo_Adr
; If ACK error display 'f'
btfsc I2Cflags, 0
call Error_Routine1
call I2C_Start ; note there is no STOP
call I2C_Set_Read
; If ACK error display 'g'
btfsc I2Cflags, 0
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 << 1 | 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 shift, most sig bit is now in carry
btfss STATUS, C ; if one, send 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 clear, RTC 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)
;; Typically, set 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 message, etc. here
MOVLW 0x04
CALL GOTOLINE2
movlw 'e'
call WRITE_TEXT
return ; returns to INITIAL calling routine
Error_Routine1
; Output error message, etc. here
MOVLW 0x05
CALL GOTOLINE2
movlw 'f'
call WRITE_TEXT
return
Error_Routine2
; Output error message, etc. here
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
mafd_47a
24-10-2005, 02:14 AM
Chương trình trên các bác cứ coi như là một newbie viết nhé. Các bác đừng có cười em nhé. Nếu có gì sai hoặc lỗi mong các bác cứ bảo em Thực sự là em cũng rất mong được nhận duoc các y kien hay chương trình nâng cấp của các bác. Vì hiện em cũng chưa có thời gian để làm tiếp về con này
Xem chừng 16F88 được it người quan tâm quá àh. Có lẽ cũng phải theo thời đại chuyển sang 16F87x thui.
Chúc cả nhà vui
noisePIC
24-10-2005, 10:17 PM
To mafd_47a:
Bạn viết thế này rất khó theo dõi, trước khi viết code cậu có thể viết "chiến thuật" để giải quyết bài toán. Và đoạn code nào thực hiện việc giải quyết đó. Tại vì MPASM không phải ai cũng viết được, có thể viết bằng CCS ,HTPIC, BASIC.. và sau đó phần code bạn có thể để file *.asm hoặc *.txt ai đó muốn xem thì "đao" về. Còn sơ đồ nguyên lý nữa,...
//************************************************** ***********
Tớ rất thích chữ kí của bạn! rất đúng đó
ONE WORK, ONE PURPOSE or NOTHING!
To mafd_47a: Tôi đang dùng CCS viết cho con PIC16F88 để điều khiển LCD 20x4 và thấy rất dễ dàng, vì nó có sẵn thư viện LCD420.c.
Tôi thấy con PIC16F88 này rất hay, vì nó sẵn mấy đường vào ADC, tôi sử dụng 4 kênh vào ADC, hiển thị kết quả đo được nên LCD.
Chào bạn,
Mình cũng ở HN. Mình sẵn lòng ủng hộ các chương trình của mình đã làm để mọi người cùng tham khảo.
Mình vừa làm 1 chương trình rất nhỏ, với 1 mục đích là đo đồng thời 4 tín hiệu tương tự, và hiển thị kết quả lên LCD 4x20. Mình sử dụng PIC16F88. Đồng thời kết quả đó được đưa về PC qua cổng RS232. Mình phải sửa lại thư viện LCD420.C của CCS một chút, vì trong thư viện này, nó dùng chân Tx và Rx để điều khiển LCD, do vậy tôi phải diều chỉnh lại sơ đồ chân nối với LCD. Mặt khác, trong ứng dụng của tôi, tôi không sử dung các hàm đọc từ LCD xuồng PIC, thế nên tôi cũng không nối chân RW của LCD về PIC nữa, mà nối chân RW xuống đất.
Chức năng của PIC16F88 là rất nhiều, nhưng số cổng ra ngoài lại có hạn, do số chân PIC chỉ có 18, thế nên khi thiết kế, chúng ta lên tối ưu lại sơ đồ nối bên ngoài để tận dụng các chức năng có sẵn của PIC và hạn chế số lượng linh kiện phụ trợ bên ngoài.
Rất mong nhận được ý kiến đóng góp của mọi người để thiết kế của tôi được hoàn thiện hơn.
Thanks
P/S: Làm sao để upload file lên diễn đàn đây ???
mafd_47a
28-10-2005, 01:22 AM
Rất hoan nghênh bạn đã đóng góp vào box này
Khi bạn soạn thảo, bạn chú ý phía dưới phần soạn thảo sẽ thấy phần “Đính kèm” kích vào phần “ Tải file từ máy” khi đó trên màn hình Window sẽ mở ra hộp thoại bạn chọn Choose để chỉ đường dẫn đến file mà bạn muốn chọn rồi kích vào “them File” đợi khoảng một lát để máy tải file lên nếu xuất hiện File bên dưới thì coi như bạn đã xong ( lưu ý đến các file hợp lệ về kích thước, kiểu file …. ) đóng hộp thoại này rồi sau đó gửi như bình thường
mafd_47a
30-10-2005, 09:47 AM
Chuẩn 1-Wire interface là một chuẩn của Maxim-ic, có khá nhiều linh kiện về giao tiếp cho chuẩn này. Điển hình nhất là đo nhiềt độ dùng Sensor nhiệt DS18B20, hay DS1821. Ưu điểm của chuẩn giao tiếp này là chúng ta chỉ cần một dây để giao tiếp, Giao thức giao tiếp cũng khá đơn giản có lợi cho Master ( đơn giản hơn I2C )
Bài viết tới đây tôi xin giới thiệu cho các bạn về chuẩn giao tiếp này
file: 1w_16f6x.inc ( dung de khai bao bien dau - Marco )
; ************************************************** *****
;
; Dallas 1-Wire Support for PIC16F628
;
; Processor has 4MHz clock and 1s per instruction cycle.
;
; ************************************************** *****
; ************************************************** *****
; Dallas Semiconductor 1-Wire MACROS
; ************************************************** *****
WRITE_SENTENCE: MACRO POS,DONG,CHUOI,WRITE,VITRICONTRO
MOVLW POS
CALL DONG
CLRF R1
AGAIN1 MOVF R1,W
CALL CHUOI
ADDLW 0x00
BTFSC STATUS,Z
GOTO NEXT1
CALL WRITE
INCF R1,F
GOTO AGAIN1
MOVLW POS
ADDWF R1,W
MOVWF VITRICONTRO ; Luu con tro cua LCD vao bien
NEXT1
ENDM
OW_HIZ:MACRO
BSF STATUS,RP0 ; Select Bank 1 of data memory
BSF TRISB, DQ ; Make DQ pin High Z
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
OW_LO:MACRO
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF PORTB, DQ ; Clear the DQ bit
BSF STATUS,RP0 ; Select Bank 1 of data memory
BCF TRISB, DQ ; Make DQ pin an output
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
WAIT:MACRO TIME
;Delay for TIME s.
;time must be in multiples of 5s.
MOVLW (TIME/5)-1 ;1s
MOVWF TMP0 ;1s
CALL WAIT5U ;2s
ENDM
; ************************************************** *****
; Dallas Semiconductor 1-Wire ROUTINES
; ************************************************** *****
WAIT5U:
;This takes 5uS to complete
NOP ;1s
NOP ;1s
DECFSZ TMP0,F ;1s or 2s
GOTO WAIT5U ;2s
RETLW 0 ;2s
; --------------------------------------------------------
OW_RESET:
OW_HIZ ; Start with the line high
CLRF PDBYTE ; Clear the PD byte
OW_LO
WAIT .500 ; Drive Low for 500s
OW_HIZ
WAIT .70 ; Release line and wait 70s for PD Pulse
BTFSS PORTB,DQ ; Read for a PD Pulse
INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse
WAIT .400 ; Wait 400s after PD Pulse
RETLW 0
; --------------------------------------------------------
DSRXBYTE: ; Byte read is stored in IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSRXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP
NOP ; Bring DQ low for 6s
OW_HIZ
NOP
NOP
NOP
NOP ; Change to HiZ and Wait 4s
MOVF PORTB,W ; Read DQ
ANDLW 1<<DQ ; Mask off the DQ bit
ADDLW .255 ; C=1 if DQ=1: C=0 if DQ=0
RRF IOBYTE,F ; Shift C into IOBYTE
WAIT .50 ; Wait 50s to end of time slot
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSRXLP
RETLW 0
; --------------------------------------------------------
DSTXBYTE: ; Byte to send starts in W
MOVWF IOBYTE ; We send it from IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSTXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP ; Drive the line low for 5s
RRF IOBYTE,F ; The data byte
BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
BSF PORTB,DQ ; Drive the line high if LSB is 1
WAIT .60 ; Continue driving line for 60s
OW_HIZ ; Release the line for pullup
NOP
NOP ; Recovery time of 2s
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSTXLP
RETLW 0
; --------------------------------------------------------
Về chuẩn giao tiếp các bạn có thể tham khảo các tài liệu dưới đây. Về phương thức giao tiếp tôi dùng luôn code của họ. Với các chuẩn giao tiếp tôi nghĩ chúng ta nên dùng các code có sẵn; nếu tự xây dựng thì sẽ rất mất nhiều thời gian và chắc chắn là sẽ không tối ưu ( bài học sương máu từ I2C )
mafd_47a
30-10-2005, 09:58 AM
File tempt.asm
;************************************************* *********************
; *
; Filename: DS1307.asm *
; Date: 28-10-2005 *
; File Version: V1.0 *
; *
; Author: MAFD_47A *
; Company: BACHKHOA *
; *
; *
;************************************************* *********************
; *
; Files required: Ket noi PIC16f88 voi DS1821 hien thi len LCD *
; *
; *
; *
;************************************************* *********************
; *
; Notes: EN noi voi chan 7 *
; RS noi voi chan 6 *
; RW noi voi chan 3 *
; Data noi tu 3,2,1,0 (portA) voi D7,D6,D5,D4 cua LCD *
; Su dung thach anh 4MH *
; Noi DQ cua DS1821 voi chan RA$ cua VDK *
; *
;************************************************* *********************
; *
; Upgrade: *
; *
;************************************************* *********************
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
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
R0 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
I2C EQU 0x00
PORT_DAT EQU PORTA
TRIS_DAT EQU TRISA
PORT_CON EQU PORTB
TRIS_CON EQU TRISB
DQ EQU 0x04
cblock 0x20
IOBYTE
TMP0 ; Address 0x23
COUNT ; Keep track of bits
PICMSB ; Store the MSB
PICLSB ; Store the LSB
PDBYTE ; Presence Detect Pulse
VITRI ; Dung de luu bien cua vi tri con tro trong LCD
S100 ; Gia tri hang 100
S10 ; Gia tri hang chuc
S1 ; Gia tri hang don vi
endc
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
;================================================= =============================
;================================================= =============================
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
include <1W_16F6X.inc>
MAIN
BANKSEL ANSEL
CLRF ANSEL
BANKSEL PORTA
CALL INIT_LCD
;================================================= ===================
WRITE_SENTENCE 0x03,GOTOLINE1,MYDATA,WRITE_TEXT,VITRI
CALL INIT_TEMP
MOVLW 0x08
MOVWF VITRI
AGAIN CALL DELAY255
CALL DELAY255
CALL DELAY255
CALL DELAY255
CALL GET_TEMP
INCF IOBYTE,F
CALL WRITE_TEMP
GOTO AGAIN
;================================================= ===================
MYDATA ADDWF PCL,F
RETLW 'T'
RETLW 'E'
RETLW 'M'
RETLW 'P'
RETLW ':'
RETLW ' '
RETLW 0x00
INIT_TEMP
CALL OW_RESET
MOVLW 0x01
CALL DSTXBYTE
MOVLW .40
CALL DSTXBYTE
CALL OW_RESET
MOVLW 0x02
CALL DSTXBYTE
MOVLW .10
CALL DSTXBYTE
CALL OW_RESET
MOVLW 0x0C
CALL DSTXBYTE
MOVLW B'01000000'
CALL DSTXBYTE
CALL OW_RESET
MOVLW 0xEE
CALL DSTXBYTE
RETURN
GET_TEMP
CALL OW_RESET
MOVLW 0xAA
CALL DSTXBYTE
CALL DSRXBYTE ; GIA TRI NHIET DO DA DUOC LUU VAO IOBYTE
RETURN
WRITE_TEMP
MOVF IOBYTE,W
CALL CONVERT_BCD
MOVF R2,W ; Luu cac gia tri r2,r1,r0 vao cac bien s100,s10,s1
MOVWF S100
MOVF R1,W
MOVWF S10
MOVF R0,W
MOVWF S1
MOVF VITRI,W
CALL GOTOLINE1
MOVF S100,W
ADDLW 0x00
BTFSC STATUS,Z
MOVLW 0xE0
ADDLW 0x30
CALL WRITE_TEXT
MOVF S10,W
ADDLW 0x30
CALL WRITE_TEXT
MOVF S1,W
ADDLW 0x30
CALL WRITE_TEXT
RETLW 0x00
CONVERT_BCD ; In W, out: R2,R1,R0 ( hang tram chu, don vi )
MOVWF ACC ; Luu vao trong ACC lam thanh ghi dem
CLRF R0 ; Xoa cac thanh ghi de luu RA DANG gia tri out
CLRF R1
CLRF R2
MOVLW .100
BCD_100 ; Voi so hang chuc
INCF R2,F
SUBWF ACC,F
BTFSC STATUS,C
GOTO BCD_100
DECF R2,F
ADDWF ACC,F
MOVLW .10
BCD_10 ; Voi so hang chuc
INCF R1,F
SUBWF ACC,F
BTFSC STATUS,C
GOTO BCD_10
DECF R1,F
ADDWF ACC,W
MOVWF R0
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
( Module ve LCD cac ban tham khao o tren bai viet ve DS1307 )
Việc mổ sẻ các chương trình con ở trên sẽ mất rất nhiều thời gian, chắc tôi ko đủ sức làm được. Thắc mắc chỗ nào mọi người cứ post lên chúng ta cùng giải quyết
Còn một điều nữa chương trình này là bản V1.0 tức là bản đầu tiên, tôi chưa chú trọng đến giao diện hay việc tối ưu code chương trình, Mục đích của các bản V1.0 ở đây là làm sao chay được mà thôi. Với chương trình này các bạn hoàn toàn có thể nâng cấp chỉnh sửa nó lên
Have a good time
tuanva
02-11-2005, 02:01 PM
Tôi gửi thử sơ đồ mạch
Sao không thấy gì nhỉ, ví dụ của vdt rất hay. Cậu có thể gửi cho tôi đc không? tuan@cdc-automation.com.vn
Cám ơn nhiều.
Gửi thử sơ đồ PIC6F88 điều khiển LCD 4x20
kienvq
11-04-2006, 08:45 AM
các bác nói hay lắm, nhưng mình đi tìm con F88 này mà có ở đâu bán đâu
bác nào có bán, hay biết chỗ bán thì lên tiếng với.
falleaf
11-04-2006, 02:46 PM
Ngay trong picvietnam có bán, phần quảng cáo và bán sản phẩm. Nếu bạn cần mua bán gì, cứ vào đó nhé. Hạn chế hỏi han việc mua bán trong các bài viết kỹ thuật.
Chúc vui
sidesignvn
01-10-2008, 11:22 AM
Tôi mới thực hiện một thiết kế với 16F88 để tiết kiệm thạch anh tôi dùng dao động nội trong CCS như sau:
#include <16F88.H>
#include <ctype.h>
#fuses INTRC_IO,NOWDT
#use delay(clock=8000000)
#use rs232(baud=19200,xmit=PIN_B5, rcv=PIN_B2,enable=PIN_B4,errors,stream=HOSTPC)
#define TRIS_A 0xFF //0b11111111 //Tat ca la dau vao
#define TRIS_B 0xC4 //0b11000100
#define RTCC_RVALUE 6 //=256 - ((8000000/4)/RTCC_DIV_8)/1000 (Ngat 1000 lan/giay)
#define DO2 PIN_B0 //Led
int16 LedTimeout;
void InitPar()
{
set_tris_a(TRIS_A);
set_tris_b(TRIS_B);
}
void InitRTCC(void)
{
set_rtcc(RTCC_RVALUE); // Khoi tao timer0
setup_counters (RTCC_INTERNAL, RTCC_DIV_8);
enable_interrupts (INT_RTCC);
}
#INT_RTCC
clock_isr()
//Ngat nay se tran sau 1000us
{
disable_interrupts(INT_RTCC);
if (++LedTimeout > 1000)
{
output_toggle(DO2);
LedTimeout = 0;
}
set_rtcc(RTCC_RVALUE);
enable_interrupts(INT_RTCC);
}
...
RA6, RA7 tôi để lửng. Bình thường LED nhấp nháy đúng chu kỳ sáng 1 giây / tắt 1 giây. Khi tôi đưa tay lại gần hoặc trạm vào chân RA6, RA7 thì chân đầu ra DO2 chỉ chớp xuống 0 rồi lên 1 ngay (không giữ được ở trạng thái 0 đủ thời gian 1 giây).
Tôi nghi rằng việc đặt #fuses của tôi chưa đủ dẫn đến chưa chuyển được chân RA6, RA7 sang mode IO nên vẫn bị ảnh hưởng đến hoạt động của chíp.
Bạn nào biết vấn đề này xin chỉ giúp cách giải quyết.
Chân thành cảm ơn.
tantme
13-04-2012, 03:24 AM
mấy a cho e xin file def_16f88 được không. e không chuyên về pic lắm nên không thể tạo được file này. mấy a có file định nghĩa nào khác nữa thì cho e với. e mới học nên còn gà lắm. mail e: tantme@gmail.com
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.