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

📄 ps2.c

📁 单片机与键盘接口程序
💻 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 + -