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)); }