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

📄 pckey.c

📁 一个PS2键盘程序(LPC2200) 可以有键盘输入
💻 C
字号:
/****************************************************************************
* 文 件 名:pckey.c
* 功    能:键盘驱动
* 说    明:将跳线JP23全部短接,JP15跳线全部断开。
****************************************************************************/
#include "config.h"

/****************************************************************************
* 名    称:DelayMS()
* 功    能:短延时
* 入口参数:uint32 no  延时参数
* 出口参数:无
****************************************************************************/
void  DelayMS(uint32 no)
{   uint32  i;

    for(; no>0; no--)
        for(i=0; i<800; i++);
}

/****************************************************************************
* 名    称:SetKeyDatIn() 
* 功    能:设置DAT为输入
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetKeyDatIn(void) 
{   
    IO0DIR = IO0DIR & (~KEY_DAT);
}

/****************************************************************************
* 名    称:SetKeyDatOut() 
* 功    能:设置DAT为输出
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetKeyDatOut(void) 
{   
    IO0DIR = IO0DIR | KEY_DAT;
}

void SetKeyClkIn(void) 
{   
    IO0DIR = IO0DIR & (~KEY_CLK);
}

void SetKeyClkOut(void) 
{   
    IO0DIR = IO0DIR | KEY_CLK;
}
/****************************************************************************
* 名    称:WaitKeyClk0()
* 功    能:等待CLK变为低电平
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  WaitKeyClk0(void)
{   
    while((IO0PIN&KEY_CLK) == KEY_CLK);     // 等待CLK为低电平 
}

/****************************************************************************
* 名    称:WaitKeyClk1()
* 功    能:等待CLK变为高电平
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  WaitKeyClk1(void)
{   
    while((IO0PIN&KEY_CLK) == 0);           // 等待CLK为高电平
}


/****************************************************************************
* 名    称:SendKeyCmd()
* 功    能:发送键盘命令函数
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  SendKeyCmd(uint8 dat)
{   uint8  bitcnt;                          // 数据(位)计数器
    uint8  c_cnt;                           // 校验字变量

    WaitKeyClk1();                 			// 确认总线正常         
    
	SetKeyClkOut();    						// 通知键盘,主机要发送命令
    CKEY_CLK();                             // CLK = 0; 
    DelayMS(1);
    
    SetKeyDatOut();
    CKEY_DAT();                             // DAT = 0; 

    c_cnt = 0;     
    /* 发送11位数据,会有11个while(CLK==1) */
	SetKeyClkIn(); 
    WaitKeyClk0();                          // while(CLK==1);   已发送起始位
	 
    /* 发送8位命令数据 */    
    for(bitcnt=0; bitcnt<8; bitcnt++)
    {   if((dat&0x01) != 0)                 // 数据位的判断
        {   
            SKEY_DAT();                     // DAT=1;
            c_cnt++;                        // 校验字加1
        }   
        else
        {   
            CKEY_DAT();                     // DAT=0;
        }
        WaitKeyClk1();                      // while(CLK==0);        
        WaitKeyClk0();                      // while(CLK==1);
        
        dat = dat>>1;        	            // 对数据位进行移位处理
    }
           
    /* 发送C位,即校验位 */ 
    if((c_cnt&0x01) != 0)
    {   
        CKEY_DAT();                         // DAT=0;
    }
    else
    {   
        SKEY_DAT();                         // DAT=1;			        
    }
    WaitKeyClk1();                          // while(CLK==0); 
    WaitKeyClk0();                          // while(CLK==1);
    
    /* 发送停止位 */
    SKEY_DAT();                             // DAT=1;	    
    WaitKeyClk1();                          // while(CLK==0);
    WaitKeyClk0();                          // while(CLK==1); 
    
    SetKeyDatIn();                          // 恢复(主机)DAT为输入模式
    
    DelayMS(10);
}

/****************************************************************************
* 名    称:RcvKeyDat()
* 功    能:接收键盘的数据 
* 入口参数:无
* 出口参数:uint16  放开按键时,返回值高8位为0xFC
****************************************************************************/
uint16  RcvKeyDat(void)
{   uint16 key;
    uint8  i; 
        
    key = 0;                                // 键盘扫描码接收变量初化为0
    WaitKeyClk1();                          // while(CLK==0);  
    for(i=0; i<8; i++)                      // 读取8位数据
    {   
        key = key>>1;
        WaitKeyClk0();                      // while(CLK==1);        
        if((IO0PIN&KEY_DAT) == KEY_DAT)
        {  
            key = key+0x80;
        }
        
        WaitKeyClk1();                      // while(CLK==0);            
    }
    WaitKeyClk0();                          // while(CLK==1);	接收校验位
    WaitKeyClk1();                          // while(CLK==0);
    
    WaitKeyClk0();                          // while(CLK==1);	接收完一侦数据11个下降沿,即11位数据0 d0---d7 C 1
    WaitKeyClk1();                          // while(CLK==0);
    
    if(key==0xF0)                           // 若是放开码,则不处理    
    {   
        WaitKeyClk0();                      // while(CLK==1);
        WaitKeyClk1();                      // while(CLK==0); 
    
        for(i=0;i<8;i++)                    // 8个数据,即8个while(CLK==1)
        {   
            key = key>>1;
            WaitKeyClk0();                  // while(CLK==1);           
            if((IO0PIN&KEY_DAT) == KEY_DAT)
            {  
                key = key+0x80;
            }
        
            WaitKeyClk1();                  // while(CLK==0); 
        } 
        key |= 0xF000;
        
        WaitKeyClk0();                      // while(CLK==1);
        WaitKeyClk1();                      // while(CLK==0);
    
        WaitKeyClk0();                      // while(CLK==1);	第11位数据   
        WaitKeyClk1();                      // while(CLK==0);           
    }                                       // end of if(key==0xf0)...
    
    DelayMS(1);
    
    return(key);
}

/****************************************************************************
* 名    称:My_GetCh()
* 功    能:完整获得键值
* 入口参数:无
* 出口参数:uint16  读取到的按键值
****************************************************************************/
uint16  My_GetCh(void)
{  
    SetKeyDatIn();                          // 设置(主机)DAT为输入模式
    WaitKeyClk0();                          // 等待起动位,第一个CLK下降沿
    return(RcvKeyDat());
}




⌨️ 快捷键说明

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