PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Help(CCS Pic16f877a):dùng ngắt ngoài thực hiện khối 4 bàn phím với 4 chức năng riêng! (http://www.picvietnam.com/forum/showthread.php?t=5554)

nnthi3n 18-12-2009 12:19 AM

Help(CCS Pic16f877a):dùng ngắt ngoài thực hiện khối 4 bàn phím với 4 chức năng riêng!
 
Mình đang làm đồ án môn học,đề tài mạch cảm biến và điều khiển nhiệt độ dùng Pic16f877a,với con cảm biến là Thermocouple.Mình đã mô phỏng proteus và cho chạy phần cứng thành công khâu hiển thị nhiệt độ lấy từ cảm biến trên 4 led7 đoạn(sơ đồ nguyên lý và code mình post kèm bên dưới).Nhưng còn khâu bàn phím gồm 4 nút nhấn thì mình chưa biết cách nào để xử lý sau khi gọi hàm ngắt:
_mode:
+khi mode=0: thì led1 hiển thị "S."="SET"="nhiệt độ đặt",3 led sau sẽ hiển thị nhiệt độ đặt,và sẽ nhờ vào 2 phím "tang" và "giam" phía sau để thực hiện cài đặt nhiệt độ đặt.
+khi mode=1: thì led1 hiển thị "C."="CONTROL"="nhiệt độ điều khiển",3 led sau sẽ hiển thị nhiệt độ từ cảm biến đưa về qua bộ ADC trong Pic.
_tang:mỗi lần nhấn phím này sẽ tăng 1 đơn vị nhiệt độ và dc hiển thị trên khối led7(chỉ sử dụng dc khi ở mode=0).
_giảm:mỗi lần nhấn phím này giảm 1 đơn vị nhiệt độ và dc hiển thị trên khối led7(chỉ sử dụng khi mode=0)
_enter:để xác nhận nhập nhiệt độ đặt sau khi hiệu chỉnh (mình đang phân vân ko biết có nên dùng phím này hay là để trống luôn)

Mong đc sự giúp đỡ của các bạn và các anh !
Thx for reading!

nnthi3n 18-12-2009 12:34 AM

Ko hiểu sao ko tải file đính kèm lên đc =.+! ,báo erro liên tục +.+

nnthi3n 18-12-2009 10:07 AM

Ko hiểu sao ko upload file lên dc nên mình xin gửi trước đoạn code đã test,chỉ có phần bàn phím là chưa xử lý đc nên tạm đóng lại,nhờ các bro hướng dẫn dùm:

#include <16F877A.h> //Khai báo PIC su dung
#include <def_877a.h> //Khai báo dinh nghia thanh ghi
//và các bit quan trong
#device *=16 adc=10 //Khai báo dùng con poiter 16 bit và
//ADC 10 bit
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
//Khai báo các config
#use delay(clock=12000000) //Khai báo su dung hàm delay và tan so
//dao dong su dung
int8 const a[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
int8 n,m,tram,chuc,donvi; //Khai báo các bien so nguyên 1 byte(8 bit)
float value;


void convert_bcd(int8 x) //Chuong trình tách so hàng tram,chuc,don vi
//chua trong 3 bien dã khai báo o trên là
//tram,chuc và donvi
{
donvi=x%10; //chia lay phan du
chuc=x/10;
chuc=chuc%10;
tram=chuc/10;
}

void display_mode0() //Chuong trình con giai mã và hien thi nhiet
//do
{
PORTD=0x12; //hien thi o led 1 chu "S."
RB3=0;
delay_ms(2);
RB3=1;
PORTD=a[donvi]; //Gui du lieu len Led thu 4
RB0=0; //Bat Led thu 4
delay_ms(2); //Tre 2 ms
RB0=1; //Tat Led thu 4
PORTD=a[chuc]; //Làm tuong tu
RB1=0;
delay_ms(2);
RB1=1;
PORTD=a[tram];
RB2=0;
Delay_ms(2);
RB2=1;
}


void display_mode1()

{
PORTD=0x46; //hien thi o led 1 chu "C."
RB3=0;
delay_ms(2);
RB3=1;
PORTD=a[donvi]; //Gui du lieu len Led thu 4
RB0=0; //Bat Led thu 4
delay_ms(2); //Tre 2 ms
RB0=1; //Tat Led thu 4
PORTD=a[chuc]; //Làm tuong tu
RB1=0;
delay_ms(2);
RB1=1;
PORTD=a[tram];
RB2=0;
Delay_ms(2);
RB2=1;
}

/*#int_RB


void int_phim()
{
int8 tang,giam,enter,mode;
int8 c;
do
{
tang=input(pin_b7);
giam=input(pin_b6);
enter=input(pin_b5);
mode=input(pin_b4);
}
while(tang&&giam&&enter&&mode);

//lap vong kin chuyen tu mode0 sang mode1 va nguoc lai
//if(RB7==0&&RB6==0&&RB5==0&&RB4==1)
/*if(!mode)
// {if(c==0)
// { c=1;
display_mode0();}*/

//if(RB7==1&&RB6==0&&RB5==0&&RB4==0)
/* if(!tang)
{n=a[donvi];
n=n+1;
display_mode0();}

//if(RB7==0&&RB6==1&&RB5==0&&RB4==0)
if(!giam)
{n=donvi+chuc+tram;
n=n-1;
display_mode0();}
}
//if(RB7==0&&RB6==0&&RB5==1&&RB4==0)
/* if(!enter)
n=m;
}

else if(c==1)
{c=0;
display_mode1();}
}*/
//}



void on_off()
{
if((int8)value < m) RC2=1;
if((int8)value > m) RC2=0;

}

void main()
{

int16 i;

trisd = 0x00; //Thiet lap các chan PORTD là OUTPUT
trise = 0x00; //Thiet lap các chan PORTE là OUTPUT
trisa = 0xff;
trisb=0xF0;
//Thiet lap các chan PORTA là INPUT
trisc = 0x00; //Thiet lap cac chan PORTC la OUTPUT
portD = 0x00; //Thiet lap các chân PORTD la muc thap
portC = 0xff; //Thiet lap các chân PORTC la muc cao

//Khoi tao cho ngat ngoai
set_tris_b(0xF0); //F=1111 là nhap so lieu tu ban phim
enable_interrupts(int_RB);
enable_interrupts(GLOBAL);

//Khoi tao ADC
setup_adc(ADC_CLOCK_INTERNAL); //Chi ra thoi gian lay mau
//cua ADC là bang xung Clock
setup_adc_ports(AN0); //AN0 là chân lay tín hieu Analog
set_ADC_channel(0) ; //
delay_us(10); //Tre 10us

m= 50; // cai dat nhiet do dieu khien

//lay mau nhiet do lan dau tien
value=(float)read_adc();
value = (value - 558.5)/2.048;
convert_bcd((int8)value);
i=0;

while(1) //so sánh và thuc hien on_off
{
i++;
value = (float)read_adc();

value = (value - 558.5)/2.048;
if (i==150)
{
convert_bcd((int8)value);
i=0;
Output_D(value);
}
if(((int8)value > m ) | ((int8)value < m))
{ on_off();
Output_D(value);
display_mode1(); }


}
//while(1) display_mode0();

}

Mr.Bi 23-12-2009 08:40 AM

- phím nhấn đừng bao h dùng ngắt
- Dùng ngắt để hiển thị (chủ yếu là quét led , LCD thì có chốt sắn roy)

Biết vì sao k ? Khi u nhấn phím , phải có thời gian trễ nhằm chống nảy phím . Nếu dùng ngắt RB để lấy phím thì trong ngắt lại gọi hàm delay (chống nảy = phần mềm) --> ngắt k còn í nghĩa j nữa . t thấy hàm main của u chẳng làm j cả , phí quá .

- U cần đưa hàm quét phím ra hàm main , bỏ ngắt RB , khai báo chân RB là chân IO thông thừong
- Đưa hàm lấy nhiệt độ vào ngắt timer
- Toàn bộ các hàm linh tinh đưa vào main tất , chỉ có cái nào cần đọc giá trị update & hiển thị thì đưa vào ngắt timer thui

Làm như u thì ra ngoài mạch thực , lại chữa code lần nữa .

vinhlec4 23-12-2009 02:44 PM

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
khi nao dung các khai bao cu the nhu tren máy a?
giải thic e với

datdien 25-03-2010 10:48 AM

Có cao thủ nào vào chỉ giáo cái ạ!


Múi giờ GMT. Hiện tại là 07:03 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