Programación del teclado

Anuncio
PRÁCTICA 4: Programación del teclado con la
librería IO.DLL
En esta práctica se pretende programar el teclado de un PC enviando comandos a su
procesador (i8048), a través de su controlador (i8042) integrado en la placa base del PC.
La programación del teclado constará del encendido selectivo de los diferentes LEDs del
teclado, y de la modificación de los parámetros de repetición: Retraso y velocidad.
Todo ello a través de una interfaz gráfica de usuario implementada en VC++, en entorno
Windows, que permita modificar estos parámetros mediante “sliders” y botones, y permita
comprobar tecleando en un ventana dentro de la misma aplicación, el efecto de los cambios
en los parámetros de repetición.
El código de las clases más relevantes del programa es el siguiente:
// Teclado1.cpp : implementation file
//
#include "stdafx.h"
#include "teclado.h"
#include "Teclado1.h"
#include "io.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int leds = 0, teclado = 0;
//////////////////////////////////////////////////////////////////////
// CTeclado dialog
CTeclado::CTeclado(CWnd* pParent /*=NULL*/)
: CDialog(CTeclado::IDD, pParent)
{
//{{AFX_DATA_INIT(CTeclado)
m_bnum = FALSE;
m_bmay = FALSE;
m_bdes = FALSE;
//}}AFX_DATA_INIT
}
void CTeclado::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTeclado)
DDX_Control(pDX, IDC_SLIDER2, m_velocidad);
DDX_Control(pDX, IDC_SLIDER1, m_retraso);
DDX_Check(pDX, IDC_CHECK1, m_bnum);
DDX_Check(pDX, IDC_CHECK2, m_bmay);
DDX_Check(pDX, IDC_CHECK3, m_bdes);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTeclado, CDialog)
//{{AFX_MSG_MAP(CTeclado)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER1,
OnReleasedcaptureSlider1)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER2,
OnReleasedcaptureSlider2)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
ON_BN_CLICKED(IDC_CHECK3, OnCheck3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////
// CTeclado message handlers
BOOL CTeclado::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_retraso.SetRange(0,3,true);
m_velocidad.SetRange(0,31,true);
UpdateData(TRUE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
bool EnviarByteTeclado(unsigned char dato)
{
BYTE Valor;
do
{
Valor = PortIn(0x64);
Valor = Valor & 0x02;
}while(Valor != 0);
PortOut(0x60,dato);
do
{
Valor = PortIn(0x64);
Valor = Valor & 0x01;
}while(Valor == 0);
Valor = PortIn(0x60);
if(Valor == 0xfa) return true;
else return false;
}
void CTeclado::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
// RETRASO DEL TECLADO
int retr;
retr = m_retraso.GetPos();
while (!EnviarByteTeclado(0xf3));
retr = retr << 5;
teclado = teclado & 0x1f; //los bits 7 6 y 5 se ponen a cero
teclado = retr | teclado; //y ponemos la variación del retraso
while (!EnviarByteTeclado(teclado));
*pResult = 0;
}
void CTeclado::OnReleasedcaptureSlider2(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
// VELOCIDAD DEL TECLADO
int vel;
vel = m_velocidad.GetPos();
while (!EnviarByteTeclado(0xf3));
teclado = teclado & 0x60; //los bits 7 4 3 2 1 0 se ponen a cero
teclado = vel | teclado; //y ponemos la velocidad de repetición
while (!EnviarByteTeclado(teclado));
*pResult = 0;
}
void CTeclado::OnCheck1() //CHECKBOX
{
// TODO: Add your control notification handler code here
// BLOQ NUM (Byte 1)
UpdateData(TRUE);
int valor;
if(m_bnum!=0) valor=0x02;
else valor=0x00;
while (!EnviarByteTeclado(0xed));
leds = leds & 0x05; //bits 0 y 2 se quedan como estan
leds = leds | valor;
while (!EnviarByteTeclado(leds));
}
void CTeclado::OnCheck2() //CHECKBOX
{
// TODO: Add your control notification handler code here
// BLOQ MAY (Byte 2)
UpdateData(TRUE);
int valor;
if(m_bmay!=0) valor=0x04;
else valor=0x00;
while (!EnviarByteTeclado(0xed));
leds = leds & 0x03; //bits 0 y 1 se quedan como estan
leds = leds | valor;
while (!EnviarByteTeclado(leds));
}
void CTeclado::OnCheck3() //CHECKBOX
{
// TODO: Add your control notification handler code here
// BLOQ DESPL (Byte 0)
UpdateData(TRUE);
int valor;
if(m_bdes!=0) valor=0x01;
else valor=0x00;
while (!EnviarByteTeclado(0xed));
leds = leds & 0x06; //bits 1 y 2 se quedan como estan
leds = leds | valor;
while (!EnviarByteTeclado(leds));
}
Descargar