📄 ps2.c
字号:
/*******************************************************************************
* 标题: 蓝海微芯LJD-SY-5200单片机开发系统演示程序 *
* 文件: ps2.c *
* 日期: 2006-8-11 *
* 版本: 1.0 *
* 作者: 蓝海微芯 *
* 网站: http://www.ljd-2008.com *
********************************************************************************
* 描述: *
* ps/2键盘测试程序 *
* *
* *
********************************************************************************
* 【版权】 Copyright(C)微芯科技 http://www.bluemcu.com All Rights Reserved *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
*******************************************************************************/
#include "define.h"
#include "code.h"
#include "LCD1602.h"
#define uchar unsigned char
bit revchar_flag=0;
unsigned char mcu_revchar=0;
unsigned char led_status=0;
unsigned char (*keycode)[2];
unsigned char code ASCII[] ="0123456789ABCDEF";
uchar xdata disp_num[10] = "0123456789";
uchar xdata disp_letter[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
uchar xdata disp_enter[5] = "Enter";
uchar xdata disp_shift[5] = "Shift";
uchar xdata disp_back[10] = "Back Space";
uchar xdata disp_space[5] = "Space";
uchar xdata disp_ctrl[4] = "Ctrl";
uchar xdata disp_tab[3] = "Tab";
uchar xdata disp_cap[9] = "Caps Lock";
uchar xdata disp_esc[3] = "Esc";
uchar xdata disp_alt[3] = "Alt";
uchar xdata disp_lock[8] = "Num Lock";
uchar xdata disp_insert[6] = "Insert";
uchar xdata disp_delete[6] = "Delete";
uchar xdata disp_end[3] = "End";
uchar xdata disp_home[4] = "Home";
uchar xdata disp_page_up[7] = "Page Up";
uchar xdata disp_page_down[9] = "Page Down";
uchar xdata disp_right[5] = "Right";
uchar xdata disp_left[4] = "Left";
uchar xdata disp_up[2] = "Up";
uchar xdata disp_down[4] = "Down";
/*
void delay100us (int us)
{
int i; // millisecond counter
int count;
count=SYSCLK/120000;
TCON &= ~0x30; // Stop Timer0 and clear overflow flag
TMOD |= 0x01;
//ET0=1;
for (i = 0; i < us; i++)
{ // count milliseconds
TH0 = (-count) >> 8; // Set Timer0 to overflow in 50us
TL0 = -count;
TR0 = 1; // Start Timer0
while (TF0 == 0); // wait for overflow
TF0 = 0; // clear overflow indicator
TR0 = 0; // Stop Timer0
}
//ET0=0;//close the interrupt
}
//单片机向PS/2设备发送数据程序
void ps2_sentchar(unsigned char sentchar)
{
unsigned char sentbit_cnt = 0x00;
unsigned char sentchar_chk = 0x00;
EX0 =0;
//发起一个传送,发起始位
PS2_CLK = 0;
delay100us(1);
PS2_DIO = 0; //起始位
PS2_CLK = 1;
//发送DATA0-7
for(sentbit_cnt = 0; sentbit_cnt < 8; sentbit_cnt++)
{
while(PS2_CLK); //等待时钟线变为低
PS2_DIO = sentchar & 0x01; //发送数据
if(PS2_DIO)sentchar_chk++; //计算校验
while(!PS2_CLK); //等待时钟线变高
sentchar >>= 1; //待发送数据右移一位
}
//发送校验位
while(PS2_CLK); //等待时钟线变为低
switch(sentchar_chk)
{
case 0:
case 2:
case 4:
case 6: PS2_DIO = 1; break; //奇校验
case 1:
case 3:
case 5:
case 7: PS2_DIO = 0; break; //奇校验
default: break;
}
while(!PS2_CLK); //等待时钟线变高
while(PS2_CLK); //等待时钟线变为低
//发送停止位,停止位总为1
PS2_DIO = 1;
while(!PS2_CLK); //等待时钟线变高
while(PS2_CLK); //等待时钟线变为低
//接收ACK
//if(PS2_DIO) error(); //ACK信号由键盘发出,总为低电平
while(!PS2_CLK); //等待时钟线变高
EX0 = 1;
}
*/
void ps2ini(void)
{
IT1=1; //外部中断1设置为下降沿触发
EX1=1; //允许外部中断1
keycode=key;
}
//单片机由PS/2键盘接收数据程序:
void Int1_ISR() interrupt 2
{
static unsigned char ps2_revchar_cnt=0;
EX1=0;
switch(ps2_revchar_cnt)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
mcu_revchar >>= 1;
if(PS2_DIO)
mcu_revchar |= 0x80;
ps2_revchar_cnt++;
break;
case 0:
ps2_revchar_cnt++;
break; //开始位,
case 9:
ps2_revchar_cnt++;
break; //校验位,可添加校验程序
case 10:
ps2_revchar_cnt=0; //停止位
revchar_flag=1; //置接收到数据标志位
break;
default:
break;
}
EX1=1;
}
void decode(void)
{
static unsigned char is_up=0;
//static unsigned char is_numlock=0;
//static unsigned char is_capslock=0;
static unsigned char j;
unsigned char i;
CLEARSCREEN;
// LCD_write_char(2,0,ASCII[mcu_revchar>>4]);
// LCD_write_char(2,1,ASCII[mcu_revchar&0x0f]);
if(j>16) j=0;
switch (mcu_revchar)
{
case 0xF0 :// The up-key identifier
is_up = 2;
break;
case 0xE0 :
keycode=key_ex;
break;
/*
case 0x77 :
if(is_up==0)
if(is_numlock==0)
{
led_status |=0x02;
is_numlock=1;
}
else
{
led_status &=~0x02;
is_numlock=0;
}
ps2_sentchar(led_status);
break;
case 0x58 :
if(is_up==0)
if(is_capslock==0)
{
led_status |=0x04;
is_capslock=1;
}
else
{
led_status &=~0x04;
is_capslock=0;
}
ps2_sentchar(led_status);
*/
default:
for(i = 0; keycode[i][0]!=mcu_revchar && keycode[i][0]; i++);
if (keycode[i][0] == mcu_revchar) //键值
{
LCD_write_char(2,0,keycode[i][1]); //按键名
LCD_write_char(2,1,'='); //按键名
LCD_write_char(2,2,ASCII[mcu_revchar>>4]);//键值高
LCD_write_char(2,3,ASCII[mcu_revchar&0x0f]);//键值低
//printf("K%c%c ",keycode[i][1],is_up);
if(is_up==2)
{
keycode=key; //defaule is key[][2];
is_up=0;
}
}
break;
}
// LCD_write_char(2,2,ASCII[mcu_revchar>>4]);
// LCD_write_char(2,3,ASCII[mcu_revchar&0x0f]);
/*以下程序段实现的功能是,在液晶屏上显示PS/2键盘上按键的键符*/
/*
switch(mcu_revchar)
{
case 0x1C:
LCD_write_char(2,1,disp_letter[0]);
break;
case 0x32:
LCD_write_char(2,1,disp_letter[1]);
break;
case 0x21:
LCD_write_char(2,1,disp_letter[2]);
break;
case 0x23:
LCD_write_char(2,1,disp_letter[3]);
break;
case 0x24:
LCD_write_char(2,1,disp_letter[4]);
break;
case 0x2b:
LCD_write_char(2,1,disp_letter[5]);
break;
case 0x34:
LCD_write_char(2,1,disp_letter[6]);
break;
case 0x33:
LCD_write_char(2,1,disp_letter[7]);
break;
case 0x43:
LCD_write_char(2,1,disp_letter[8]);
break;
case 0x3b:
LCD_write_char(2,1,disp_letter[9]);
break;
case 0x42:
LCD_write_char(2,1,disp_letter[10]);
break;
case 0x4b:
LCD_write_char(2,1,disp_letter[11]);
break;
case 0x3a:
LCD_write_char(2,1,disp_letter[12]);
break;
case 0x31:
LCD_write_char(2,1,disp_letter[13]);
break;
case 0x44:
LCD_write_char(2,1,disp_letter[14]);
break;
case 0x4d:
LCD_write_char(2,1,disp_letter[15]);
break;
case 0x15:
LCD_write_char(2,1,disp_letter[16]);
break;
case 0x2d:
LCD_write_char(2,1,disp_letter[17]);
break;
case 0x1b:
LCD_write_char(2,1,disp_letter[18]);
break;
case 0x2c:
LCD_write_char(2,1,disp_letter[19]);
break;
case 0x3c:
LCD_write_char(2,1,disp_letter[20]);
break;
case 0x2a:
LCD_write_char(2,1,disp_letter[21]);
break;
case 0x1d:
LCD_write_char(2,1,disp_letter[22]);
break;
case 0x22:
LCD_write_char(2,1,disp_letter[23]);
break;
case 0x35:
LCD_write_char(2,1,disp_letter[24]);
break;
case 0x1a:
LCD_write_char(2,1,disp_letter[25]);
break;
case //0x70:
0x45:
LCD_write_char(2,1,disp_num[0]);
break;
case //0x69:
0x16:
LCD_write_char(2,1,disp_num[1]);
break;
case //0x72:
0x1e:
LCD_write_char(2,1,disp_num[2]);
break;
case //0x7a:
0x26:
LCD_write_char(2,1,disp_num[3]);
break;
case //0x6b:
0x25:
LCD_write_char(2,1,disp_num[4]);
break;
case //0x73:
0x2e:
LCD_write_char(2,1,disp_num[5]);
break;
case //0x74:
0x36:
LCD_write_char(2,1,disp_num[6]);
break;
case //0x6c:
0x3d:
LCD_write_char(2,1,disp_num[7]);
break;
case //0x75:
0x3e:
LCD_write_char(2,1,disp_num[8]);
break;
case //0x7d:
0x46:
LCD_write_char(2,1,disp_num[9]);
break;
case 0x29:
for(i=0;i<5;i++)
{
LCD_write_char(2,1,disp_space[i]);
}
break;
case 0x66:
for(i=0;i<10;i++)
{
LCD_write_char(2,1,disp_back[i]);
}
break;
case 0x12:
//0x59:
for(i=0;i<5;i++)
{
LCD_write_char(2,1,disp_shift[i]);
}
break;
case 0x14:
for(i=0;i<4;i++)
{
LCD_write_char(2,1,disp_ctrl[i]);
}
break;
case 0x5a:
for(i=0;i<5;i++)
{
LCD_write_char(2,1,disp_enter[i]);
}
break;
case 0x11:
for(i=0;i<3;i++)
{
LCD_write_char(2,1,disp_alt[i]);
}
break;
case 0x0d:
for(i=0;i<3;i++)
{
LCD_write_char(2,1,disp_tab[i]);
}
break;
case 0x58:
for(i=0;i<9;i++)
{
LCD_write_char(2,1,disp_cap[i]);
}
break;
case 0x77:
for(i=0;i<8;i++)
{
LCD_write_char(2,1,disp_lock[i]);
}
break;
case 0x70:
for(i=0;i<6;i++)
{
LCD_write_char(2,1,disp_insert[i]);
}
break;
case 0x6c:
for(i=0;i<4;i++)
{
LCD_write_char(2,1,disp_home[i]);
}
break;
case 0x7d:
for(i=0;i<7;i++)
{
LCD_write_char(2,1,disp_page_up[i]);
}
break;
case 0x7a:
for(i=0;i<9;i++)
{
LCD_write_char(2,1,disp_page_down[i]);
}
break;
case 0x69:
for(i=0;i<3;i++)
{
LCD_write_char(2,1,disp_end[i]);
}
break;
case 0x71:
for(i=0;i<6;i++)
{
LCD_write_char(2,1,disp_delete[i]);
}
break;
case 0x6b:
for(i=0;i<4;i++)
{
LCD_write_char(2,1,disp_left[i]);
}
break;
case 0x75:
for(i=0;i<2;i++)
{
LCD_write_char(2,1,disp_up[i]);
}
break;
case 0x74:
for(i=0;i<5;i++)
{
LCD_write_char(2,1,disp_right[i]);
}
break;
case 0x72:
for(i=0;i<4;i++)
{
LCD_write_char(2,1,disp_down[i]);
}
break;
default:
break;
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -