Разработка контроллеров клавиатуры и индикации. Строки и колонки через подтягивающие резисторы

Страницы работы

Фрагмент текста работы

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

Кафедра автоматики и вычислительной техники

Отчет по лабораторной работе №3

(Учебная дисциплина «Автоматизации проектирования дискретных устройств»)

Разработка контроллеров клавиатуры и индикации.

Работу выполнил студент группы №3081/2                     

Работу принял преподаватель___________                         

Санкт-Петербург

2010

1. Контроллер клавиатуры.

Контроллер должен осуществлять прием и преобразование сигналов от клавиатуры. Клавиатура представляет собой матрицу 4х4 в узлах которой расположены кнопки. Кнопки образуют связь между проводниками строки (ROW) и столбца (COL).

Рис 1.1. Схема клавиатуры.

Строки и колонки через подтягивающие резисторы подключены к земле, поэтому на не подключенных проводниках будет низкий уровень сигнала.

Сканирование клавиатуры происходит следующим образом.

COL[3..0] – подключены к выводам контроллера и является сканирующим портом. На выход COL[3..0] подается значение состоящее из одной единицы и нулей.

ROW[3..0] – подключены к выводам контроллера как входы и являются читающим портом. Если клавиша не нажата, то на ROW[3..0] будут все нули, а если нажата и на эту колонку подана 1 с выходов COL[3..0], то в соответствующем разряде ROW[3..0] будет 1. По значениям ROW[3..0]  и COL[3..0] можно будет понять какая нажата клавиша.


Рис 1.2. Схема контроллера клавиатуры.

Двоичный счетчик Counter_Scan работает в режиме прямого двоичного счета, перебирая все четырехразрядные двоичные комбинации кода QC[3..0]. Два старших разряда этого кода декодируются дешифратором Decoder_Col, а два младших разряда поступают на управляющие входы мультиплексора Mux_ROW.

Таким образом при сканировании одной колонки проверяются поочередно все клавиши в ней. Если нажата какая либо из клавиш, то по сигналу E_SEL происходит остановка счетчика  Counter_Scan QC[3..0] является скан-кодом нажатой клавиши.

При нажатии клавиши, контроллер формирует выходной сигнал Ready, показывающий, что кнопка нажата и данные сканирования готовы.

Для обеспечения длительности цикла работы счетчика Counter_Scan порядка 20 мс (необходимо для устранения дребезга контактов клавиатуры) на его вход clk_en подается сигнал E_Clk с выхода переноса пятнадцатиразрядного счетчика Prescaler.

Моделирование работы контроллера клавиатуры:


Рис 1.3. Моделирование контроллера клавиатуры.

В данном тесте моделируется нажатие клавиш — A, 5 и *.

При нажатии A, на ROW[3..0] установился сигнал 0001 при сканировании 4й колонки (код COL[3..0] = 1000). Счетчик продолжает считать до 1111, так как первая строка опрашивается последней по заданному порядку сканирования.

Преобразователь скан-кода клавиши в семисегментный код.

Для отображения нажимаемых клавиш, можно использовать семисегментные индикаторы, но для этого необходим преобразователь скан-кода клавиши в семисегментный.

Преобразователь построен в соответствии со следующей таблицей:

Клавиша

Скан-код

Семисегментный код

1

0011

0110000

2

1011

1101101

3

0111

1111001

4

0000

0110011

5

1000

1011011

6

0100

1011111

7

0001

1110000

8

1001

1111111

9

0101

1111011

0

1010

1111110

A

1111

1110111

B

1100

0011111

C

1101

1001110

D

1110

0111101

*

0010

0110111

#

0110

0110110

Листинг 1. Seven_Segments.vhd.

LIBRARY ieee;                                              

USE ieee.std_logic_1164.all;     

ENTITY  Seven_Segments is

port(

DATA: in std_logic_vector (3 downto 0);

A:   out std_logic;

B:   out std_logic;

C:   out std_logic;

D:   out std_logic;

E:   out std_logic;

F:   out std_logic;

G:   out std_logic

);

END ENTITY Seven_Segments;

ARCHITECTURE Seven_Segments_arch of Seven_Segments is

signal SevSeg : std_logic_vector (7 downto 1);

BEGIN

SevSeg <= "0110000" WHEN DATA="0011" ELSE

"1101101" WHEN DATA="1011" ELSE

"1111001" WHEN DATA="0111" ELSE

"0110011" WHEN DATA="0000" ELSE

"1011011" WHEN DATA="1000" ELSE

"1011111" WHEN DATA="0100" ELSE

"1110000" WHEN DATA="0001" ELSE

"1111111" WHEN DATA="1001" ELSE

"1111011" WHEN DATA="0101" ELSE

"1111110" WHEN DATA="1010" ELSE

"1110111" WHEN DATA="1111" ELSE

"0011111" WHEN DATA="1100" ELSE

"1001110" WHEN DATA="1101" ELSE

"0111101" WHEN DATA="1110" ELSE

"0110111" WHEN DATA="0010" ELSE

"0110110";   

A <= SevSeg(1);

B <= SevSeg(2);

C <= SevSeg(3);

D <= SevSeg(4);

E <= SevSeg(5);

F <= SevSeg(6);

G <= SevSeg(7);

END ARCHITECTURE;


Рис. 1.4. Использование преобразователя в 7сегментный код.

При нажатии клавиш на клавиатуре, они высвечиваются на индикаторах.

2. Контроллер динамической индикации.

Контроллер динамической индикации осуществляет поочередное обращение к знакоместам на семисегментном индикаторе, в отличие от статической индикации, где обращение идет одновременно ко всем знаклместам.


Рис.2.1. Схема контроллера динамической индикации.

Counter_CDI - счетчик, обеспечивающий циклическое обращение к знакоместам в режиме разделения времени. Частота переключения счетчика порядка 800 Гц определяется сигналом CNT_en, подаваемым на его вход разрешения работы.

Decoder_Col - обеспечивает выбор одного знакоместа в каждый момент времени, задаваемый состоянием счетчика.

Mux_CDI - работая синхронно с дешифратором, обеспечивает подключение данных, соответствующих активному в данный момент знакоместу.

Отладка контроллера осуществлялась с помощью стандартных средств отладки пакета Quatus II, а именно редактора ISSPE.


Рис.2.2. Отладка контроллера динамической индикации с помощью ISSPE.

В ISSPE задаем скан-коды клавиш и смотрим как они отображаются

Похожие материалы

Информация о работе