![]() |
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! |
Ko hiểu sao ko tải file đính kèm lên đc =.+! ,báo erro liên tục +.+
|
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(); } |
- 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 . |
#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 |
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