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)
-   -   Vấn đề về nút bấm cài đặt cho đồng hồ thời gian thực (http://www.picvietnam.com/forum/showthread.php?t=13522)

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.

vanhiep2941 02-07-2012 11:08 PM

Tham khảo bài này được này bạn....http://www.picvietnam.com/forum/showthread.php?p=44730


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