|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
18-03-2012, 04:29 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Feb 2012
Bài gửi: 1
: |
Vấn đề về nút bấm cài đặt cho đồng hồ thời gian thực
Chào các bác, hiện tại em đang xây dựng 1 mạch đo nhiệt độ hiển thị LED 7 thanh và hiển thị đồng hồ thời gian thực lên LCD, tất cả đã gần xong chỉ còn mỗi vấn đề với các nút bấm, khi mô phỏng em bấm thử thì ko được, các bác xem giùm em với
Đây là đoạn code của em: Code:
#define <16f877a.h> #include "def_16f877a.h" //Thu vien def_16f877a.h dinh kem #device *=16 adc=10 //Do phan giai ADC #use delay(clock=20000000) //Xung thach anh 20Mhz #FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT #include <DS1307.c> //Thu vien IC thoi gian thuc: DS1307.c dinh kem #include <Lib_LCD.c> //Thu vien giao tiep LCD: Lib_LCD.c dinh kem #define UP 0x19 //Gan chan C0 #define DOWN 0x1A //Gan chan C1 #define SET 0x1C //Gan chan C2 #define BACK 0x38 //Gan chan C6 #define GIO 0x1 //Ma Gio #define PHUT 0x2 //Ma Phut #define GIAY 0X3 //Ma giay #define NGAY 0X4 #define THANG 0X5 #define NAM 0x6 byte LED[10]={ 0b0000,//0 0b0001,//1 0b0010,//2 0b0011,//3 0b0100,//4 0b0101,//5 0b0110,//6 0b0111,//7 0b1000,//8 0b1001,//9 }; int8 donvi, chuc, dem=50; //Luu gia tri de hien thi tren LED 7 thanh //Nhiet do hien tai la Chuc*10+Donvi int8 sec,min,hour,setsec,setmin,sethour,date,month,year,setdate,setmonth,setyear; //Luu gia tri ve thoi gian int8 TT_Setting; //Luu trang thai cai dat thoi gian int T_T=0; //FALSE=khong cai dat, TRUE=dang cai dat void Update() { //Cap nhat nhiet do tu LM35 dem++; if(dem>=76) //76 lan { //Nhiet do se duoc cap nhat sau khoang thoi gian nhat dinh // int1 done; int8 read; //Bien luu gia tri doc duoc tu ADC, LM35 setup_adc(ADC_START_ONLY); //khoi tao adc //done=adc_done(); //kiem tra san sang cho lan truyen du lieu tiep theo? //while(!done) //{ //done=adc_done(); //} //OK? san sang delay_ms(10); //cho 10ms READ=0.489*READ_ADC(); //doc tin hieu tu LM35 chuc=read/10; //gan hang chuc cua nhiet do donvi=read%10; //gan hang don vi cua nhiet do dem=0; //reset temp de tiep tuc cho 76 lan tran tiep theo init_ds1307(); //ds1307_set_date_time(0,0,0,0,0,0,0); //ds1307_get_date(day,month,year,dow); //ds1307_get_time(hrs,min,sec); sec=read_ds1307(0); // read second min=read_ds1307(1); // read minute hour=read_ds1307(2); // read hour date=read_ds1307(4); month=read_ds1307(5); year=read_ds1307(6); } } void HienThi() { /*Hien thi LED 7 Thanh*/ int8 a; //De luu trang thai BH(4bit cao cua port B) ta dung bien a nay RB4=1; //Dieu khien T quet led, cho phep hien thi hang chuc a=portb&0xF0; //luu gia tri hien tai cua BH a=a|LED[chuc]; //giu lai trang thai BH, them gia tri led output_b(a); //xuat ra port B delay_ms(5); RB4=0; //Tat hien thi hang chuc RB5=1; //bat hien thi hang don vi a=portb&0xF0; a=a|LED[donvi]; output_b(a); delay_ms(5); RB5=0; //Tat hien thi hang don vi ->xong quet led /*Hien thi LCD*/ LCD_GOTOXY(1,1) ; printf(lcd_putc,"Time: %02X:%02X:%02X",hour,min,sec); LCD_GOTOXY(1,2); printf(lcd_putc,"Date: %02X:%02X:20%02X",date,month,year); } void HienThiSetup() { /*Hien thi LED 7 Thanh*/ int8 a; //De luu trang thai BH(4bit cao cua port B) ta dung bien a nay RB4=1; //Dieu khien T quet led, cho phep hien thi hang chuc a=portb&0xF0; //luu gia tri hien tai cua BH output_b(a|LED[chuc]); //xuat ra port B delay_ms(5); RB4=0; //Tat hien thi hang chuc RB5=1; //bat hien thi hang don vi a=portb&0xF0; output_b(a|LED[donvi]); delay_ms(5); RB5=0; //Tat hien thi hang don vi ->xong quet ledp de tiep tuc cho 76 lan tran tiep theo /*Hien thi LCD*/ LCD_GOTOXY(1,1) ; printf(lcd_putc,"Time: %02D:%02D:%02D",sethour,setmin,setsec); LCD_GOTOXY(1,2); //lcd_putc("\f"); // printf(lcd_putc,"\nSet:"); // LCD_GOTOXY(1,2); printf(lcd_putc,"Date: %02D:%02D:%02D",setdate,setmonth,setyear); } int8 QUET_PHIM() { int8 inC, key; inC = input_c()|0x18; //Chi kiem tra bit 0 1 2 3 5 6 7 if(inC != 0x18) //Neu co su thay doi { key = inC; //Luu su thay doi delay_ms(20); //Chong rung inC = input_c()|0x18; // if(inC == 0x18) //Dam bao phim duoc bam la chuan return key; //Tra ve ma phim tuong ung } else return 0; //Phim khong dung , tra ve 0 } void DieuKhien(int8 key) { if(key==SET) // Phai bam SET dau tien moi duoc vao cai dat { int i; i++; if(i==1) { //write_DS1307(0x2, decToBcd(sethour)); //Luu vao DS1307 TT_Setting=0x1; //Trang thai hien tai la GIO T_T=TRUE; //Kich hoat che do cai dat switch(key) { case UP: //Neu la UP if(sethour==23) sethour=-1; //Quay vong gio sethour++; break; //Gio + 1 case DOWN: //Neu la DOWN if(sethour==0) sethour=24; //QUay vong gio sethour--; break; //Gio - 1 } write_DS1307(0x2, decToBcd(sethour)); } if(i==2) { TT_Setting=0x2; //Trang thai hien tai la PHUT T_T=TRUE; //Kich hoat che do cai dat switch(key) { case UP: if(setmin==59) setmin=-1; setmin++; break; case DOWN: if(setmin==0) setmin=60; setmin--; break; } write_DS1307(0x1, decToBcd(setmin)); } if(i==3) { TT_Setting=0x3; //Trang thai hien tai la GIAY T_T=TRUE; //Kich hoat che do cai dat switch(key) { case UP: if(setmin==59) setmin=-1; setmin++; break; case DOWN: if(setmin==0) setmin=60; setmin--; break; } write_DS1307(0x0, decToBcd(setsec)); } if(i==4) { TT_Setting=0x4; //Trang thai hien tai la NGAY T_T=TRUE; //Kich hoat che do cai dat switch(key) { case UP: if(setmin==30) setmin=-1; setmin++; break; case DOWN: if(setmin==0) setmin=31; setmin--; break; } write_DS1307(0x4, decToBcd(setdate)); } if(i==5) { TT_Setting=0x5; //Trang thai hien tai la THANG T_T=TRUE; //Kich hoat che do cai dat switch(key) { case UP: if(setmin==11) setmin=-1; setmin++; break; case DOWN: if(setmin==0) setmin=12; setmin--; break; } write_DS1307(0x5, decToBcd(setmonth)); } if(i==6) { TT_Setting=0x6; //Trang thai hien tai la NAM T_T=TRUE; //Kich hoat che do cai dat switch(key) { case UP: if(setmin==98) setmin=-1; setmin++; break; case DOWN: if(setmin==0) setmin=99; setmin--; break; } write_DS1307(0x6, decToBcd(setyear)); } if(key==BACK) { i = 0; T_T=FALSE; break; } } } /********************************************************\ * Chuong trinh chinh cua he thong \********************************************************/ void main() { PORTC = 0; TRISC = 0xFF; int8 key=0; trisc = 0xFF ;setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //Khoi tao timer1 dem o 20Mhz/4 setup_adc_ports(ALL_ANALOG); //Khoi tao ADC giao tiep LM35 setup_adc(ADC_CLOCK_INTERNAL); //Khoi tao xung ADC set_adc_channel(0); //Kenh ADC chan A0 lcd_init(); //Khoi tao LCD init_ds1307(); //Khoi tao ds1307 while(TRUE) { key=QUET_PHIM(); //Kiem tra nut bam if(key) DieuKhien(key); //Nut duoc bam -> vao che do ModeSetup if(T_T) //Neu la che do Setup HienThiSetup(); //Hien thi Setup else //Neu khong phai che do Setup { Update(); //Cap nhat thoi gian tu DS1307 moi nhat // LCD_GOTOXY(1,2); // printf(lcd_putc,"Date : %02d:%02d:%02d",date,month,year); HienThi(); //Hien thi nhiet do va thoi gian } } } |
|
|