以下资料由微雪电子整理并发布,未经许可不得转载,否则追究相应责任!
软件设计 |
---|
/*********************************************************************
微 雪 电 子 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接口应用子程序
——