Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * keypad_01.c
- *
- * Created: 28.12.2016 7:55:33
- * Author: Писанец Александр Николаевич
- */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #define LED1 0
- #define LED2 1
- volatile unsigned char action_int = 11,temporary_data_keyboard,parity_bit_keyboard;
- volatile unsigned char keyboard_data,bit_action;
- ISR(INT0_vect)
- {
- keypad_input (); //принимаем данные с клавиатуры
- }
- //********************************//
- //********************************//
- int main(void)
- {
- DDRD &=~(1«2);
- DDRD &=~(1«6);
- PORTD |=(1«6)|(1«2);
- DDRB |=(1«LED1);
- DDRB |=(1«LED2);
- //****************//
- GICR |=(1«6);
- MCUCR |=(1«ISC01);
- MCUCR &=~(1«ISC00);
- asm("sei");
- //*****************//
- while(1)
- {
- switch (keyboard_data ) // находится принятый код кнопки
- {
- case 0xAA://тест при подключении клавиатуры
- PORTB |=(1«LED1);
- keyboard_data = 0;
- break;
- case 0x29: // пробел
- if ( bit_action & (1«0))
- PORTB &=~(1«LED1);
- else
- PORTB |=(1«LED1);
- bit_action &=~(1«0);
- bit_action &=~(1«2);
- keyboard_data = 0;
- break;
- case 0x41: // "<"
- if (bit_action & (1«1))
- {
- if ( bit_action & (1«2))
- bit_action &=~(1«2);
- else
- break;
- }
- if ( PINB & (1«1))
- PORTB &=~(1«LED2);
- else
- PORTB |=(1«LED2);
- bit_action |=(1«1);
- bit_action &=~(1«0);
- keyboard_data = 0;
- break;
- case 0xf0: // кнопка отжата
- bit_action |= (1«0)|(1«2);
- keyboard_data = 0;
- break;
- default:
- break;
- }
- }
- }
- //****************************//
- //****************************//
- // принимаем данные с клавиатуры
- //****************************//
- //****************************//
- void keypad_input (void)
- {
- switch ( action_int )
- {
- case 11:
- if (!(PIND & (1«6))) // определение стартового бита
- action_int = 0;
- break;
- case 0 ... 7: // принимаем 8 бит данных
- if (PIND & (1«6))
- {
- temporary_data_keyboard |=(1«action_int);
- parity_bit_keyboard ++; // данные для проверки чётности
- }
- else
- {
- temporary_data_keyboard &=~(1«action_int);
- }
- action_int++; // счёт принятых бит
- break;
- case 8: // проверяем на правильность принятых данных исходя от бита чётности
- if (PIND & (1«6)) // принимаем бит чётности от клавиатуры
- {
- if (parity_bit_keyboard & (1«0)) // проверяем четное или не четное число
- action_int = 11; // бит четности не одинаковый
- else
- action_int = 9;
- }
- else
- {
- if (parity_bit_keyboard & (1«0)) // проверяем четное или не четное число
- action_int = 9;
- else
- action_int = 11; // бит четности не одинаковый
- }
- parity_bit_keyboard = 0;
- break;
- case 9:
- if (PIND & (1«6)) // стоповый бит (всегда высокий уровень)
- {
- keyboard_data = temporary_data_keyboard; // сохраняем полученное значение
- }
- action_int = 11;
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement