Лабораторная работа №1
Цель работы: «Изучение принципов построения технических характеристик и параметров клавиатуры ПЭВМ»
Краткая теория
Порт 64H используется для записи команд и данных, а так же для чтения состояния клавиатуры. В него пересылаются коды команд и их операнды. Ниже приведены команды клавиатуры:
0ffh – сброс клавиатуры и запуск внутренней диагностики.
0feh – сброс последнего обмена.
0fdh – 0f7h – нет операций.
0f6h – установить стандартные клавиатуры и продолжить сканирование.
0f5h – установить стандартные клавиатуры и запретить сканирование.
0f4h – восстановить сканирование. МП8048 посылает «АСК», очищает внутренний буфер и начинает сканирование.
0f3h – установить скорость нажатия на клавиши и времена промежутков между нажатиями. Сначала нужно послать 0f3h, потом – байт данных:
0-4: установка скорости нажатий.
далее приводится таблица соответствия данных в битах 0-4 и скорости работы клавиатуры (в нажатиях в секунду):
Данные |
Скорость |
Данные |
Скорость |
0 |
30 |
0ah |
10 |
1 |
26.7 |
0dh |
9.2 |
2 |
24.0 |
10h |
7.5 |
4 |
20 |
14h |
5 |
8 |
15 |
1fh |
2 |
5-6: установка задержки перед перевым нажатием
00-250мс, 01-500мс, 10-750мс, 11-1000мс
7-всегда 0
0f2h-0efh – нет операций.
0edh – переключить световые индикаторы. Сначало посылается 0edh, затем байт данных:
0:1 – включить scrolllock.
0:2 – включить numlock.
0:3 – включить сapslock.
биты 3-7 не используются.
Осциллограммы сигналов:
1) P (Для всех осциллограмм параметры: 0,1 мкс/дел, 1В/дел):
2) L:
3) K:
4) M:
Значения скорости нажатия в секунду и задержек перед первым нажатием:
1) Теоретические значения: 2 симв./сек и 250 мсек
Практические значения:
2) Теоретические значения: 7.5 симв./сек и 500 мсек
Практические значения:
3) Теоретические значения: 26.7 симв./сек и 26.7 симв./сек
Практические значения:
Таблица скан и ASCII – кодов исследуемых клавиш:
Скан - кодов |
ASCII – кодов |
|
P |
25(00011001) |
112 |
L |
38(00100110) |
108 |
K |
37(00100101) |
107 |
M |
50(00110010) |
109 |
Листинг программной части
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
void Repeat(), Waiting(), Indicate(), Scan();
void Putmenu(char *title,char *menus[],int quantity)
{
clrscr();
printf("\n\n\n");
printf("\t\t\t %s\n\n",title);
int i=0;
while(i<quantity) {printf("\t\t\t %d %s \n",i+1,menus[i]);i++;}
printf("\n\t\t\t Ваш выбор ");
}
void main(){
int choice;
char *buff;
char *title={"Управление клавиатурой"};
char *menu[5]={"Установка частоты повтора","Установка времени задержки"
,"Управление индикаторами","Считать скан-код и ASСII-код клавиши","Выход"};
begin:
Putmenu(title,menu,5);
cin>>buff;
choice=atoi(buff);
if(choice==1) Repeat();
if(choice==2) Waiting();
if(choice==3) Indicate();
if(choice==4) Scan();
if(choice==5) exit(1);
goto begin;
}
void Waiting()
{
int choice;
char *buff;
while(1){
clrscr();
gotoxy(2,10);
printf("Выберите задержку перед повтором символов:\n 1-250 мсек\n"
" 2-500 мсек\n 3-750 мсек\n 4-1000 мсек\n"
" 5-выход\n");
cin>>buff;
choice=atoi(buff);
if(choice==1){ asm{
mov al,0xF3
out 0x60,al
mov al,00000000b
out 0x60,al
}}
if(choice==2){ asm{
mov al,0xF3
out 0x60,al
mov al,01000000b
out 0x60,al
}}
if(choice==3){ asm{
mov al,0xF3
out 0x60,al
mov al,00100000b
out 0x60,al
}}
if(choice==4){ asm{
mov al,0xF3
out 0x60,al
mov al,01100000b
out 0x60,al
}}
if(choice==5) return;
}
}
void Indicate()
{
int choice;
clrscr();
while(1){
gotoxy(2,10); printf("Что зажечь?\n");
gotoxy(2,11);printf("(нажмите нужную цифру(1-ScrollLock,2-NumLock,3-CapsLock,4-выход))");
choice=getch()-48;
if(choice==1){ asm{
mov al,0xED
out 0x60,al
mov al,00000001b
out 0x60,al
}}
if(choice==2){ asm{
mov al,0xED
out 0x60,al
mov al,00000010b
out 0x60,al
}}
if(choice==3){ asm{
mov al,0xED
out 0x60,al
mov al,00000100b
out 0x60,al
}}
if(choice==4) return;
}
}
void Repeat()
{
int choice;
char *buff;
while(1){
clrscr();
gotoxy(2,10);
printf("Выберите частоту повтора символов:\n 1-2 симв./сек\n"
" 2-7.5 симв./сек\n 3-20 симв./сек\n 4-26.7 симв./сек\n"
" 5-выход\n");
cin>>buff;
choice = atoi(buff);
if(choice==1){ asm{
mov al,0xF3
out 0x60,al
mov al,0x1F
out 0x60,al
}}
if(choice==2){ asm{
mov al,0xF3
out 0x60,al
mov al,0x10
out 0x60,al
}}
if(choice==3){ asm{
mov al,0xF3
out 0x60,al
mov al,0x4
out 0x60,al
}}
if(choice==4){ asm{
mov al,0xF3
out 0x60,al
mov al,0x1
out 0x60,al
}}
if(choice==5) return;
}
}
void Scan()
{
union REGS inregs, outregs;
inregs.h.ah=0x00;
clrscr();
char temp;
do{
int86(0x16, &inregs, &outregs);
cout<<"ASСII - code :"<<(int)outregs.h.al<<endl;
cout<<"SCAN - code :"<<(int)outregs.h.ah<<"(";
for(int i=0, mask=128; i<8; i++){
if(mask&(int)outregs.h.ah) cout<<"1"; else cout<<"0";
mask>>=1;
}
cout<<")"<<endl;
}while((int)outregs.h.al!=27);
}
Вывод: В результате проделанной работы были освоены принципы построения технических характеристик и параметров клавиатуры. Был проведен анализ ASCII и scan – кодов клавиатуры, их теоретического и практического значения. Разница между стандартом и полученными значениями объясняется использованием неодинаковых контролеров в клавиатурах. И между тем формат формируемых данных совпадает со стандартным.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.