PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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
Prev Previous Post   Next Post Next
Old 18-03-2012, 04:29 PM   #1
wcmc91
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
      }
   }
}
Thanks các bác nhiều.
wcmc91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 12:18 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam