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

📄 通信.c

📁 ps2键盘的设计
💻 C
字号:
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#define KEY P1
sbit  DATA=P3^1;       //数据线
sbit  CLK=P3^2;        //时钟线
unsigned char key_buf[8];         //按键缓冲区
unsigned char key_COUNT;          //按键计数器
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时 
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
  void delay(unsigned  int N)  
  {
  int i; 
  for(i=0;i<N;i++);
  }
//--------------------------------------------------------------------------------------------------
// 函数名称: CAL_jiaoyan
// 函数功能: 计算校验位
//--------------------------------------------------------------------------------------------------
bit CAL_jiaoyan(unsigned char byte_data)
   {
   //
    }
//--------------------------------------------------------------------------------------------------
// 函数名称: SEND_byte
// 函数功能: 发送一子节数据
//--------------------------------------------------------------------------------------------------
void SEND_byte(unsigned char byte_data)
      {
	 unsigned char i,temp;
	  if(CLK==0)             //时钟线为低

	  temp=byte_data;
	  CLK=1;
	  DATA=0;
	  delay(0);
	  CLK=0;           //发送起始位
	  for(i=0;i<8;i++)
	  	  {
            delay(0);
	        CLK=1;  
			DATA=(temp&0x01);  //发送数据
            byte_data=byte_data>>1;  
			delay(0);
			CLK=0; 
		  }
		    delay(0);
	        CLK=1;  
			DATA=CAL_jiaoyan(byte_data); //发送校验位
         	delay(0);
			CLK=0; 
             delay(0);
	        CLK=1;  
			DATA=1;                     //发送结束位
         	delay(0);
			CLK=0;  
	  }
//--------------------------------------------------------------------------------------------------
// 函数名称: RECEIVE_byte
// 函数功能: 接收一子节数据
//--------------------------------------------------------------------------------------------------
unsigned char  RECEIVE_byte()
      {
	    unsigned char byte_data,i;
	  CLK=0;
	  delay(0);
	  CLK=1;                   //接收起始位,丢弃
	  for(i=0;i<8;i++)
	  	  {
            delay(0);
	        CLK=0;  
			delay(0);
			CLK=1;
			byte_data=byte_data>>1;
			if(DATA=1)
            byte_data=byte_data|0x80;
			else 
			byte_data=byte_data&0x7F; //接收8位数据
				 }
		 for(i=0;i<2;i++)
	  	  {
            delay(0);         //接收校验位和结束位
	        CLK=0;  
			delay(0);
			CLK=1;
		 }   
		 return(byte_data);
	}
//--------------------------------------------------------------------------------------------------
// 函数名称: manage
// 函数功能: 主机命令处理函数
//--------------------------------------------------------------------------------------------------
void manage(unsigned char rec_data)
    {
	}
//--------------------------------------------------------------------------------------------------
// 函数名称: SEND_keydata
// 函数功能: 发送按键值到主机
//--------------------------------------------------------------------------------------------------
void SEND_keydata()
     {
	 unsigned char ASCII_code;       //
	 // ASCII_code=judge_key(key_buf[key_COUNT]);  //判断键值,按键编码成ASCII码
	 SEND_byte(ASCII_code);
	 key_COUNT--;
	 }
//--------------------------------------------------------------------------------------------------
// 函数名称: 主程序
// 函数功能: 循环查询主机状态
//--------------------------------------------------------------------------------------------------
void main()
    {
	unsigned char rec_data;
	while(1)
	{
	if(CLK==0&&DATA==0)
    {
	rec_data=RECEIVE_byte();       //接收主机键盘
    manage(rec_data);              //指令处理函数
	}
	if(key_COUNT!=0&&CLK==1)			  //有按键等待处理
	                                      //线路空闲
	  SEND_keydata();
    }
	}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -