STM8 PS2接口应用子程序

来自丢石头百科
Admin讨论 | 贡献2019年11月19日 (二) 09:21的版本 (文本替换 - 替换“www.waveshare.net”为“{{SERVERNAME}}”)
<tbody></tbody>
软件设计

/********************************************************************* 微 雪 电 子 WaveShare <a class="Blue_2_12px_" href="http://wiki.diustou.com/" style="color: rgb(7, 66, 184);">http://www.waveShare.net   目 的: 建立PCF8563操作库 目标系统: 基于STM8单片机  应用软件: Cosmic CxSTM8  说 明: 若用于商业用途,请保留此段文字或注明代码来源 深 圳 市 微 雪 电 子 有 限 公 司 保 留 所 有 的 版 权 

                                                                                                                                          • /
  1. include <ws_i2c.h>

void PS2_Init(void) {        PRESS_DATA_DDR;        SHIFT_DATA_DDR;        IN_SDA; }

void check(void) {        static u8 rcvBits = 0; //接收次数,中断次数

       OUT_SCK; //设置"SCK_DDR"为输出        DELAY();        SET_SCK; //"SCK_PORT"输出"1"        DELAY();

       IN_SCK; //设置"SCK_DDR"为输入        DELAY();        if(!GET_SCK) {               if((rcvBits>0) && (rcvBits<9))               {                       keyVal=keyVal>>1; //数据是LSB格式                      //IN_SDA; //当有对键盘有属性设置时,注意输入输出切换                      //DELAY();                      if(GET_SDA)                              keyVal=keyVal|0x80;                }               rcvBits++;               while(!GET_SCK); //等待PS/2CLK拉高

              if(rcvBits>10)               {                      rcvBits=0; //接收11次表示接收完一帧数据                      rcvF=1; //标识有字符已经输入               }        } }

u8 keyHandle(u8 val)  {        u8 i;        static _Bool isUp=0; //按键释放动作标志        static _Bool shift=0; //shift键按下标志        rcvF = 0;         //PRESS_DATA_PORT = val; //状态指示        if(!isUp)        {               switch(val)               {                      case 0xF0 : // a relase action                             isUp = 1;                             break;                      case 0x12 : // Left shift                             shift = 1;                             break;                      case 0x59 : // Right shift                             shift = 1;                             break;                      default:                      if(!shift) // If shift not pressed                      {                              //for(i=0; unshifted[i][0]!=val && unshifted[i][0];i++);                             //上述写法较为灵活,但KEIL非UNIXC标准,不能采用该写法

                            for(i=0;unshifted[i][0]!=val && i<59; i++);                             if(unshifted[i][0] == val)                                     {                                    //SHIFT_DATA_PORT = val;                                    val = unshifted[i][1];                                    return val;                             } //状态指示                      }                       else // If shift pressed                      {                             //for(i=0; unshifted[i][0]!=val && unshifted[i][0]; i++);                             //上述写法较为灵活,但KEIL非UNIXC标准,不能采用该写法

                     for(i=0;shifted[i][0]!=val && i<59; i++);

                            if(shifted[i][0] == val)  {                                    //SHIFT_DATA_PORT = val;                                    val = shifted[i][1];                                    return val;                             }//状态指示

                           }                      }        }        else         {               isUp=0;               switch(val)               {                      case 0x12 : // Left SHIFT                             shift = 0;                             break;                      case 0x59 : // Right SHIFT                             shift = 0;                             break;                      }        }        return 0xff; }