01-09-2007, 05:02 PM | #11 |
Đệ tử 2 túi
Tham gia ngày: Jun 2007
Bài gửi: 43
: |
Mình thật sự cảm ơn bạn thaithienthanh rất nhiều về vấn đề này.Mình đã làm lại và chạy ngon lành.Nhưng để thực tế hơn mình đã làm một cái keypadcalulate thay cho mấy cái button .Mạch như sau:
Code:#include <16F877A.h> #include <DEFS_16F877A.h> #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #define RS RD0 #define RW RD1 #define E RD2 #define LCD PORTC /*Ham yeu cau goi lenh dieu khien LCD*/ void comnwrt(void) { RS = 0; RW = 0; E = 1; E = 0; delay_ms(1); } /*Ham yeu cau goi du lieu hien thi len LCD*/ void datawrt(void) { RS = 1; RW = 0; E = 1; E = 0; delay_ms(1); } #int_RB void ngat_RB(void) { if(RBIE && RBIF) { //hang A if ((RB0) && (RB4)) { LCD = '7'; datawrt(); } if (RB0 && RB5) { LCD = '8'; datawrt(); } if (RB0 && RB6) { LCD = '9'; datawrt(); } if (RB0 && RB7) { LCD = ':'; datawrt(); } //Hang B if ((RB1) && (RB4)) { LCD = '4'; datawrt(); } if (RB1 && RB5) { LCD = '5'; datawrt(); } if (RB1 && RB6) { LCD = '6'; datawrt(); } if (RB1 && RB7) { LCD = 'x'; datawrt(); } //Hang C if ((RB2) && (RB4)) { LCD = '1'; datawrt(); } if (RB2 && RB5) { LCD = '2'; datawrt(); } if (RB2 && RB6) { LCD = '3'; datawrt(); } if (RB2 && RB7) { LCD = '-'; datawrt(); } //Hang D if ((RB3) && (RB4)) { LCD = 0x0C; comnwrt(); } if (RB3 && RB5) { LCD = '0'; datawrt(); } if (RB3 && RB6) { LCD = '='; datawrt(); } if (RB3 && RB7) { LCD = '-'; datawrt(); } } } void main(void) { set_tris_b(0b00001111); set_tris_c(0); set_tris_d(0); portb=0; portc=0; portd=0; enable_interrupts(global); enable_interrupts(int_RB); ext_int_edge(H_TO_L); LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface comnwrt(); LCD = 0x0C; // Bat hien thi, tat con tro comnwrt(); while(true) { } } Khi compile thì chương trình dịc ok nhưng khi mô phỏng mình lại thấy LCD tiếp tục đứng im .Hee, mong các bạn tiếp tục giúp đỡ cho trọn vẹn nha. Mình làm về project này là để làm một cái smallcal có dạng như trên hình vẽ, mình cùng đang tìm hiểu thuật toán của nó,đây là thuật toán trong sách Interfacing PIC về các phép tình đơn giản: Calculate result IF key = ‘+’, Add IF key = ‘-‘, Subtract IF key = ‘x’, Multiply IF key = ‘/’, Divide Add Add Num1 + Num2 Load result, CALL Two digits Subtract Subtract Num1 – Num2 IF result negative, load minus sign, CALL Display character Load result, CALL Display character Multiply REPEAT Add Num1 to Result Decrement Num2 UNTIL Num2= 0 Load result, CALL Two digits Divide REPEAT Subtract Num2 from Num1 Increment Result UNTIL Num1 negative Add Num2 back onto Num1 for Remainder Load Result, CALL Display character Load Remainder, CALL Display character Two digits Divide result by 10, load MSD, CALL Display character Load LSD, CALL Display character Mình viết bằng ASM thì được chứ còn CCS thì non tay lắm .Mong các bạn giúp đỡ mình hoàn thành project này.Cảm ơn nhiều.Chúc vui. thay đổi nội dung bởi: cuopbienquin, 01-09-2007 lúc 05:13 PM. |
|
|
Similar Threads | ||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 26 | 07-05-2024 08:55 AM |
TUT về USART trong PIC16F877A | mafd_47a | MPASM | 11 | 04-05-2024 04:43 AM |
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 |