2-Wire Keypad Interface Using a 555 Timer - Embedded Lab.pdf
PDF를 받으면 안에 링크가 있는데 그곳에서도 두번째줄의 rar파일을 받을 수 있습니다.
Chip : PIC16F628A
Code : MikroC pro for PIC
Parts : 16x2 LCD, KeyPad(4x3)
▼전체 회로도 입니다.
▼주파수를 계산해서 어느 좌표의 키패드가 눌렸는지 감지합니다.
그러기 위해서는 주파수 공식을 알아야 겠죠?
뭔가 어려워 보이지만 중2정도의 수학실력만 있다면 가능합니다.
아래 공식을 보여드리겠습니다.
R1과 C가 fix되있으면, R2에 따라서 Frequency가 달라지게 됩니다.
이 값을 갖고 PIC가 KeyPad위치를 찾아가게 됩니다.
팁을 드리자면 허용오차가 작은 Resistor, Capacitor를 사용해야 좋습니다.
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
/*
Project Name: 2 Wire Keypad using 555
* Copyright:
(c) Rajendra Bhatt, 2011.
* Test configuration:
MCU: PIC16F628A
Oscillator: XT, 4.0 MHz
*/
// LCD module connections
sbit LCD_RS at RA0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISA0_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections
sbit Pressed at RA2_bit;
// Define Messages
char message1[] = "Key Pressed = ";
char numbers[] = "0123456789*#";
unsigned short count, Released, Num;
void interrupt(){
Num ++; // Interrupt causes Num to be incremented by 1
INTCON.T0IF = 0; // Bit T0IF is cleared so that the interrupt could reoccur
}
void debounce(){
Delay_ms(25);
}
void main() {
CMCON |= 7; // Disable Comparators
TRISB = 0b00000000; // set direction to be output
TRISA = 0b00110100;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1,message1); // Write message1 in 1st row
OPTION_REG = 0b00101000; // TOCS=1 for Counter mode, PSA=0 for 1:2 prescaler
Released = 1;
do {
if (Pressed && Released) {
debounce();
Num = 0;
Released = 0;
INTCON = 0xA0; // Enable interrupt TMR0 and Global Interrupts
TMR0=0;
Delay_ms(100); // Delay 100 mSec
INTCON = 0x00; // Disable interrupt TMR0
Lcd_Chr(1,14,numbers[Num]);
}
if(!Pressed) {
debounce();
Released = 1;
}
} while(1);
}
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲