![]() |
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á |
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. |
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ì
|
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 |
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 |
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...
|
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!
|
đú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
|
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 :D) |
#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 |
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> |
1 Attachment(s)
file mô phỏng:
|
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
|
Múi giờ GMT. Hiện tại là 02:56 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