|
Tài trợ cho PIC Vietnam |
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 |
|
Ðiều Chỉnh | Xếp Bài |
25-10-2010, 01:28 PM | #1 |
Đệ tử 2 túi
Tham gia ngày: Aug 2010
Bài gửi: 27
: |
Giúp mình bài tập này với!!!
Mình vừa mới làm quen với PIC đang bị bí chỗ này.
mình dùng 1 chân RB1 làm nút nhấn. Khi bấm 10 lần RB1 thì led gắn ở chân RD1 sáng lên 1 lần. Chỉ đơn giản như thế thôi. Nhưng mà do gà quá. Các pác giúp dùm e nhá |
26-10-2010, 12:08 AM | #2 |
Nhập môn đệ tử
Tham gia ngày: Oct 2009
Bài gửi: 1
: |
Trả lời
Bài này khá đơn giản. Mình viết bằng ngôn ngữ ASSEMBLY, mình thực hành trên BOARD PICDEM 2+ 2006 (microchip) . Bạn có thể mô phỏng bằng PROTEUS để thấy trực quan hơn.
Cần chú ý các thanh ghi của mình, mình chọn nút nhấn RA4, LED đơn gắn ở chân RB0 (chip P18f4520), delay 1s , led sáng 1s rồi sẽ tắt. p=18f4520 #include p18f4520.inc udata a res 1 b res 1 c res 1 d res 1 org 0000h goto start start call init dem10 call an10 decfsz a goto dem10 bsf PORTB,0 call delay1s bcf PORTB,0 return an10 btfsc PORTA,4 ;kiem tra bam nut goto an10 tha10 btfss PORTA,4 goto tha10 return delay1s movlw .4 movwf b delay1s_1 movlw .250 movwf c delay call delayX decfsz c goto delay decfsz b goto delay1s_1 return delayX nop decfsz d goto delayX return init movlw .10 movwf a ;chon portb lam port xuat clrf PORTB bcf TRISB,0 ;chon porta lam input clrf PORTA bsf TRISA,4 bsf PORTA,4 return end Mong bạn cho ý kiến thêm. Chúc vui. |
26-10-2010, 05:53 PM | #3 |
Đệ tử 2 túi
Tham gia ngày: Aug 2010
Bài gửi: 27
: |
hì. cám ơn bạn nhiều. bạn có chương trình C không. mình không học ASM nên đọc không hỉu lắm...hì
|
26-10-2010, 06:02 PM | #4 |
Đệ tử 2 túi
Tham gia ngày: Aug 2010
Bài gửi: 27
: |
mình định xây dụng 1 hàm quét phím theo kiểu int8
INT8 QUETPHIM0123() { Z = 0 ; WHILE(BIT_TEST(INPUT_B(),Z)) { Z++ ; IF(Z == 2) Z = 0 ;//cái này là để xác định chỉ quét 2 nút nhấn RB0,RB1 } WHILE(!BIT_TEST(INPUT_B(),Z)) { } RETURN Z ; } nếu như trong trường hợp bấm nút nào thì nhảy sang chương trình đó. trong đó RB0 là chương trình bấm 10 lần. nhưng cách viết để đếm chân RB0 lên 10 lần mình không làm đc. Bạn nào cao thủ giúp mình nha |
27-10-2010, 12:22 AM | #5 | |
Đệ tử 5 túi
Tham gia ngày: Jan 2009
Bài gửi: 100
: |
Trích:
Giả sử phím bấm của bạn nối điện trở treo pull-up, khi đó nếu không bấm thì mức logic tại B1 là 1, nếu bấm thì mức logic tại B1 là 1, đoạn code tăng biến đếm như sau : Code:
int i = 0; // Biến i sẽ là biến đếm while(1){ if(input(PIN_B1) == 0) while(input(PIN_B1) == 0); // Đợi cho người dùng nhả phím bấm i++; if(i == 10) output_high(PIN_D1); } ............ |
|
27-10-2010, 01:17 AM | #6 |
Nhập môn đệ tử
|
nếu nut nhấn trên chân RB4-RB7,ngoài cách dùng q0et bit ngõ vào ta có thế dùng ngắt,chuớng trình phục vụ ngắt chỉ làm việc đơn giản là thực hiện i++ nếu i = = 10 thì bật led tương ứng 1s...
|
27-10-2010, 01:53 AM | #7 |
Đệ tử 4 túi
|
cái này theo mình là phải dùng ngắt ngoài thì mới chương trình chính xác!
__________________
My blog: http://autumnneverreturn.blogspot.com/ Đối thủ khó chiến thắng nhất là bản thân !!! |
28-10-2010, 03:51 PM | #8 |
Đệ tử 2 túi
Tham gia ngày: Aug 2010
Bài gửi: 27
: |
đúng vậy...phải dùng ngắt ngoài..mình đã thử code và thấy nó chạy loạn lên hết.lúc thì bấm đến 9 đã nhảy.lúc bấm đến 2 đã nhảy. mình dùng Easy KIT
|
28-10-2010, 09:16 PM | #9 |
Đệ tử 5 túi
Tham gia ngày: Jan 2009
Bài gửi: 100
: |
Cái việc nó nhảy loạn là do thuật toán chưa tốt, bạn tìm hiểu thêm về các phương pháp chống rung bàn phím nhé.
Mình vẫn bắt phím theo cách trên, chạy ngon lành, ko có vấn đề gì cả (phím bấm của mình chống rung bằng phần cứng rồi ) |
29-10-2010, 04:56 PM | #10 |
Đệ tử 2 túi
Tham gia ngày: Aug 2010
Bài gửi: 27
: |
#include <16F877A.h>
#include <def_877a.h> #device adc=8 #FUSES NOWDT, HS, PUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) //#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8) #use fast_io(b) int8 i=0; void densang(); void reset(); #int_rb void ngatngoai() { if ((RBIF)&&(RBIE)) { if(RB0==0) {//while(RB0==0); i++; if(i==10) { i=0; densang(); } } if(RB1==0) { reset(); } } } void main() { set_tris_b(0); set_tris_d(0xff); enable_interrupts(int_rb); enable_interrupts(global); ext_int_edge(H_to_L); while(true) { } } void densang() { output_high(PIN_D0); } void reset() { i=0; output_low(pin_d0); } đây là code e mới viết. các cao thủ xem jup e xem có sai sót j k nhá!!!e cám ơn thay đổi nội dung bởi: akatsu, 29-10-2010 lúc 05:01 PM. Lý do: copy thiếu.xin lỗi |
30-10-2010, 10:06 PM | #11 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
set_tris_b(0);//các chân portb là chân xuất dữ liệu.(nên phím không có tác dụng) set_tris_d(0xff);//các chân portd là chân nhập dữ liệu. sửa bài này như sau: Code:
#include <16F877A.h> #include <def_877a.h> #device adc=8 #FUSES NOWDT, HS, PUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) //#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #use fast_io(b) int8 i=0; void densang(); void reset(); #int_rb void ngatngoai() { if((RBIF)&&(RBIE)) { if(RB4==0) { delay_ms(10);//chong rung phim if(RB4==0) { i++; if(i==10) { i=0; densang(); } while (RB4==0)//chờ phím nhả { } delay_ms(10);//chong rung phim } } //******************************* else if(RB5==0) { delay_ms(10);//chong rung phim if(RB5==0) { reset(); while (RB5==0)//chờ nhả phím { } delay_ms(10);//chong rung phim } } } void main() { set_tris_b(0xf0);//rb4...rb7 là pin nhập set_tris_d(0xfe);//pinD0 là pin xuất dữ liệu enable_interrupts(int_rb); enable_interrupts(global); ext_int_edge(H_to_L); reset(); while(true) { } } void densang() { output_high(PIN_D0); } void reset() { i=0; output_low(pin_d0); }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. thay đổi nội dung bởi: tdm, 30-10-2010 lúc 10:26 PM. |
|
30-10-2010, 10:38 PM | #12 |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
file mô phỏng:
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
31-10-2010, 11:44 AM | #13 |
Đệ tử 2 túi
Tham gia ngày: Aug 2010
Bài gửi: 27
: |
mình cám ơn..mình đã viết theo cách mới nghĩ ra và mạch chạy thấy cũng ok rùi..hihi.cám ơn bạn tmd nhiều nha...bạn có mail k?cho mình xin đi.có gì mình cùng trao đổi.hi
|
|
|