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

📄 dat.c

📁 利用89S51将6*6键盘转换成PS/2协议
💻 C
字号:
unsigned char data head,end;//键盘缓冲区头地址尾地址
unsigned char data kb_buf[16];//键盘缓冲区,长度为16个字节,为循环缓冲区
unsigned char data flag[16];//键盘缓冲区16个缓冲单元的状态
#define KEYNO_MAX 30
bit insert(unsigned char a,unsigned char f)           //插入缓冲区,F标记是否按下
//返回0表示未插入,因为缓冲区满;或者a、f超出范围;返回1表示插入成功
{
  if((end+1)%16==head)//缓冲区满
	return 0;
  if(a>KEYNO_MAX||f>1)//非定义值
    return 0;
  kb_buf[end]=a;//加入缓冲区
  flag[end]=f;
  end=(end+1)%16;
  return 1;
}
void clr_buf()//清除缓存区
{
  head=end=0;
}
 //判断是否第一次按下,如果是第一次按下,返回0,否则返回缓冲区中对应键盘值的地址
 //检查键盘缓冲区中是否有与参数相等数,有则返回位置,无则返回255
unsigned char exist(unsigned char mark) 
{
  unsigned char i=head;
  if(mark>KEYNO_MAX)
    return 255; //错误则返回255
  while(i!=end)  //正确
    {
	  if(kb_buf[i]==mark)
	    return i;
	  i=(i+1)%16;//别忘记循环
	}
  return 255;
}
/*bit emputy()
{
  return (head==end);
}
unsigned char get_end()
{
  if(head!=end)
    return kb_buf[(end-1+16)%16];
  else
    return 0;
}*/
//取键盘缓冲区头,头指针不变
unsigned char get_head_f()
{
  if(head!=end)   //不空,返回缓冲区头地址的标识
    return flag[head];
  else 
    return 255;  
}
//取缓冲区头对应标记,标记为0表示对应键已经松下
unsigned char get_head()
{
  if(head!=end)
    return kb_buf[head];//不空,返回缓冲区头地址处的值,如果缓冲区空,则返回255
  else 
    return 255;
}
//删除缓冲区头
void del_head()//将头地址加一,也即删除缓冲区中头地址处的值
{
  head=(head+1)%16;
}
//设置缓冲区对应标记
void set_flag(unsigned char dire)//将缓冲区中dire所对应的的缓冲单元标识设为1
{
  flag[dire%16]=1;
}
unsigned char buf_length()//返回缓冲区中已被使用的缓冲单元的数目
{
  return (end+16-head)%16;
}

⌨️ 快捷键说明

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