3.2 КР580ВВ79 – программируемый контроллер клавиатуры и дисплея
Основные возможности микросхемы:
- Одновременная работа с клавиатурой и индикатором
- Режим сканирования контактной клавиатуры
- Режим сканирования сенсорной клавиатуры
- Режим стробируемого ввода
- Буферная память на 8 символов
- Режимы:
— блокировка одновременного нажатия
нескольких клавиш;
— независимое восприятие N клавиш.
- Устранение дребезга контактов.
- Микросхема может управлять:
— двумя цифровыми индикаторами по 8 и
16 цифр в строке;
— одним алфавитно-цифровым
индикатором на 16 символов в строке
- 16- байтное ОЗУ для хранения индицируемых знаков
- Строка-индикатор может заполняться символами как слева
направо, так и справа налево - Режимы работы задаются программно
- Частота сканирования задается программно
- По нажатию клавиши выдается прерывание.
Микросхема КР580ВВ79 – это универсальное программируемое
устройство ввода- вывода для сопряжения микропроцессора с клавиатурой и
индикаторным дисплеем.
УГО КP580BB79 приведено на рисунке 3.3.
На рисунке 3.4 представлена блок-схема программируемого интерфейса клавиатуры и дисплея КP580BB79.
Назначение каждого вывода описывается в таблице 3.2.
Одна часть микросхемы обеспечивает связь с клавиатурой,
которая может быть выполнена в виде 64-контактной клавишной матрицы либо в виде
набора сенсорных элементов. Клавиатура может быть выполнена также на основе
эффекта Холла или на основе изменения магнитной проницаемости ферритов – в этих
случаев применяется режим стробируемого ввода.
Возможны два основных варианта работа с клавиатурой:
- Запрещены (и считаются ошибочными) одновременные нажатия
нескольких клавиш. - N клавиш сканируются и воспринимаются независимо
друг от друга.
Коды нажатых клавиш освобождаются от помех, связанных с
дребезгом контактов, и заносятся в 8-байтовый буфер, организованный по принципу
FIFO – “первым записан – первым прочитан”.
Нажатия клавиш приводят к выдаче сигнала прерывания, который должен быть
заведен в микропроцессор, использующий данную микросхему.
Другая часть микросхемы КР580ВВ79 обеспечивает работу в
режиме сканирования (временного мультиплексирования) индикатора на светодиодах,
жидких кристаллах или другого распространенного типа. Можно использовать как
цифровые, так и алфавитно-цифровые индикаторы либо простые лампочки.
Микросхема КР580ВВ79 снабжена ОЗУ 16х8 бит, которое можно
использовать также и как два ОЗУ 16х4 бита. Это ОЗУ, предназначенное для
хранения воспроизводимых на индикаторе символов, может загружаться и
опрашиваться программно – процессором.
Воспроизводимая строка символов может заполняться слева
направо, как в пишущей машинке, либо справа налево, как в калькуляторе. И
чтение, и запись дисплейного ОЗУ могут выполнять с автоматическим прекращением
адреса.
Рисунок 3.3 — УГО КP580BB79
Рисунок 3.4 — Блок-схема
программируемого интерфейса клавиатуры и дисплея КР580ВВ79
Режимы ввода:
Ø Сканирование контактной клавиатуры:
— 8х8 клавиш – в режиме внешней
дешифрации столбцов клавиатуры;
— 4х8 клавиш – в режиме внутренней
дешифрации столбцов клавиатуры;
Нажатие клавиши порождает 6-битовый код, задающий положение
клавиши в матрице (3 бита – номер столбца, 3 бита – номер строки). Координата
клавиши, а также состояние CNTL и SHIFT запоминаются в буфере типа FIFO. Данные автоматически очищаются от
дребезга контактов клавиатуры. При этом возможно блокирование одновременного
нажатия клавиш или же независимое восприятие N клавиш.
Ø Сканирование матрицы сенсорных
элементов:
— 8х8 клавиш – в режиме внешней
дешифрации столбцов клавиатуры;
— 4х8 клавиш – в режиме внутренней
дешифрации столбцов клавиатуры;
Состояние клавишных ключей (разомкнутое или замкнутое)
запоминается в ОЗУ, к которому имеет доступ центральный процессор.
Ø Стробируемый ввод:
данные
с линии RL7..RL, стробируемые сигналом STB, заносятся в
буфер типа FIFO.
Режимы отображения информации:
Ø 8- или 16-символьные динамические
индикаторы, которые могут быть организованы либо как два 4-битовые, либо как
один 8-битовый.
1.6. .
:
, ,
(), ( ,
,
).
.
(. ) ,
.
5.
25 425 200300 |
( 10 ), , , |
, |
|
— 0,75,5 50100 2070 — 2,545 2070 — 0,11,3 |
, , , |
, |
|
20300 4,57,0 2050 70150 |
, |
, |
|
190220 120170 2540 |
, |
( )
, ,
.
, 40 .
58079
.
,
.
.
,
.
58079
16 .
» »
, (
).
, .
DSPB0DSPB3 ( , D0D3 ) DSPA0DSPA3 ( , D4D7).
, DSP .
«».
00,
. CLR DSP .0.
(,
)
/ » «.
.
, .
, ,
.
, (
),
. . —
,
«» .
, ,
+8 (=07)
, ,
, .
, +4, +8, +0h
(=03).
IBM-
— «Centronics»
( LPT),
.
(), , ,
, -.
IBM PC- .
Centronix, 36
( -).
:
—
,
3BCh — 3BEh;
—
, 378h — 37Ah
( ) 278h — 27Ah ( ).
—
( ); BIOS, 0:408h(LPT1)
LPT4. ,
378h.
────────────────────────────────────────────────────────────────
378h — ,
—
堠 —
,
379h 堠 :
7 6 5
4 3 2 1 0
┌──┬──┬──┬──┬──┬─┬─┬─┐
│
│ │ │
│
│X│X│X│ :
└┬─┴┬─┴┬─┴┬─┴┬─┴─┴─┴─┘
─────
│ │ │
│
└─────────>
3: 0=
│ │ │
└────────────>
4: 0=
│ │
└───────────────>
5: 1= » «
│
└──────────────────>
6: 0=
│
└─────────────────────>
7: 0= ,
37Ah / :
7
6 5 4 3
2 1 0
┌─┬─┬─┬──┬──┬──┬──┬──┐
│X│X│X│ │
│ │ │
│ :
└─┴─┴─┴┬─┴┬─┴┬─┴┬─┴┬─┘
─────
│ │ │
│ └───>
0:
│ │ │
└──────> 1: 1=
│ │ │ ( MS-DOS
│ │ │ )
│ │
└─────────>
2: 1=
│
└────────────>
3: 1= (
│
)
└───────────────>
4: 1=
,
( , ,
). ,
( ),
(16 )
,
. ,
,
.
(),
( , ).
6.
SB1SB13 |
«0»»9″, |
() |
SB14 |
«» |
|
SB15 |
«» |
|
SB16 |
«» |
,
,
.
,
.
7.
DAT0DAT7 |
+ |
+ |
|
INS/D |
+ |
— |
|
IORC |
+ |
— |
|
IOWC |
+ |
— |
|
RESET |
+ |
— |
|
PCLK |
+ |
— |
|
IRQ |
— |
— |
Turbo Pascal 7.0 MS-DOS 6.22 .
— .
. . (378h), (INS/D, IORC, IOWC, RESET, PCLK, IRQ)
(37Ah),
(379h).
8.
.
LPT |
|||||||||||||||||
37Ah |
378h |
||||||||||||||||
X |
X |
X |
INS/D |
IORC |
IOWC |
RESET |
PCLK |
DAT7 |
DAT6 |
DAT5 |
DAT4 |
DAT3 |
DAT2 |
DAT1 |
DAT0 |
||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
||||
X |
X |
X |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
( 07) |
X |
X |
X |
1 |
1 |
1 |
1 |
||||||||||
( ) |
X |
X |
X |
1 |
1 |
1 |
1 |
1 |
|||||||||
( ) |
X |
X |
X |
1 |
1 |
||||||||||||
INT |
X |
X |
X |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||
() |
X |
X |
X |
1 |
1 |
X |
X |
X |
|||||||||
() |
X |
X |
X |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
||||||
X |
X |
X |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
||||||||
X |
X |
X |
1 |
1 |
|||||||||||||
X |
X |
X |
1 |
1 |
1 |
||||||||||||
. ; ?
.
,
|
,
|
1.
580
— 58079. ( )
.
(
)
,
.
2-23 ,
.
10 ,
, , ,
.
58079
IBM PC.
, .
,
,
, ,
. ,
.
, ,
,
( )
, .
58079,
,
.
1. -,
. 8086/8088. ,
., . . , .: , 1987.
2.
. . .., , 1980.
3.
, .
{
58079
: ..}
program
KR580;
uses
crt,dos;
const
Recode: array of byte = ($01,$02,$04,$08,$10,$20,$40,$80,$03,$05,
$09,$0B,$12,$22,$42,$82);
{}
Code: array of integer = (1,2,3,3,3,4,4,5,6,6,0,0,0,0,0,0);
var
i,k:integer;
Display:array of integer;
tmp:byte;
OK : boolean;
label
NEW,AGAIN;
procedure
OutByte(portN,bte:byte);{ }
begin
case portN of
$378:
asm
mov al,bte
out $378,al
end;
$37A:
asm
mov al,bte
out $37A,al
end;
end(*case*);
Delay(10);
end;
function
InByte(portN:byte):byte;{ }
begin
case portN of
$378:
asm
in al,$378
end;
$379:
asm
in al,$379
end;
$37A:
asm
in al,$37A
end;
end(*case*);
asm
mov InByte,al
end;
Delay(10);
end;
procedure Init; { }
begin
OutByte($37A,$03); {a }
OutByte($37A,$19); { }
OutByte($378,$19);
{ }
end;
procedure Wait; { }
begin
repeat until InByte($379) 0;
end;
procedure
OutToDisplay(Symbol:integer); { }
{ }
const
Recode:array of byte =
($60,$da,$f2,$66,$b6,$be,$e0,$fe,$f6,$fc,$ee,$3e,$9c,$9e,$8c);
begin
OutByte($37A,$09);
OutByte($378,Recode);
end;
function
StatusWord:boolean;{ }
var
SW:byte;
begin
StatusWord := false;
OutByte($37A,$15);
SW := InByte($378);
if SW 0 then StatusWord := TRUE;
end;
procedure
ResetINT; {
INT}
begin
OutByte($37A,$19);
OutByte($378,$F0);
end;
procedure ResetDSPL;{ }
begin
OutByte($37A,$19);
OutByte($378,$D2);
end;
procedure
Bell;{ }
begin
Sound(1200);
Delay(1000);
NoSound;
end;
function
GetChar:byte; { }
begin
If not StatusWord then
begin
OutByte($37A,$19);
OutByte($378,$40);
OutByte($37A,$05);
GetChar := Inbyte($378);
if GetChar = 0 then
begin
OutByte($37A,$19);
OutByte($378,$41);
OutByte($37A,$05);
GetChar := Inbyte($378)+2;
end
else
begin
Bell;Bell;
WriteLN(‘ !!!’);
end;
ResetINT;
end;
begin
AGAIN:
Init;
k := 0;
repeat
begin
Wait;
tmp := GetChar;
i := 0;
repeat
inc(i);
until Recode = tmp;
inc(k);
case i of
1..13: begin
Display := i;
OutToDisplay(i);
end; {}
14: k:=16; {}
15: goto
AGAIN;{}
16: Bell; {}
end(*case*);
end;
until k=16;
for i:=0 to
16 do
if Display Code then OK :=
true; { }
if OK then Exec(‘proc.exe,»); { ,
}
goto AGAIN;
end.