#include"key.h"
/***********************************
* Key_Init 键盘初始化
* ********************************/
void Key_Init()
{
IIC_Init(1); //初始化IIC
KEY_Rsst_Init();
KEY_Rsst_0();
_delay_us(1);
KEY_Rsst_1();
_delay_us(1);
}
/***********************************
* Key_Write_Byte 向键盘扩展器写一个字节
* ********************************/
void Key_Write_Byte(unsigned char DataAddr,unsigned char Data)
{
Device_WriteData(0x40,DataAddr,Data);
}
/***********************************
* Key_Read_Byte 从键盘扩展器读一个字节
* ********************************/
unsigned char Key_Read_Byte(unsigned char DataAddr,unsigned char ack)
{
unsigned char resive;
IIC_Start(); //起始信号
IIC_Write_Byte(0x40); //发送器件地址
IIC_Write_Byte(DataAddr); //发送数据地址
IIC_Start(); //起始信号
IIC_Write_Byte(0x41); //发送器件地址读模式
IIC_Init(0); //配置IIC为读模式
resive = IIC_Read_Byte(0);
IIC_Init(1); //配置IIC为写模式
if(!ack)
IIC_NAck();
else
IIC_Ack();
IIC_Stop(); //停止信号
return resive;
}
/***********************************
* Key_Check 检查是否有键按下
* ********************************/
unsigned char Key_Check()
{
Key_Write_Byte(0x03,0x00); //设置端口方向全为输出
Key_Write_Byte(0x01,0xf0); //设置行输出全1,列输出全0
Key_Write_Byte(0x03,0x0f); //设置列为输入
switch(Key_Read_Byte(0x00,0) & 0x0f)
{
case 1:_delay_ms(10);key_col = 3;break;
case 2:_delay_ms(10);key_col = 2;break;
case 4:_delay_ms(10);key_col = 1;break;
case 8:_delay_ms(10);key_col = 0;break;
default:return 0;
}
Key_Write_Byte(0x03,0x00); //设置端口方向全为输出
Key_Write_Byte(0x01,0x0f); //设置行输出全0,列输出全1
Key_Write_Byte(0x03,0xf0); //设置行为输入
switch(Key_Read_Byte(0x00,0) >> 4)
{
case 1:key_raw = 0;break;
case 2:key_raw = 1;break;
case 4:key_raw = 2;break;
case 8:key_raw = 3;break;
default:return 0;
}
return 1;
}
/***********************************
* Key_Get 获取按键值
* ********************************/
unsigned char Key_Get()
{
unsigned char key_value;
key_value = key_raw * 4 + key_col;
return key_value;
}