📄 dat.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 + -