⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 训练项目九:ps2键盘的使用.c

📁 长沙理工自己的实验程序
💻 C
字号:

/****************************************************************************
** File Name:          PS/2键盘的使用
** Createed By:        Wangchangsong
** Create Date:        07/29/2008
** Version:            1.0
** Descriptions:       led display
**
**---------------------------------------------------------------------------
** Modified By:
** Modified Date:
** Version:
** Descriptions:
**
****************************************************************************/

#include <iom128v.h>
#include <lcd.h>
#include <macros.h>
#pragma interrupt_handler ps:6
#define DATA PINE&0x20
unsigned char key = 0;
unsigned char shift = 0;
unsigned char up=0;
unsigned char flag=0;
unsigned char count=0;
unsigned char  UnShifted[60][2] = {
0x1C, 97,
0x32, 98,
0x21, 99,
0x23, 100,
0x24, 101,
0x2B, 102,
0x34, 103,
0x33, 104,
0x43, 105,
0x3B, 106,
0x42, 107,
0x4B, 108,
0x3A, 109,
0x31, 110,
0x44, 111,
0x4D, 112,
0x15, 113,
0x2D, 114,
0x1B, 115,
0x2C, 116,
0x3C, 117,
0x2A, 118,
0x1D, 119,
0x22, 120,
0x35, 121,
0x1A, 122,
0x45, 48,
0x16, 49,
0x1E, 50,
0x26, 51,
0x25, 52,
0x2E, 53,
0x36, 54,
0x3D, 55,
0x3E, 56,
0x46, 57,
0x0E, 39,
0x4E, 45,
0x55, 61,
0x5D, 92,
0x29, 32,
0x54, 91,
0x5B, 93,
0x4C, 59,
0x52, 39,
0x41, 44,
0x49, 46,
0x4A, 47,
0x71, 46,
0x70, 48,
0x69, 49,
0x72, 50,
0x7A, 51,
0x6B, 52,
0x73, 53,
0x74, 54,
0x6C, 55,
0x75, 56,
0x7D, 57,
0x0d, 9,
};
unsigned char  Shifted[59][2] = {
0x1C, 65,
0x32, 66,
0x21, 67,
0x23, 68,
0x24, 69,
0x2B, 70,
0x34, 71,
0x33, 72,
0x43, 73,
0x3B, 74,
0x42, 75,
0x4B, 76,
0x3A, 77,
0x31, 78,
0x44, 79,
0x4D, 80,
0x15, 81,
0x2D, 82,
0x1B, 83,
0x2C, 84,
0x3C, 85,
0x2A, 86,
0x1D, 87,
0x22, 88,
0x35, 89,
0x1A, 90,
0x45, 48,
0x16, 49,
0x1E, 50,
0x26, 51,
0x25, 52,
0x2E, 53,
0x36, 54,
0x3D, 55,
0x3E, 56,
0x46, 57,
0x0E, 126,
0x4E, 95,
0x55, 43,
0x5D, 124,
0x29, 32,
0x54, 123,
0x5B, 125,
0x4C, 58,
0x52, 34,
0x41, 60,
0x49, 62,
0x4A, 63,
0x71, 46,
0x70, 48,
0x69, 49,
0x72, 50,
0x7A, 51,
0x6B, 52,
0x73, 53,
0x74, 54,
0x6C, 55,
0x75, 56,
0x7D, 57,
};

/****************************************************************************
** Function Name:      ps      
** Descriptions:       read the key
** Input Parameters:   void
** Output parameters:  void
** Returned Value:     void
**---------------------------------------------------------------------------
****************************************************************************/

void ps (void)                                  /* 读键值                   */
{
    if((count>0)&&(count<9))
    {
    flag=0;                                     /* 标志位                   */  
    key=key>>1;
    if(DATA)
	  key|=0x80;
	else
	  key&=0x7f;
   }
    else 
    flag=1;
    count++;
	
    while(!(PINE&0x10));
		
    if(count>10)
    {
    count=0;
    }
}

unsigned char key_check (unsigned char data)       /*  查表,处理键值       */
{
    unsigned char i=0;
	
    switch(data)
    {
	case 0xf0:up=1;return(0);
    case 0x12:shift=(up==0)?1:0;return(0);
	case 0x59:shift=(up==0)?1:0;return(0);
	default:
        {
		if(up==0)
		{
		    if(shift==0)
		    {
			    for(i=0;i<60;i++)
				{
				    if (UnShifted[i][0]==data)
				    return(UnShifted[i][1]);
				 }
			}
			else if(shift==1)
		        {
				    for(i=0;i<59;i++)
				    {
				        if (Shifted[i][0]==data)
				        return(Shifted[i][1]);
				    } 
				  }
			}
			else
			    {
				up=0;
				return(0);
				}
        }
    }
}

/****************************************************************************
** Function Name:      main      
** Descriptions:       
** Input Parameters:   void
** Output parameters:  void
** Returned Value:     void
**---------------------------------------------------------------------------
****************************************************************************/

void main(void)
{

    unsigned char a=0;

    MCUCR=0;                                      /* MCU控制寄存器           */
    SEI();
    lcd_init();
    DDRE&=0xcf;                                   /* PE4和PE5作输入          */
    EIMSK=0x10;                                   /* 外部中断屏蔽寄存器      */                                 
    EICRB=0x02;                                   /* 外部中断寄存器B         */
    lcd_clear();
    while(1)                                      /* 显示在液晶显示器上      */
{ 
    a=key_check(key); lcd_putss(0,0,a);}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -