Hẹn giờ on/off thiết bị với pic 16f84A

  Hẹn giờ tắt mở thiết bị với pic16f84a là một project đơn giản, sử dụng vi điều khiển pic 16f84A để quét các thiết bị ngoại vi: button, led 7 đoạn và thiết bị cần điều khiển. Bạn có thể xem lại các project xử lí nút ấn buttonled 7 đoạn và lập trình quét led để hiểu được các đoạn code viết trong project này.

Kết nối: chúng ta sử dụng RA0, RA1, RB7 kết nối các button TIME UP, TIME DOWN, ENTER để đưa các điều kiện đầu vào. sử dụng các pins còn lại của port b và RA3, RA4 điều khiển quét 2 led 7 đoạn.

Hoạt động: bạn sử dụng button TIME UP và TIME DOWN để chọn thời gian mở/ tắt thiết bị, khi chọn xong bạn sử dụng button ENTER để bắt đầu đếm ngược, khi đến 00 thì thiết bị sẽ được tác động (việc mở/tắt thiết bị bạn chỉ việc set lại pin RA2).

Bạn lưu ý, đối với vi điều khiển pic 16f84 khi muốn sử dụng pin RA4 như một input hay output thì bạn cần dùng một điện trở kéo lên.

Sau đây là code hoàn chỉnh của project  “Hẹn giờ tắt mở thiết bị với pic 16f84a”:

//-------------- Chuong trinh hen gio tat mo thiet bi------------------
// Dung vi dieu khien pic 16f84 de dieu khien 2 led 7seg hien thi thoi
// gian set (dem len va dem xuong)
// PORT A0->A1, RB7 dung lam ngat ngoai, A2 xuat tin hieu dieu khien, A3, A4 dieu khien
// 2 led 7seg. PORTB xuat du lieu led 7seg
// Project duoc viet vao ngay 20/3/2012, update 22/11/2015
// Tac gia: HUYNH MINH TRUNG
// Web: http://giaoan.link
//------------------------------------------------------------------------------
unsigned int mask(unsigned short num) {
  switch (num) {
    case 0 : return 0xc0;
    case 1 : return 0xf9;
    case 2 : return 0xa4;
    case 3 : return 0xb0;
    case 4 : return 0x99;
    case 5 : return 0x92;
    case 6 : return 0x82;
    case 7 : return 0xf8;
    case 8 : return 0x80;
    case 9 : return 0x90;
  } //case end
}//~
int digit_no, digit10, digit1, digit, i;

void interrupt() {
  if (digit_no==0) {
    PORTA.F3 = 0;          // Turn off all 7seg displays
    PORTB = digit1;     //  send mask for ones digit to PORTB
    PORTA.F3 = 1;          //  turn on 1st 7 seg., turn off 2nd
    digit_no = 1;
  } else {
    PORTA.F4 = 0;          // Turn off all 7seg displays
    PORTB = digit10;    //  send mask for tens digit to PORTB
    PORTA.F4 = 1;          //  turn on 2nd 7 seg., turn off 1st
    digit_no = 0;
    }
  TMR0 = 0;             //  clear TMRO
  INTCON = 0x20;        //  clear TMR0IF and set TMR0IE
}
 void hienthi(){
      digit   = i % 10u;
      digit1  = mask(digit);           // prepare ones digit
      digit   = (char)(i / 10u) % 10u;
      digit10 = mask(digit);           // prepare tens digit
      }

 void main(){
 OPTION_REG   =   0x80;   // Timer0 settings
  TMR0        =   0;
  INTCON      =   0xA0;   // Disable PEIE,INTE,RBIE,T0IE
  PORTA       =   0;   // clear PORTA (make sure both displays are off)
  TRISA       =   0B00000011;   // PORTA pins as output, without RA0,RA1 as input
  PORTB       =   0x00;   // clear PORTB
  TRISB       =   0B10000000;   // designate PORTB pins as output, without RB7 as  input
 i=0;
 hienthi();
while(PORTA.F1==1){
                  if(PORTA.F0==0){
                                   i=i+1;
                                   hienthi();
                                   delay_ms(200);
                                   }
                  if(PORTB.F7==0){
                                   i=i-1;
                                   hienthi();
                                   delay_ms(200);
                                   }
                  }

for(i;i>=0;i--){
               delay_ms(500);
               hienthi();
               delay_ms(500);
               }
PORTA.F2=1;
delay_ms(2000);
            }