程序 ACK 是错的 试了好久键盘读不出键值 最后发现询问SDA下拉提前了一个脉冲
uchar BL = 2; //亮度等级
uchar CODE[11] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff}; //0~9显示代码
// 0 1 2 3 4 5 6 7 8 9 a
void TM1650(uchar B1,uchar B2, uchar B3 ,uchar B4)
{
uchar temp[5],temp1[5];
uchar i;
temp[1] = B1;
temp[2] = B2;
temp[3] = B3;
temp[4] = B4;
temp1[1]=temp[1] ;
temp1[2]=temp[2] ;
temp1[3]=temp[3] ;
temp1[4]=temp[4] ;
for( i=1 ; i < 5 ; i++ )
{
if (temp[i] == 97)
{
temp1[i] = 10;
}
}
Set1650(0x48,(BL*16+0x01)); //打开显示 调节灰度
Set1650(0x68, CODE[temp1[1]]);//数码管显示
Set1650(0x6a, CODE[temp1[2]]);//数码管显示
Set1650(0x6c, CODE[temp1[3]]);//数码管显示
Set1650(0x6e, CODE[temp1[4]]);//数码管显示
}
/******************************************************************************
* 函 数 名: InitTM1650(void)
* 函数功能: 初始化TM1650
* 入口函数: 无
* 返 回: 无
*******************************************************************************/
void InitTM1650(void)
{
TRI_CLK = 0; //设置端口位输出模式
TRI_DAT = 0; //设置端口位输出模式
WPUA |= 0x20; //设置 RA5 RA4弱上拉
Set1650(0x48,(BL*16+0x01));//设定亮度,开显示八段显示方式,后一个字节中高位用于亮度,低位用于七段或八段显示方式和开关显
//如:0x71为七级亮度,八段显示方式,开显示;0x79为为七级亮度,七段显示方式,开显示
}
/******************************************************************************
* 函 数 名: Set1650(uchar add,uchar dat)
* 函数功能: 按键扫描 写显存必须从高地址开始写
* 入口函数: add 地址 dat 数据
* 返 回: 无
*******************************************************************************/
void Set1650(uchar add,uchar dat)//数码管显示
{
Start1650(); //开始
WrByte1650(add); //第一个显存地址
Ask1650();
WrByte1650(dat); //第一个显示数据
Ask1650();
Stop1650(); //停止
}
/******************************************************************************
* 函 数 名: Scan_Key(void)
* 函数功能: 按键扫描
* 入口函数: 无
* 返 回: rekey 按键扫描结果
*******************************************************************************/
uchar Scan_Key(void) // 按键扫描
{
uchar i;
uchar rekey;
Start1650(); //开始
WrByte1650(0x49); //读按键命令
Ask1650(); //ASK
//DIO = 1 ;
TRI_DAT = 1; //数据端口位输入模式
Delay_us(1);
for(i=0;i<8;i++)
{
CLK = 1;
rekey = rekey<<1;
if(DIO)
{
rekey++;
}
Delay_us(5);
CLK = 0;
Delay_us(1);
}
TRI_DAT = 0; //数据端口位输出模式
Ask1650(); //ASK
Stop1650(); //停止
return(rekey);
}
/******************************************************************************
* 函 数 名: WrByte1650(uchar oneByte)
* 函数功能: 写一个字节
* 入口函数: oneByte 要写入的字节
* 返 回: 无
*******************************************************************************/
void WrByte1650(uchar oneByte)//写一个字节 高位在前,低位在后
{
uchar i;
CLK = 0;
Delay_us(5);
for(i=0;i<8;i++)
{
oneByte = oneByte<<1;
DIO = nC ; //进位标志 溢出1 空位0
CLK = 0;
Delay_us(5);
CLK = 1;
Delay_us(5);
CLK = 0;
}
}
/******************************************************************************
* 函 数 名: Stop1650(void)
* 函数功能: 停止信号
* 入口函数: 无
* 返 回: 无
*******************************************************************************/
void Stop1650(void)//停止信号
{
CLK = 1;
DIO = 0;
Delay_us(5);
DIO = 1;
}
/******************************************************************************
* 函 数 名: Ask1650(void)
* 函数功能: ACK信号
* 入口函数: 无
* 返 回: 无
*******************************************************************************/
void Ask1650(void)//ACK信号
{
int timeout = 1;
TRI_DAT = 1; //数据端口位输入模式
Delay_us(5);
while((DIO)&&(timeout<=300)) //延时等待反馈信号
{
timeout++;
}
CLK = 1;
Delay_us(5);
CLK = 0;
TRI_DAT = 0; //数据端口位输出模式
}
/******************************************************************************
* 函 数 名: Start1650(void)
* 函数功能: 开始信号
* 入口函数: 无
* 返 回: 无
*******************************************************************************/
void Start1650(void)//开始信号
{
CLK = 1;
DIO = 1;
Delay_us(5);
DIO = 0;
}
/******************************************************************************
* 函 数 名: Delay_us(uint i)
* 函数功能: us延时
* 入口函数: i 延时长度
* 返 回: 无
*******************************************************************************/
void Delay_us(uint i)//us延时
{
for(;i>0;i--)
{
NOP();
NOP();
NOP();
NOP();
NOP();
}
} |