CCS C cho PIC16F877A
Chào cả nhà!
Để lập trình cho PIC, mọi người có thể chọn cho mình những ngôn ngữ lập trình khác nhau như ASM, CCS C, HT-PIC, pascal, basic,... Với nhh, đầu tiên tìm hiểu và viết chương trình cơ bản bằng ASM để hiểu rõ cấu trúc sau đó thì viết bằng CCS C cũng viết lại những cái cơ bản và đi dần lên, tốc độ lúc này nhanh hơn khi viết bằng ASM rất nhiều. Khi viết bằng CCS C thông thường thì dịch ra file.hex có dài hơn so với khi viết bằng ASM. Hai ngôn ngữ CCS C và HT-PIC được ưa chuộng hơn cả, CCS C dễ học,gần gũi với ASM còn HT-PIC là dạng ANSI C. Để lập trình và biên dịch CCS C, dùng chương trình PIC C Complier,sau khi soạn thảo các bạn ấn F9 để dịch,nếu thành công sẽ có thông báo như sau: http://i82.photobucket.com/albums/j257/nhhao/ccsc.gif Ngoài ra, để xem code ASM như thế nào,sau khi dịch bạn chọn mục C/ASM List như hình dưới đây: http://i82.photobucket.com/albums/j257/nhhao/ccsc1.gif Link download trình biên dịch CCS C ở đây: http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar Phiên bản mới hơn tải tại: www.kho.tailieuvietnam.net, vào Download Home > Điện tử tàn thư > Vi điều khiển - Vi xử lý - PLC Chúng ta cùng nhau tìm hiểu lần lượt các phần sau: 1.I/O + Delay 2.Timer và ngắt Timer 3.Ngắt ngoài 4.ADC, PWM,... (tập trung mổ xẻ nhiều) 5...... Tạm thời cứ như vậy đã, sau này sẽ tính tiếp! Nào,chúng ta bắt đầu thôi! |
I/O + Delay _ Delay 1s RB0
1 Attachment(s)
Chương trình này làm nhấp nháy con led ở chân RB0 1s sáng, 1s tắt.
Code:
#include<16F877A.h> Code:
#include<16F877A.h> Code:
#fuses NOWDT,PUT,HS,NOPROTECT Code:
#use delay(clock=10000000) Code:
output_high(PIN_B0) Code:
output_low(PIN_B0) Code:
delay_ms(1000) Chú ý hàm này chỉ có tác dụng khi có khai báo tần số dao động cấp cho PIC Và bây giờ thử làm cho tất cả 8 led nối với portB chớp tắt 1s xem nào!Phải chăng ta sẽ làm như sau (Viết trong vòng lặp while): Code:
{ Bài tiếp theo sẽ đưa ra câu trả lời.... http://www.freewebtown.com/nhhao/PIC...201s%20RB0.GIF |
Hihi.
Sợ ASM rồi hả! |
Ah ..ah!
Sợ thì không hẳn nhưng viết nó phức tạp quá....:D làm dễ phát chán ... Nhưng không sao chính cứ post mấy cái tutorial nhanh nhanh lên, nhh vẫn dùng asm như thường à ..... Cái nào đơn giản ,dễ học thì mình vào thôi.... |
Delay 1s portB
1 Attachment(s)
Ăc..ặc..đang post thì bị cúp điện,bực cả mình...:mad:
Và đây là câu trả lời cho việc delay led ở portB 1s Code:
#include<16F877A.h> Code:
#byte portb=0x6 Code:
set_tris_b(0) Trong HELP hướng dẫn lệnh này như sau: "These functions allow the I/O port direction (TRI-State) registers to be set. This must be used with FAST_IO and when I/O ports are accessed as memory such as when a #BYTE directive is used to access an I/O port. Using the default standard I/O the built in functions set the I/O direction automatically." Rõ ràng khi set byte làm I/O nếu ta thêm khai báo: Code:
#use fast_io(b) Phần I/O + Delay tạm thời xong như vậy, bác nào có phản hồi thì tiếp tục thảo luận.Xong phần này có thể viết về xuất led 7 đoạn, quét phím, LCD,....Bác nào viết thì cứ post lên cho bà con thảo luận nhé ! Hẹn gặp lại vài hôm nữa ở bài Timer/Counter ! Chào! http://www.freewebtown.com/nhhao/PIC/delay1sportb.gif |
2 Attachment(s)
Trích:
Code:
#include <16F877.h> |
Cám ơn nhh đã trả lời cho mình, do lần trước mình khai báo chưa đúng cách giữa 16f877A và *=16 đúng ra phải viết liền như bạn minh lại viết cách ra như thế này "16f877A *=16". Nhân tiện cho mình hỏi luôn ý nghĩa của việc khai báo "#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT"
|
Trích:
Tui cứ tưởng ko ma nào vào luồng này chứ ! Khai báo: Code:
"#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT -NOWDT:tắt WDT -NOPROTECT:tắt PROTECT -NOLVP:không dùng LVP -NOBROWNOUT:ko BROWNOUT Còn cụ thể ý nghĩa thế nào,bạn vào help của CCS C gõ :"#fuses" Chào! |
Cái luồng bên này nhh vẽ hình cẩu thả quá!
Cái chân MCLR*, bạn phải nối thên cái công tắc ấn vào. nhh nối như vậy thì không reset được con PIC đâu Hai cái chân Vss phải được nối mass. Chân nào không xài, nhh nên đánh dấu bỏ đi (trong thanh công cụ của ORCAD có cái dấu này đó). Nếu mình chịu khó cẩn thận hơn một chút thì sẽ hạn chế được rất nhiều sự bỡ ngỡ cho người mới học. Bạn coi mấy cái hình mình vẽ trong mấy cái Tutorial thì thấy, từng chi tiết đều được chú ý cả, không thể tùy tiện được. :D |
Thank you!
Đúng là mình ko chú ý chỗ này!Mình sẽ sửa và up lên lại! |
cho mình hỏi viết chương trình như thế nào để có thể nạp qua bootloader cho 877A dùng Tinybootloader . Bạn có thể viết 1 ví dụ nháy led như trên đc ko
|
Viết chương trình như bình thường, không có gì thay đổi, nhưng vị trí đầu tiên của chương trình phải lưu ý. Bạn xem hướng dẫn tinybootloader.
Chúc vui. |
Timer
Hi....!
Trong Pic16f877a có 3 timer : + Timer0 : 8 bit + Timer1 : 16 bit + Timer2 : 8 bit Timer dùng cho nhiều ứng dụng : định thời, capture, pwm, ... 1.Timer0 Thanh ghi tác động: http://www.freewebtown.com/nhhao/PIC...i tac dong.GIF Các lệnh: Code:
setup_TIMER_0(mode); RTCC_INTERNAL : chọn xung clock nội RTCC_EXT_L_TO_H : chọn bit cạnh lên trên chân RA4 RTCC_EXT_H_TO_L : chọn bit cạnh xuống trên chân RA4 RTCC_DIV_2 :chia prescaler 1:2 RTCC_DIV_4 1:4 RTCC_DIV_8 1:8 RTCC_DIV_16 1:16 RTCC_DIV_32 1:32 RTCC_DIV_64 1:64 RTCC_DIV_128 1:128 RTCC_DIV_256 1:256 rtcc_state là một trong những constant sau: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L ps_state là một trong những constant sau: RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 RTCC_DIV_256 WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS Mình cũng chưa hiểu ý nghĩa của hàm WDT_..., ko biết có phải khai báo như trên thì sau khoảng thời gian ms bao nhiêu đó đặt sau WDT_ thì sẽ reset lại Pic ?????:confused: 2.Timer1 Thanh ghi tác động: http://www.freewebtown.com/nhhao/PIC...i tac dong.GIF Các lệnh: Code:
setup_TIMER_1(mode); T1_DISABLED : tắt Timer1 T1_INTERNAL : xung clock nội (Fosc/4) T1_EXTERNAL : xung clock ngoài trên chân RC0 T1_EXTERNAL_SYNC : xung clock ngoài đồng bộ T1_CLK_OUT T1_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 T1_DIV_BY_8 3.Timer2 Thanh ghi tác động: http://www.freewebtown.com/nhhao/PIC...i tac dong.GIF Các lệnh: Code:
setup_TIMER_2(mode, period, postscale); T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 period là số nguyên từ 0-255, xác định giá trị xung reset postscale là số nguyên 1-16, xác định reset bao nhiêu lần trước khi ngắt. |
Intterupt
INTERRUPT
Các lệnh dùng cho ngắt: Code:
enable_interrupts(level); //cho phép ngắt kiểu level GLOBAL : ngắt toàn cục INT_RTCC : tràn TMR0 INT_RB : có thay đổi trạng thái một trong các chân RB4 đến RB7 INT_EXT : ngắt ngoài INT_AD : chuyển đổi AD đã hoàn tất INT_TBE : bộ đệm chuyển RS232 trống INT_RDA : data nhận từ RS232 sẵn sàng INT_TIMER1 : tràn TMR1 INT_TIMER2 : tràn TMR2 INT_CCP1 : có capture hay compare trên CCP1 INT_CCP2 : có capture hay compare trên CCP2 INT_SSP : có hoạt động SPI hay I2C INT_PSP : có data vào cổng parallel slave INT_BUSCOL : xung đột bus INT_EEPROM : ghi vào eeprom hoàn tất INT_TIMER0 : tràn TMR0 INT_COMP : kiểm tra bằng nhau comparator edge bao gồm: L_TO_H : cạnh lên H_TO_L : cạnh xuống Sau khai báo trên để vào đoạn chương trình ngắt, khai báo: #INT_......... Ví dụ vào thực thi ngắt ngoài, ta có đoạn code: Code:
#INT_EXT |
Ngắt Timer0
1 Attachment(s)
Đây là chương trình dùng ngắt Timer0 định thì 1s.
Đầu tiên led ở chân RB0 sáng, sau 1s sẽ dịch sang trái, nghĩa là led 1 trên chân RB1 sáng , lần lượt như vậy cho các led trên portB và lặp lại mãi mãi. Code:
#include <16F877A.h> |
Trích:
Thời gian định trước này phụ thuộc vào tần số loại thạch anh sử dụng và bộ chia tần số trước (prescaler) của WDT. Ta thấy WDT chỉ liên quan đến Timer 0, còn các Timer khác không có liên quan. Đó là tại vì WDT có bộ chia tần số (prescaler) dùng chung với Timer 0. Lưu ý là muốn sử dụng WDT cần chú ý đến phần khai báo các "fuse" ở đầu chương trình. Trích:
Tác dụng định thời: Timer sẽ dựa vào các xung tạo ra bởi bộ dao động (thạch anh, dao động RC, ...) cung cấp cho vi điều khiển để đếm. Và dựa vào tần số bộ dao động, giá trị các bộ chia tần số và giá trị của Timer, ta có thể xác định được thời gian thực. Như vậy trong trường hợp muốn Timer hoạt động ở chế độ định thời, ta phải khai báo rtcc_state là "RTCC_INTERNAL" (xử dụng tần số dao động nội). Tác dụng đếm: Timer sẽ dựa vào các xung lấy từ môi trường bên ngoài để đếm. Tùy theo Timer mà ta sử dụng chân lấy xung tương ứng (Timer 0 là chân RA4, Timer1 là chân RC0). Các xung này có tác dụng phản ánh các hiện tượng trong thực tế, và việc đếm các xung cũng đồng nghĩa với việc đếm các hiện tượng đó. Và để linh động hơn trong quá trình xử lí, Timer còn cho phép chọn cạnh tác động lên bộ đếm (chế độ này chỉ có ở Timer 0). Như vậy muốn Timer hoạt động ở chế độ đếm, ta phải khai báo rtcc_state là một trong 2 trường hợp còn lại (sử dụng dao động ngoài). Trích:
Hàm "RTCC_DIV_..." : cho phép Timer 0 sử dụng bộ chia tần số, không cho phép WDT sử dụng và ấn định tỉ số chia của nó. Hàm "WDT_ ..." : cho phép WDT 0 sử dụng bộ chia tần số, không cho phép Timer 0 sử dụng và ấn định tỉ số chia của nó. Trích:
Timer 2 không hoạt động ở chế độ đếm. Chức năng của nó chủ yếu là tác động lên tốc độ baud cho MSSP thì phải. Không nhớ rõ lắm. Trích:
|
Ngắt ngoài
1 Attachment(s)
Chào cả nhà !
Sao không thấy bác nào post bài vào luồng này vậy kà !Trầm quá...!Trầm quá...!Hay cái CCS C này không hấp dẫn mọi người chăng! Không ai viết gì, tớ vẫn post cho nó đỡ trầm....! Đã ví dụ về ngắt Timer, sau đây là 2 ví dụ về ngắt ngoài trên chân RB0 và trên các chân RB4 đến RB7: Chương trình sau dùng ngắt ngoài trên RB0 đếm số lần cái button được nhấn xuống, hiển thị lên led 7 đoạn (common cathode).Nếu số lần nhấn vượt quá 9, chương trình sẽ quay về hiển thị lên led từ số 1. Code:
//***************************************************************************** |
Ngắt ngoài trên RB4-RB7
1 Attachment(s)
Còn đây là ứng dụng ngắt ngoài trên RB4 đến RB7 để thay đổi kiểu cũng như tốc độ chớp nháy mấy con led chỉ để....ngắm cho vui mắt !
Ấn sw1, led1 nhấp nháy với delay 250ms Ấn sw2, led1,2 nhấp nháy với delay 200ms Ấn sw3, led1,2,3 nhấp nháy với delay 150ms Ấn sw4, led1,2,3,4 nhấp nháy với delay 100ms Code:
//***************************************************************************** Ta có thể viết riêng 1 file.h loại này sao cho mình dễ nhớ nhất, đến khi muốn sử dụng chỉ cần khai báo #include<file.h> vào là xài thôi! http://www.freewebtown.com/nhhao/PIC...gngatngoai.gif |
Giải mã bàn phím
1 Attachment(s)
Mạch quét 16 phím, hiện kết quả lên led 7 đoạn.
Code:
//***************************************************************************** |
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000) Bạn chú ý, clock = 4MHz là chế đọ dao động XT chứ không phải HS. Chúc vui |
Một phương án khác:
#include <16F877A.h> #fuses HS, NOWDT, NOLVP, XT #use delay(clock=4000000) void main() { byte leds = 0xff; set_tris_b(0x00); // configure pins of PORTB as output while (true) { output_b(leds); leds = ~leds; // toggle leds delay_ms(1000); } } Trích:
|
Một cách viết khác để tham khảo:
#include <16F877A.h> #fuses HS, NOWDT, NOPROTECT, NOLVP #device 16F877*=16, ADC=8 #use delay(clock=4000000) void main() { setup_adc(adc_clock_internal); setup_adc_ports(ALL_ANALOG); set_adc_channel(0); // TM Board: VR3=0, VR2=1, VR1=2 delay_ms(10); while (true) output_b(read_adc()); } [QUOTE=nhh]Đây là 1 ví dụ nhỏ về ADC,chân RA0 lấy tín hiệu Analog từ biến trở và xuất giá trị số biến đổi tương ứng qua tám led nối ở portB Code:
#include <16F877.h> |
xin lỗi các huynh cho tiểu đẹ hỏi 1 câu ngu dốt...các huynh có tài liệu asem về pic không?cho em 1 bản
rất cám ơn idiot0910@yahoo.com |
Một cách viết khác để tham khảo với hy vọng viết C sao cho dễ hiểu :-)
#include <16F877A.h> #fuses NOWDT, PUT, XT, NOPROTECT #use delay(clock=4000000) #define INITIAL_VALUE 6 byte count; byte led; void change_led(void); #int_timer0 void interrupt_timer0() { set_timer0(INITIAL_VALUE); count++; if (count == 2000) { count = 0; change_led(); } } void main() { set_tris_b(0); enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER0); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2); // set mod set_timer0(INITIAL_VALUE); // set initial value count = 0; led = 1; while (true) output_b(led); } void change_led() { led = led << 1; if (led == 0) led = 1; } Trích:
|
Trích:
Nếu bạn cần tài liệu về hợp ngữ cho PIC16 thì download tài liệu này: http://ww1.microchip.com/downloads/e...Doc/33014J.pdf Thân, |
Sử dụng CCS cho việc lập trình PIC là rất hay và tiện lợi.Truoc day ban noisepic có đề cập cách lập trình cho ccs khá hay. Ta sẽ khai báo thêm một file định nghĩa các thanh ghi của pic kiểu như :
#byte PORTA =0x05 #byte PORTB =0x06 #byte PORTC =0x07 #byte PORTD =0x08 #byte PORTE =0x09 ... #byte EEDATA =0x10C #byte EEADR =0x10D #byte EEDATH =0x10E #byte EEADRH =0x10F #byte ADCON0 =0x1F #byte ADCON1 =0x9F #byte ADRESH =0x9F #byte ADSESL =0x9F sau đó ta có thể sử dụng lệnh gán PortB = 0x00 để xuất sẽ tiện hơn nhiều. Mình lập trình cho CCS đều dùng kiểu này. Khi đó ta sẽ vừa tận dụng được các hàm có sẵn của CCS vừa thao tác trực tiếp các thanh ghi như bên ASM. Mình có viết một cái TUT về CCS này và đã gửi cho a F. Hy vọng sẽ sớm pót lên cho mọi người tham khảo. Chúc thành công với CCS |
1. Tổng quan về CCS
1.1. Vì sao ta sử dung CCS ? Sự ra đời của một loại vi điều khiển đi kèm với việc phát triển phần mềm ứng dụng cho việc lập trình cho con vi điều khiển đó. Vi điều khiển chỉ hiểu và làm việc với hai con số 0 và 1. Ban đầu để việc lập trình cho VĐK là làm việc với dãy các con số 0 và 1. Sau này khi kiến trúc của Vi điều khiển ngày càng phức tạp, số luợng thanh ghi lệnh nhiều lên, việc lập trình với dãy các số 0 và 1 không còn phù hợp nữa, đòi hỏi ra đời một ngôn ngữ mới thay thế. Và ngôn ngữ lập trình Assembly. Ở đây ta không nói nhiều đến Assmebly. Sau này khi ngôn ngữ C ra đời, nhu cầu dùng ngôn ngữ C đề thay cho ASM trong việc mô tả các lệnh lập trình cho Vi điều khiển một cách ngắn gọn và dễ hiểu hơn đã dẫn đến sự ra đời của nhiều chương trình soạn thảo và biên dịch C cho Vi điều khiển : Keil C, HT-PIC, MikroC, CCS… Tôi chọn CCS cho bài giới thiệu này vì CCS là một công cụ lập trình C mạnh cho Vi điều khiển PIC. Những ưu và nhược điểm của CCS sẽ được đề cập đến trong các phần dưới đây. 1.2. Giới thiệu về CCS ? CCS là trình biên dịch lập trình ngôn ngữ C cho Vi điều khiển PIC của hãng Microchip. Chương trình là sự tích hợp của 3 trình biên dich riêng biết cho 3 dòng PIC khác nhau đó là: - PCB cho dòng PIC 12-bit opcodes - PCM cho dòng PIC 14-bit opcodes - PCH cho dòng PIC 16 và 18-bit Tất cả 3 trình biên dich này đuợc tích hợp lại vào trong một chương trình bao gồm cả trình soạn thảo và biên dịch là CCS, phiên bản mới nhất là PCWH Compiler Ver 3.227 Giống như nhiều trình biên dich C khác cho PIC, CCS giúp cho người sử dụng nắm bắt nhanh được vi điều khiển PIC và sử dụng PIC trong các dự án. Các chương trình diều khiển sẽ được thực hiện nhanh chóng và đạt hiệu quả cao thông qua việc sử dụng ngôn ngữ lạp trình cấp cao – Ngôn ngữ C Tài liệu hướng dẫn sử dụng có rất nhiều, nhưng chi tiết nhất chính là bản Help đi kèm theo phần mềm (tài liệu Tiếng Anh). Trong bản trợ giúp nhà sản xuất đã mô tả rất nhiều về hằng, biến, chỉ thị tiền xủa lý, cấu trúc các câu lệnh trong chương trình, các hàm tạo sẵn cho người sử dụng… Ngoài ra về Tiếng Việt cũng có bản dịch của tác giả Trần Xuân Trường, SV K2001 DH BK HCM. Tài liệu này dịch trên cơ sở bản Help của CCS, tuy rằng chưa đầy đủ nhưng đây là một tài liệu hay, nếu bạn tìm hiểu về PIC và CCS thì nên tìm tài liệu này về đọc. Địa chỉ Download tài liệu: www.picvietnam.com -> Mục nói về CCS. |
3. Một số ví dụ cho lập trình CCS
Với mục tiêu giúp người đọc nhanh chóng lắm bắt được cách lập trình C cho PIC thông qua chương trình dịch CCS. Dưới đây tôi giới thiệu một vài bài lập trình đơn giản cho PIC, các bài mẫu này dựa theo tài liệu tutorial của Nigel như quét LED, LED 7 thanh, LCD, bàn phím…, cách dùng các giao tiếp của PIC để giao tiếp với thiết bị ngoại vi như Real Time IC, ADC, EEPROM… · Yêu cầu về phần cứng tối thiểu cần có để thực hành: - PIC16F877A ( hoặc 16F876A hay 16F88) = 50K (Tốt nhất là PIC16F877A) - 1 Board cắm linh kiện (tối thiểu ) = 40K - Thạch anh 20MHz, tụ 22pF, 10uF, trở 10K, 4K7, 330Ω, nút bấm = 10K - 10 LED đơn xanh hay đỏ, 4 LED 7 thanh (loại 4 LED liền một đế ) = 15K - MAX232 để giao tiếp máy tính () = 10K Tổng cộng là: 125K · Phần cứng mở rộng - LCD 1602A loại 2 dòng 16 ký tự (Nếu có LCD 2002 càng tốt) = 65K (Minh Hà có bán) - Real Time IC DS1307 hay DS1337 = 25K (có thể xin sample của Maxim-IC) - EEPROM AT24Cxx - ADC/DAC IC loại 12-bit trở nên (ADC 10-bit thì PIC cũng có) - Sensor nhiêt LM335 hay LM35 = 13K - Động cơ bước, động cơ một chiều Mục đích chính của tôi trong việc giới thiệu các ví dụ dưới đây là nhằm giúp mọi người nhanh chóng nắm được kỹ thuật lập trình bằng CCS, thông qua các ví dụ mọi người sẽ hiểu các hàm của CCS, cách sử dụng trong từng ứng dụng cụ thể. Về chi tiết của mỗi hàm tôi sẽ không trình bày kỹ tại đây, để biết rõ ta có thể xem trong phần Trợ giúp của CCS hay tài liệu của tác giả Trần Xuân Trường, trong đó đã nói khá đầy đủ. Tôi nhấn mạnh một điều khi mọi người tìm hiểu về PIC và CCS đó là hãy tự mình tìm hiểu là chính, từ việc nghiên cứu tài liệu, tìm tài liệu cho đền thiết kế mạch và viết chương trình. Những gì tại đây chỉ là cơ bản, còn việc phát triển, sử dụng hết điểm mạnh của PIC và CCS là ở phía mọi người. Chúc thành công! Một điều chú ý là tất cả các mạch điện và code tôi trình bày dưới đây tôi đều đã lắp mạch thật trên bo cắm và chạy tốt. |
3. Một số ví dụ cho lập trình CCS
Với mục tiêu giúp người đọc nhanh chóng lắm bắt được cách lập trình C cho PIC thông qua chương trình dịch CCS. Dưới đây tôi giới thiệu một vài bài lập trình đơn giản cho PIC, các bài mẫu này dựa theo tài liệu tutorial của Nigel như quét LED, LED 7 thanh, LCD, bàn phím…, cách dùng các giao tiếp của PIC để giao tiếp với thiết bị ngoại vi như Real Time IC, ADC, EEPROM… · Yêu cầu về phần cứng tối thiểu cần có để thực hành: - PIC16F877A ( hoặc 16F876A hay 16F88) = 50K (Tốt nhất là PIC16F877A) - 1 Board cắm linh kiện (tối thiểu ) = 40K - Thạch anh 20MHz, tụ 22pF, 10uF, trở 10K, 4K7, 330Ω, nút bấm = 10K - 10 LED đơn xanh hay đỏ, 4 LED 7 thanh (loại 4 LED liền một đế ) = 15K - MAX232 để giao tiếp máy tính () = 10K Tổng cộng là: 125K · Phần cứng mở rộng - LCD 1602A loại 2 dòng 16 ký tự (Nếu có LCD 2002 càng tốt) = 65K (Minh Hà có bán) - Real Time IC DS1307 hay DS1337 = 25K (có thể xin sample của Maxim-IC) - EEPROM AT24Cxx - ADC/DAC IC loại 12-bit trở nên (ADC 10-bit thì PIC cũng có) - Sensor nhiêt LM335 hay LM35 = 13K - Động cơ bước, động cơ một chiều Mục đích chính của tôi trong việc giới thiệu các ví dụ dưới đây là nhằm giúp mọi người nhanh chóng nắm được kỹ thuật lập trình bằng CCS, thông qua các ví dụ mọi người sẽ hiểu các hàm của CCS, cách sử dụng trong từng ứng dụng cụ thể. Về chi tiết của mỗi hàm tôi sẽ không trình bày kỹ tại đây, để biết rõ ta có thể xem trong phần Trợ giúp của CCS hay tài liệu của tác giả Trần Xuân Trường, trong đó đã nói khá đầy đủ. Tôi nhấn mạnh một điều khi mọi người tìm hiểu về PIC và CCS đó là hãy tự mình tìm hiểu là chính, từ việc nghiên cứu tài liệu, tìm tài liệu cho đền thiết kế mạch và viết chương trình. Những gì tại đây chỉ là cơ bản, còn việc phát triển, sử dụng hết điểm mạnh của PIC và CCS là ở phía mọi người. Chúc thành công! Một điều chú ý là tất cả các mạch điện và code tôi trình bày dưới đây tôi đều đã lắp mạch thật trên bo cắm và chạy tốt. |
Trích từ báo cáo về CCS.
|
2 Attachment(s)
Đúng là mọi người không chịu vào hết các trang mà mình quan tâm, địa chỉ các thanh ghi cũng như các thứ khác các bạn lấy ở đây.
|
Mình xem qua các chương trình cậu viết ở trên đều không sai nhưng chưa tối ưu, các cậu cứ xem phần chương trình bên asm thì rõ, vấn đề này cũng đã được thảo luận rất nhiều rồi mà. Các file mình đưa ra xẽ giúp chúng ta hỗ trợ thêm cách lập trình bằng C, và đến một lúc nào đó nếu các bạn đã thông tư tưởng của mình thì, lúc đấy viết trên HTpic hay CCs đều không khác nhau.
|
Gửi nhh:
Bài : Giải mã bàn phím Mạch quét 16 phím, hiện kết quả lên led 7 đoạn. Trong chuong trinh thieu dinh nghia #byte intcon=0x000B và port xuất ra led 7 đoạn là PORTC không phải portd như hình vẽ. |
To vnt3140
Đúng là trong đó hình vẽ và chương trình có nhầm portc và portd, do khi chạy proteus và mạch thật thiết lập port ok nhưng khi vẽ ORCAD bị nhầm. Các bạn chỉ thay đổi chút xíu thôi mà! Còn chưa định nghĩa byte intcon, sao bạn chỉ phát hiện ra nó, còn các bít RBx nữa thì sao.....Nhưng tất cả đã được định nghĩa trong file defs_16F877A.h.Mình nhớ đã gởi file này lên rồi nhưng bây giờ tìm lại không thấy đâu cả.Pó tay luôn ! Dạo này sao lú lẫn quá!Mình sẽ gởi lên sau! :D |
Trích:
Bác nên khai báo biến i là biến toàn cục thì mới có khả năng đếm số lần ngắt. Chúc khỏe. hpecom. |
Trích:
Chúc sức khỏe. hpecom. |
minh dang lam ve de tai dieu khien ma tran led
da co ai nghien cuu ve van de nay chua neu co tai lieu thi gui cho minh voi cam on nhe |
1 Attachment(s)
Trích:
Để cho việc viết chương trình được thuận lợi hơn, những lần sau nên include cái file DEFS_16F877A.h vào để không phải khai báo dài dòng nữa ! |
Chương trình gửi ký tự ra 2x16 LCD dùng CCS C
Chương trình gửi ký tự ra 2x16 LCD dùng CCS C
#include "16F877A.h" // PIC16F877A header file #use delay(clock=4000000) // for 4Mhz crystal #fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode #define WRITE_DATA 0 #define WRITE_COMMAND 1 #define NCHAR_PER_LINE 16 // max char numbers per line #define MS10 10 // 10 milliseconds #define US400 400 // 400 microseconds #define LCD_RS PIN_A1 #define LCD_RW PIN_A2 #define LCD_E PIN_A3 /////////////////////////////////////////////////////////// // /* private */ void lcd_write(byte dat, int1 option) { delay_us(US400); if (option == WRITE_DATA) output_high(LCD_RS); else // option == WRITE_COMMAND output_low(LCD_RS); output_low(LCD_RW); output_b(dat); output_high(LCD_E); delay_us(US400); output_low(LCD_E); } /////////////////////////////////////////////////////////// // void lcd_init(void) { output_low(LCD_E); // Let LCD E line low lcd_write(0x38, WRITE_COMMAND); // Set LCD 16x2, 5x7, 8bits data delay_ms(15); lcd_write(0x01, WRITE_COMMAND); // Clear LCD display delay_ms(MS10); lcd_write(0x0f, WRITE_COMMAND); // Open display & current delay_ms(MS10); lcd_write(0x06, WRITE_COMMAND); // Window fixed (Character Entry Mode?) delay_ms(MS10); } /////////////////////////////////////////////////////////// // void lcd_display_char(int8 line, int8 pos, char ch) { line = (line == 0) ? 0 : 1; pos = (pos > NCHAR_PER_LINE) ? NCHAR_PER_LINE : pos; lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND); lcd_write(ch, WRITE_DATA); } /////////////////////////////////////////////////////////// void lcd_display_str(int8 line, char str[], int8 nchars) { int8 i; for (i = 0; i < nchars; i++) lcd_display_char(line, i, str[i]); } /////////////////////////////////////////////////////////// /** * Display characters to a 2x16 LCD * * (1) LCD1 to GND * (2) LCD2 to VDD 5 volts * (3) LCD4 (RS) - LCD5 (RW) - LCD6 (E) to A1, A2, A3 * (4) LCD7-LCD14 to B0-B7 (bus data) * * Ref: http://pic16.com/bbs/dispbbs.asp?boa...ID=5879&page=1 */ void main(void) { int8 i; char LINE1[] = { "SGN Tech" }; char LINE2[] = { "Xin chao" }; lcd_init(); // use of lcd_display_char() for (i = 0; i < 8; i++) lcd_display_char(0, i, LINE1[i]); // use of lcd_display_str lcd_display_str(1, LINE2, 8); } |
Re: Chương trình gửi ký tự ra 2x16 LCD dùng CCS C
CCS C có một ví dụ hay hơn: Chỉ cần dùng 4 bits D4-D7 của LCD:
Examples\EX_LCDKB.C Trích:
|
Múi giờ GMT. Hiện tại là 07:40 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam