?? 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 + -