STM8应用笔记 STM8单片机笑傲江湖 STM8 PS2接口应用子程序

STM8 PS2接口应用子程序

以下资料由微雪电子整理并发布,未经许可不得转载,否则追究相应责任!

软件设计

/*********************************************************************
微 雪 电 子 WaveShare http://www.waveShare.net
目 的: 建立PCF8563操作库
目标系统: 基于STM8单片机
应用软件: Cosmic CxSTM8
说 明: 若用于商业用途,请保留此段文字或注明代码来源
深 圳 市 微 雪 电 子 有 限 公 司 保 留 所 有 的 版 权
*********************************************************************/

#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;
}

STM8 PS2接口应用子程序

——