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