1. Sơ đồ nguyên lý.
Sơ đồ nguyên lý khối Led đơn + Phím nhấn trên Kit Pic V1 New như sau.
2. Nguyên lý hoạt động.
Dựa vào sơ đồ nguyên lý ta thấy:
-Khi phim không được nhấn, chân RA2 ở mức cao (mức logic 1).
-Khi phím được nhấn, chân RA2 ở mức thấp (mức logic 0).
-Muốn Led đơn sáng, xuất 0v ra chân RA1(xuất mức logic 0).
-Muốn Led đơn tắt, xuất 5v ra chân RA1 (xuất mức logic 1).
-RA2 là chân nhận dữ liệu (input).
-RA1 là chân xuất dữ liệu (ouput).
3. Thuật toán.
Theo yêu cầu bài toán ta có thuật toán điều khiển như sau: cứ mỗi khi phím được nhấn, đảo trạng thái chân điều khiển led đơn 1 lần.
Đây là code.
http://chiasedientu.blogspot.com
#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) {
TRISB = 0x00; //Set PortB to all outputs
TRISC0= 1; //Set PortC.0 as input
char digit=0;
while(1){
if (!RC0) //Check if switch SW1 is closed
{
__delay_ms(100); //wait for 100ms
if (!RC0) //Check if switch SW1 is still closed
{
PORTB = (SEGMENT_MAP[digit]);
__delay_ms(50); //Delay 1 second
digit++;
if (digit>9)
digit=0;
}
}
else
{
PORTB = (SEGMENT_MAP[digit]);
}
}
}
Ảnh mô phỏng protues.
Sơ đồ nguyên lý khối Led đơn + Phím nhấn trên Kit Pic V1 New như sau.
2. Nguyên lý hoạt động.
Dựa vào sơ đồ nguyên lý ta thấy:
-Khi phim không được nhấn, chân RA2 ở mức cao (mức logic 1).
-Khi phím được nhấn, chân RA2 ở mức thấp (mức logic 0).
-Muốn Led đơn sáng, xuất 0v ra chân RA1(xuất mức logic 0).
-Muốn Led đơn tắt, xuất 5v ra chân RA1 (xuất mức logic 1).
-RA2 là chân nhận dữ liệu (input).
-RA1 là chân xuất dữ liệu (ouput).
3. Thuật toán.
Theo yêu cầu bài toán ta có thuật toán điều khiển như sau: cứ mỗi khi phím được nhấn, đảo trạng thái chân điều khiển led đơn 1 lần.
Đây là code.
http://chiasedientu.blogspot.com
#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) {
TRISB = 0x00; //Set PortB to all outputs
TRISC0= 1; //Set PortC.0 as input
char digit=0;
while(1){
if (!RC0) //Check if switch SW1 is closed
{
__delay_ms(100); //wait for 100ms
if (!RC0) //Check if switch SW1 is still closed
{
PORTB = (SEGMENT_MAP[digit]);
__delay_ms(50); //Delay 1 second
digit++;
if (digit>9)
digit=0;
}
}
else
{
PORTB = (SEGMENT_MAP[digit]);
}
}
}
Ảnh mô phỏng protues.
Link download project.
EmoticonEmoticon