Ðề tài: CCS C for PIC16F877A
View Single Post
Old 01-09-2007, 05:02 PM   #299
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
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.
File Kèm Theo
File Type: rar LCDKEYPAD.rar (14.5 KB, 347 lần tải)

thay đổi nội dung bởi: cuopbienquin, 01-09-2007 lúc 05:13 PM.
cuopbienquin vẫn chưa có mặt trong diễn đàn