Контрольная работа по "Программированию"
Автор: Ivan Kolesnikov • Апрель 18, 2021 • Контрольная работа • 2,075 Слов (9 Страниц) • 261 Просмотры
ОПИСАНИЕ
В данной работе был необходимо при помощи модуля периферийных устройств считывать сигналы посылаемые клавиатурой и определить какая из клавиш была нажата. Номер бригады второй, соответственно реализовано чтение второй строки клавиатуры(от знака «тильда» до клавиши backspace).
Клавиатура подключается по интерфейсу PS/2. Он имеет два рабочих контакта, это CLK и DATA. Клавиатура как управляемое устройство формирует бит на шине DATA в момент, когда CLK находится в падении. Следовательно в момент падения на CLK можно считать бит. Количество бит передаваемых от символа к символу может отличаться, но первые 8 однозначно определяют все клавиши имеющие 8 бит в своём значении.
[pic 1]
РАБОТА ПРОГРАММЫ
Настроено прерывание по спадающему сигналу (подключение к шине CLK). В этот момент считывается значение с шины DATA. В алгоритме описан случай, если на шине находится 0, в противном случае бит выставляется в 1. Так как бит может быть разное количество, а нужно только первые 8, то существует условие и после того как придет 8, они перестанут записываться. Запись происходит в переменную temp типа char побитово.
Контроллер понимает о том что символ передался, если в течении определенной задержки не приходит новых прерываний. В этот момент и начинается обработка пришедшего символа. Обработка символа является свитчем с заранее заданными значениями.
Для вывода используется LCD дисплей WH1604, используемый ранее в лабораторной работе.
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#define LCD_RS 0
#define LCD_RW 1
#define LCD_E 2
#define LCD_CLR 0
#define LCD_DDRAM 7
#define LCD_LINE0_DDRAMADDR 0x00
#define LCD_LINE1_DDRAMADDR 0x40
#define LCD_LINE2_DDRAMADDR 0x14
#define LCD_LINE3_DDRAMADDR 0x50
unsigned char name1[] = {'P', 'a', 'c', 'c', 0xBA, 'a', 0xB7, 'o', 0xB3,'A', 'p', 0xBF, 0xA2, 0xBC, 'o', 0xB3};
unsigned char name2[] = {'K', 'o', 0xBB, 'e', 'c', 0xBD, 'u',0xBA, 'o', 0xB3};;
char temp, clock = 1, i = 0;
void lcd_dat(uint8_t ch) //????? ??????? ?? ?????
{
PORTA=(ch&0b11110000);
PORTA|= 1<<LCD_RS;
PORTA|=1<<LCD_E;
_delay_ms(1);
PORTA&=~(1<<LCD_E);
PORTA&=~(1<<LCD_RS);
_delay_ms(1);
PORTA=((ch<<4)&0b11110000);
PORTA|=1<<LCD_RS;
PORTA|=1<<LCD_E;
_delay_ms(1);
PORTA&=~(1<<LCD_E);
PORTA&=~(1<<LCD_RS);
_delay_ms(1);
}
void lcd_com(uint8_t cmd) //???????? ??????? ?? ???????
{
PORTA=(cmd&0b11110000);
PORTA|=1<<LCD_E;
_delay_ms(1);
PORTA&=~(1<<LCD_E);
_delay_ms(1);
PORTA=((cmd<<4)&0b11110000);
PORTA|=1<<LCD_E;
_delay_ms(1);
PORTA&=~(1<<LCD_E);
_delay_ms(1);
}
void lcd_init(void) //????????????? ???????
{
_delay_ms(15);
PORTA=0x00;
DDRA|=0b11110000;
DDRA|=1<<LCD_E|1<<LCD_RW|1<<LCD_RS;
PORTA=0b00110000;
PORTA|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
_delay_ms(1);
PORTA&=~(1<<LCD_E);
_delay_ms(1);
PORTA=0b00110000;
PORTA|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
_delay_ms(1);
PORTA&=~(1<<LCD_E);
_delay_ms(1);
PORTA=0b00100000;
PORTA|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
_delay_ms(1);
PORTA&=~(1<<LCD_E);
_delay_ms(1);
lcd_com(0x28);
lcd_com(0x0C);
lcd_com(0x04);
}
void lcd_gotoxy(uint8_t x, uint8_t y)
{
register uint8_t DDRAMAddr;
switch(y)
{
case 1: DDRAMAddr=LCD_LINE1_DDRAMADDR+x; break;
case 2: DDRAMAddr=LCD_LINE2_DDRAMADDR+x; break;
...