⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2.c

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