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
Giải thích hoạt động của đoạn code trên như sau :{
__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]);
}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]);
}
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.
- Đâ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]);
}
}
}
EmoticonEmoticon