wcmc91 |
18-03-2012 04:29 PM |
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
}
}
}
Thanks các bác nhiều.
|