立即注册 找回密码

微雪课堂

搜索
微雪课堂 STM8 STM8单片机笑傲江湖 查看内容

STM8 PS2接口应用子程序

2015-7-16 13:53| 发布者: waveshare-admin| 查看: 4356| 评论: 0

摘要: 软件设计/*********************************************************************微 雪 电 子 WaveSharehttp://www.waveShare.net目 的: 建立PCF8563操作库目标系统: 基于STM8单片机应用软件: Cosmic CxSTM8说 明: ...
软件设计

/*********************************************************************
微 雪 电 子 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;
}

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


421

顶一下

刚表态过的朋友 (421 人)

最新评论

所有教程
STM8

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-3-29 01:33 , Processed in 0.032829 second(s), 20 queries .

返回顶部