📄 ps2.c
字号:
#include "c:\keil\c51\inc\atmel\at89x52.h"
#include "intrins.h"
typedef unsigned char UINT8;
typedef unsigned int UINT16;
#define sclk P3_0
#define dat P3_1
void delay_100us()
{
UINT8 i = 50;
while (i--);
}
UINT8 CheckSum(UINT8 dat)
{
UINT8 temp,i;
for ( temp = 0,i= 0; i< 8;i++)
{
temp += (dat & 0x01);
dat >>= 1;
}
temp += 1;
temp &= 0x01; //求奇偶校验和,偶数个1为1
return temp;
}
UINT8 PCSendComm(UINT8 comm)
{
UINT8 i;
UINT8 checksum;
sclk = 0; //拉低时钟线
//delay_100us();
checksum = CheckSum(comm); //求检验和
dat = 0; //发送起始低电平
sclk = 1;
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = comm & 0x01; //发送DATA0
comm >>= 1; //在时钟上升沿转换数据
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = comm & 0x01; //发送DATA1
comm >>= 1; //在时钟上升沿转换数据
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = comm & 0x01; //发送DATA2
comm >>= 1; //在时钟上升沿转换数据
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = comm & 0x01; //发送DATA3
comm >>= 1; //在时钟上升沿转换数据
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = comm & 0x01; //发送DATA4
comm >>= 1; //在时钟上升沿转换数据
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = comm & 0x01; //发送DATA5
comm >>= 1; //在时钟上升沿转换数据
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = comm & 0x01; //发送DATA6
comm >>= 1; //在时钟上升沿转换数据
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = comm & 0x01; //发送DATA7
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = checksum; //发送检验和
while (sclk); //等待出现下降沿
while (!sclk); //等待下个时钟上升沿
dat = 1; //发送停止位1
while (sclk); //等待出现下降沿
while (!sclk); //等待高电平结束!!很重要,必须
checksum = 0;
checksum |= dat; //下降沿时读取从机ACK
return checksum;
}
UINT8 PCReceData()
{ UINT8 rece_data = 0;
UINT8 checksum,temp;
while (sclk); //等待从机应答的第一个时钟下降沿出现
if (!dat) //检查是否收到开始低电平,否则停止接收
{
while (!sclk); //等待起始低电平结束
while (sclk); //等待时钟下降沿,接收data0
rece_data |= dat; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk); //等待时钟下降沿,接收data1
temp = dat;
temp <<= 1;
rece_data |= temp; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk); //等待时钟下降沿,接收data2
temp = dat;
temp <<= 2;
rece_data |= temp; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk); //等待时钟下降沿,接收data3
temp = dat;
temp <<= 3;
rece_data |= temp; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk); //等待时钟下降沿,接收data4
temp = dat;
temp <<= 4;
rece_data |= temp; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk); //等待时钟下降沿,接收data5
temp = dat;
temp <<= 5;
rece_data |= temp; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk); //等待时钟下降沿,接收data6
temp = dat;
temp <<= 6;
rece_data |= temp; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk); //等待时钟下降沿,接收data7
temp = dat;
temp <<= 7;
rece_data |= temp; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk); //等待时钟下降沿,接收data0
checksum |= dat; //时钟下降沿接收数据
while (!sclk); //等待时钟低电平结束
while (sclk);
if (!dat) return 0;
while (!sclk);
temp = CheckSum(rece_data);
if ( temp != checksum) return 0;
else return rece_data;
}
}
#define COMM_CONFIG_LED 0xed
#define COMM_RESET 0xff
#define COMM_DISABLE_KEY 0xf5
#define COMM_ENABLE_KEY 0xf4
#define COMM_ACK 0xfa
#define COMM_RESEND 0xfe
#define COMM_CONFIG_RATE 0xf3
#define NUM_LED 0x02
#define CAPS_LED 0x04
#define SCROLL_LED 0x01
void config_led(UINT8 led)
{
led &= 0x07;
do
{
while (PCSendComm(COMM_CONFIG_LED));
}while (PCReceData() != COMM_ACK);
while (PCSendComm(led));
}
//keyrate
void config_keyrate(UINT8 keyrate)
{
keyrate &= 0x7f;
do
{
while (PCSendComm(COMM_CONFIG_RATE));
}while (PCReceData() != COMM_ACK);
while (PCSendComm(keyrate));
}
void main()
{ UINT8 temp;
PCSendComm(COMM_RESET);
PCSendComm(COMM_DISABLE_KEY );
PCSendComm(COMM_ENABLE_KEY );
config_keyrate(0x21);
config_keyrate(0x28);
config_keyrate(0x2f);
config_led(NUM_LED);
config_led(CAPS_LED);
config_led(SCROLL_LED|CAPS_LED|NUM_LED);
config_led(CAPS_LED);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -