Thứ Sáu, 20 tháng 11, 2015

BÀI 10 : ĐẾM TỪ 0 ĐẾN 9 SỬ DỤNG 2 NÚT NHẤN PIC16F877A XC8

Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về LED 7seg như là đếm lên, đếm xuống từ động còn trong bài đăng này mình sẽ hướng dẫn các bạn sử dụng nút nhấn để đếm lên hoặc đếm xuống. Ban nào chưa xem bài giao tiếp với nút nhấn thì xem lại tại đây và bài giao tiếp với LED 7seg tại đây để hiểu rõ hơn về cấu tạo và cách làm như thế nào để áp dụng vào trong bài này của chúng ta. Và cụ thể trong bài này mình sẽ hướng dẫn các bạn đếm từ 0 đến 9  và từ 9 về 0 sử dung 2 nút nhấn như hình bên dưới. Ở trong bài này mình sử dụng 2 nút nhấn tích cực mức thấp nha !
- Nút nhấn tăng.
Nút nhấn tăng ta có đoạn code như sau :
if (!RA0)        //Check if switch SW1 is closed
{
__delay_ms(100); //wait for 100ms
if(!RA0)       //Check if switch SW1 is still closed
{
PORTB = (SEGMENT_MAP[digit]);
__delay_ms(100); //Delay 1 second
digit++;
if (digit>9)
digit=0;
}
}
else
{
PORTB = (SEGMENT_MAP[digit]);
}
Giải thích hoạt động của đoạn code trên như sau :
Khi chúng ta nhấn nút RA0 thì delay 100ms (thời gian chống dội phím) sau 100ms nó sẽ kiểm tra nút nhấn của chúng ta nếu được nhấn thì nó sẽ thực lệnh và tăng giá trị LED lên 1 đơn vị sao mỗi lần nhấn ngược lại nếu không nhấn thì PORTB  = (SEGMENT_MAP[digit]).
- Nút nhấn giảm.
Nút nhấn giảm ta có đoạn code như sau :
if (!RA1)        //Check if switch SW1 is closed
{
__delay_ms(100); //wait for 100ms
if(!RA1)       //Check if switch SW1 is still closed
{
PORTB = (SEGMENT_MAP[digit]);
__delay_ms(100); //Delay 1 second
digit--;
if (digit==0)
digit=9;
}
}
else
{
PORTB = (SEGMENT_MAP[digit]);
}
Giải thích hoạt động của đoạn code trên như sau :
Khi chúng ta nhấn nút RA1 thì delay 100ms (thời gian chống dội phím) sau 100ms nó sẽ kiểm tra nút nhấn của chúng ta nếu được nhấn thì nó sẽ thực lệnh và giảm giá trị LED lên 1 đơn vị sao mỗi lần nhấn ngược lại nếu không nhấn thì PORTB  = (SEGMENT_MAP[digit]).
Cách này mình làm cho các bạn dễ hiểu nên làm code hơi dài nha ! Các bạn có thể bỏ phần giảm vào trong phần else của nút nhấn tăng cũng được nha !
- Đây là ảnh mô phỏng protues.
ĐẾM TỪ 0 ĐẾN 9 SỬ DỤNG 2 NÚT NHẤN PIC16F877A XC8
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 8000000
#include <xc.h>
unsigned char  const SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void main(void) 
{
     ADCON1=0x07;
     TRISB = 0x00;           //Set PortB to all outputs
     TRISA0= 1;             //Set PortC.0 as input
     TRISA1 = 1;
     char digit=0;
     while(1){
     if (!RA0)        //Check if switch SW1 is closed
      {
        __delay_ms(100); //wait for 100ms
        if(!RA0)       //Check if switch SW1 is still closed
         {

        PORTB = (SEGMENT_MAP[digit]);
        __delay_ms(100); //Delay 1 second
        digit++;
        if (digit>9)
        digit=0;
         }
      }
      else
      {
        PORTB = (SEGMENT_MAP[digit]);
      }

      if(!RA1)        //Check if switch SW1 is closed
      {
        __delay_ms(100); //wait for 100ms
        if(!RA1)       //Check if switch SW1 is still closed
         {
        PORTB = (SEGMENT_MAP[digit]);
        __delay_ms(100); //Delay 1 second
        digit--;
        if (digit==0)
        digit=9;
         }
      }
      else
      {
        PORTB = (SEGMENT_MAP[digit]);
      }
    }
}
- Link download project Click here


EmoticonEmoticon