![]() |
|
![]() |
#1 |
Đệ tử 2 túi
|
Cám ơn bác hpecom, cháu hoc lớp chồi THPT (sinh năm 1988 mà lị) :-), hết lớn rồi, ăn nhiều cũng không lớn nổi.
Các bác cho cháu hỏi cau này về CCS: trong hầu hết các ví dụ của CCS C, họ đều dùng printf (RS232) để xuất dữ liệu. Cháu không hiểu làm như thể để làm gì. Cháu cũng không biết vẽ mạch thế nào để xuất hiện các dòng chữ trong printf. Cám ơn các bác... |
![]() |
![]() |
#2 |
Đệ tử 1 túi
Tham gia ngày: Mar 2006
Bài gửi: 22
: |
Tỗi sẽ thử CCS này xem sao. Thú thực tôi cũng có dùng qua nó, với Mikro C, với HTPIC, thì thấy khả năng tối ưu mã của nó không tốt lắm nên không thích thôi nhưng thấy mọi người khen nhiều quá tôi phải xem lại. Tôi thấy Mikro rất tốt, chuyên nghiệp nhanh nhẹn và có nhiều hỗi trợ, dễ sử dụng.
|
![]() |
![]() |
#3 |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 2
: |
Tôi chạy thử bài LCDFirst của bác nhh rồi, bác kiếm con LCD HD4470 (16_X_2) màu vàng này ở đâu thế(Nó không có trong thư viện của Proteus). Tôi ghép song song với LCD LM016L (trong TV Proteus) mà cái hiện, cái không.
Sao không gửi hình JPG được nhỉ. tôi sẽ gửi cho bác nhh dể bác gửi lên vậy. thay đổi nội dung bởi: heliman, 01-08-2006 lúc 10:03 AM. |
![]() |
![]() |
#4 | |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 2
: |
Bác nhh ơi , bác ghi tiêu đề là "dùng 4 bít LCD dữ liệu", nhưng bác lại gửi nhầm file " lcd_pvn.rar" lên . File này đã được gửi trước đó, nhưng là file "dùng 8 bit dữ liệu" .
Bác gửi file rar đó (4 bit dl , sơ đồ + code) lên cho anh em cùng tham khảo. Trích:
|
|
![]() |
![]() |
#5 |
Đệ tử 5 túi
Tham gia ngày: Oct 2005
Bài gửi: 117
: |
Lập trình CCS cho PIC6F877A tôi đã pót khá nhiều bài lập trình bên đien tử VN rồi:
http://dientuvietnam.net/forums/showthread.php?t=1008 Bạn nào quan tâm thjif qua đó down về, có đủ cả code và mạch. Chúc thành công!
__________________
CallerID, Ethernet-RS232, PICWEB, Cảnh báo BTS Giải pháp toàn diện giám sát - điều khiển từ xa qua GSM/Internet 0988006696 http://linhnc308.blogspot.com linhnc308@gmail.com |
![]() |
![]() |
#6 |
Đệ tử 2 túi
Tham gia ngày: Nov 2005
Bài gửi: 45
: |
Hàm printf() xuất một chuỗi ra cổng nối tiếp.
Nếu kết nối PIC với máy tính bằng RS232 và cấu hình thích hợp cho cổng thì máy tính sẽ nhận được chuỗi mà bé đặt trong dấu (). Vẽ mạch thì bé vẽ theo các mạch giao tiếp máy tính mà các chú đã vẽ trên diễn đàn: Chỉ cần 3 sợi dây Rx (receive), Tx (Transfer) và chân Gnd. Cần có con đệm Max232 nằm ở giữa. Nghĩa là PIC - Max232 - PC. Nhưng tại sao bé không làm các bài tập đơn giản trước như điều khiển LED chớp tắt, hiển thị số trên LED 7 đoạn hay điều khiển nhiều đèn LED chớp theo nhiều kiểu, .. mà lại làm giao tiếp máy tính cho khó khăn vậy? Dù sao hpecom cũng chúc bé thành công và đừng để ảnh hưởng đến việc học! hpecom.
__________________
Biết thì nói là biết, Không biết thì nói là không biết, .. |
![]() |
![]() |
#7 |
Đệ tử 2 túi
|
Cám ơn sư huynh đã quan tâm :-)
Bé đã tập viết bằng ASM, điều khiển LED, Interupt... rồi. Hôm nay mới chuyến sang CCS C. Theo lời huynh nói thì mọi ví dụ trong CCS C phải được nối với PC mới có thể xem kết quả được. Cám ơn rất nhiều. |
![]() |
![]() |
#8 |
Đệ tử 2 túi
Tham gia ngày: Nov 2005
Bài gửi: 45
: |
Công nhận bé này mau lớn thật! Mới hôm qua gọi bác hôm này đã gọi là huynh, không biết ngày mai là cái gì?
![]() Không phải mọi ví dụ mà chương trình nào có lệnh printf() thì cần máy tính nếu đệ muốn xem kết quả của lệnh. Chúc đệ thành công.
__________________
Biết thì nói là biết, Không biết thì nói là không biết, .. |
![]() |
![]() |
#9 |
Đệ tử 2 túi
|
Cám ơn, cám ơn.
Chatchit một chút: hôm qua mới để tử mởi nhập môn, gọi là bác; hôm nay, thành đệ tử một túi rồi nên gọi là huynh. b |
![]() |
![]() |
#10 |
Đệ tử 2 túi
Tham gia ngày: Nov 2005
Bài gửi: 45
: |
Chào boys!
* set_timer0(6); đây là phương thức gọi hàm. set_timer0() là một hàm, 6 là tham số. Còn hàm này làm gì thì bạn phải tự tìm hiểu lấy. * ++count; là thực hiện tăng biến count lên 1 đơn vị. Nó giống lệnh count=count+1. Còn có một cú pháp nhữa là count++. Hai lệnh lệnh này có sự khác nhau về thứ tự thực hiện khi nằm trong một biểu thức so sánh. * if(count==2000) là phép so sánh. Nếu giá trị của biến count bằng 2000 thì kết quả của phép so sánh là True ngược lại là False. * a là .. mình chịu thua!?!? ![]() Bạn nên tìm một cuốn sách lập trình C của Quách Tuấn Ngọc để hiểu về những điều này. Chúc bạn thành công. hpecom.
__________________
Biết thì nói là biết, Không biết thì nói là không biết, .. |
![]() |
![]() |
#11 |
Đệ tử 2 túi
Tham gia ngày: Feb 2006
Bài gửi: 32
: |
CCS for pic6F877A
cảm ơn anh hpecom đã chỉ giáo
![]() |
![]() |
![]() |
#12 |
Đệ tử 2 túi
Tham gia ngày: Feb 2006
Bài gửi: 32
: |
CCS C for PIC16F877A
Nhân tiện anh cho em hỏi thêm : giả sử em viết một ct nháy led (cho nó chạy như vòng lặp ), đầu tiên kt các khóa để biết ct sẽ nháy led kiểu nào. sau đó thì ct sẽ thực hiện lệnh nháy đèn led, nếu như sau khi ta bấm nút chọn kiểu nháy, ct sẽ tiếp tục thực hiện lệnh tiếp theo mà ta đổi ý bấm nút khác để đổi kiểu thì ct sẽ không nhận vì đang thực hiện các lệnh bật-tắt led. Bài tập này hình như có ở trang 2, 3 dùng interrup và timer0, Tại sao nhỉ ?
|
![]() |
![]() |
#13 |
Đệ tử 2 túi
Tham gia ngày: Nov 2005
Bài gửi: 45
: |
Nếu bạn sử dụng vòng lặp thì nút bấm sẽ ko được nhận trong khi vòng lặp đang thực hiện. Cách giải quyết bài toán như sau:
_ Bạn hãy khai báo 1 biến toàn cục. Biến này lưu kiểu chớp. Hàm chớp sẽ dựa vào giá trị biến này mà đổi kiểu chớp. _ Sử dụng timer0 làm thời gian chuẩn để trì hoãn chớp tắt (vì nếu dùng làm thời gian trì hoãn chớp tắt thì nó quá ngắn ta không thể thấy chớp được). _ Khai báo một biến toàn cục làm hệ số cho thời gian trì hoãn. Trong ngắt Timer0 bạn sẽ đếm biến này đến một giá trị nào đó thì gọi hàm chớp tắt. _ Bạn cũng cần khai báo một biến toàn cục để cho hàm chớp tắt biết mình phải làm gì. Hoặc nếu ko bạn có thể truyền tham số cho hàm. _ Trong chương trình main, bạn dùng vòng lặp để bắt phím nhấn (hoặc dùng ngắt) và thực hiện thay đổi giá trị của biến kiểu chớp. Trên đây là giải thuật, đó là phương pháp để giải quyết bài toán. Tất nhiên trong quá trình viết bạn có thể khai báo thêm các biến toàn cục hay cục bộ để thực hiện thuật toán. Tốt nhất là bạn nên viết trước và gặp khó khăn thì đưa cả code lên để mọi người giúp bạn giải quyết. Đây là một bài toán khá hay, mong rằng bạn sẽ thành công. hpecom.
__________________
Biết thì nói là biết, Không biết thì nói là không biết, .. |
![]() |
![]() |
#14 |
Đệ tử 2 túi
Tham gia ngày: Feb 2006
Bài gửi: 32
: |
CCS C for PIC16F877A
Em mượn tạm đoạn code của nhh anh mổ xẻ nó giùm em nhé
//************************************************** ** // Author : nhh // Date : 02/04/06 // Hardware: PIC16F877A //************************************************** ** #include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #use fast_io(b) #byte portb=0x06 #define led pin_B0 int16 count; int8 a; //Chuong trinh ngat TMR0 #int_timer0 void interrupt_timer0() { set_timer0(6); ++count; if(count==2000) { count=0; a=a<<1; // dich trai a 1bit ![]() } if(a==256) { a=1; count=0; } } //Chuong trinh chinh main() { set_tris_b(0); enable_interrupts(global); enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); ![]() set_timer0(6); count=0; a=1; while(true) { portb=a; ![]() } } Anh giải thích mấy cỗ có ![]() |
![]() |
![]() |
#15 | |
Đệ tử 2 túi
Tham gia ngày: Nov 2005
Bài gửi: 45
: |
Trích:
![]() [CODE:] a=a<<1; // dich trai a 1bit [/CODE] Như tác giả đã chú thích đó là lệnh dịch trái 1 bit. VD: trước khi dịch, a có giá trị 0 0 0 0 0 0 0 1 (0x01) thì sau lệnh dịch này giá trị biến a sẽ là 0 0 0 0 0 0 1 0 (0x02). Vậy lệnh dịch trái sẽ làm tăng giá trị biến bị dịch lên 2 lần: 2 thành 4. Giống như bạn dịch trong hệ thập phân số 0500 thì được 5000 tức tăng 10 lần. Hệ nhị phân (2 số) dịch trái 1 bit sẽ tăng giá trị 2 lần, hệ thập phân (10 số) dịch trái một bit, số sẽ tăng giá trị 10 lần. Vậy nhiều lệnh dịch sẽ làm cho a thay đổi như sau 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 * Dấu ![]() [CODE:] setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); [/CODE] mode may be one or two of the constants defined in the devices .h file. RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256 Bạn hãy đọc Help và các ví dụ của nó thì bạn sẽ hiểu được cách tính. Bạn hãy tìm hiều kỹ về bộ chia tần trong DataSheet của chip sẽ hiểu tại sao chỉ làm 2 mũ n. * Dấu ![]() [CODE:] portb=a; [/CODE] Đây là lệnh xuất giá trị biến a ra PortB. a có 8 bit, PortB có 8 chân B7 đến B0. Lệnh trên sẽ áp các bit của a vào PortB theo đúng trọng số. Chúc bạn thành công. (và lần sau hỏi dễ xíu ![]() hpecom.
__________________
Biết thì nói là biết, Không biết thì nói là không biết, .. thay đổi nội dung bởi: hpecom, 22-08-2006 lúc 09:00 AM. |
|
![]() |
![]() |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
TUT về USART trong PIC16F877A | mafd_47a | MPASM | 16 | 19-02-2025 05:32 AM |
TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 28 | 28-01-2025 10:45 PM |
Lập nhóm PIC16F877A | nhh | Cơ bản về vi điều khiển và PIC | 285 | 08-03-2017 11:08 PM |
Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
Pic16f877a TỪ DỄ TỚi KhÓ | ntc | Cơ bản về vi điều khiển và PIC | 373 | 23-05-2009 10:24 PM |