程序 ACK 是錯的 試了好久鍵盤讀不出鍵值 最后發(fā)現(xiàn)詢問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)); //打開顯示 調(diào)節(jié)灰度
Set1650(0x68, CODE[temp1[1]]);//數(shù)碼管顯示
Set1650(0x6a, CODE[temp1[2]]);//數(shù)碼管顯示
Set1650(0x6c, CODE[temp1[3]]);//數(shù)碼管顯示
Set1650(0x6e, CODE[temp1[4]]);//數(shù)碼管顯示
}
/******************************************************************************
* 函 數(shù) 名: InitTM1650(void)
* 函數(shù)功能: 初始化TM1650
* 入口函數(shù): 無
* 返 回: 無
*******************************************************************************/
void InitTM1650(void)
{
TRI_CLK = 0; //設(shè)置端口位輸出模式
TRI_DAT = 0; //設(shè)置端口位輸出模式
WPUA |= 0x20; //設(shè)置 RA5 RA4弱上拉
Set1650(0x48,(BL*16+0x01));//設(shè)定亮度,開顯示八段顯示方式,后一個字節(jié)中高位用于亮度,低位用于七段或八段顯示方式和開關(guān)顯
//如:0x71為七級亮度,八段顯示方式,開顯示;0x79為為七級亮度,七段顯示方式,開顯示
}
/******************************************************************************
* 函 數(shù) 名: Set1650(uchar add,uchar dat)
* 函數(shù)功能: 按鍵掃描 寫顯存必須從高地址開始寫
* 入口函數(shù): add 地址 dat 數(shù)據(jù)
* 返 回: 無
*******************************************************************************/
void Set1650(uchar add,uchar dat)//數(shù)碼管顯示
{
Start1650(); //開始
WrByte1650(add); //第一個顯存地址
Ask1650();
WrByte1650(dat); //第一個顯示數(shù)據(jù)
Ask1650();
Stop1650(); //停止
}
/******************************************************************************
* 函 數(shù) 名: Scan_Key(void)
* 函數(shù)功能: 按鍵掃描
* 入口函數(shù): 無
* 返 回: rekey 按鍵掃描結(jié)果
*******************************************************************************/
uchar Scan_Key(void) // 按鍵掃描
{
uchar i;
uchar rekey;
Start1650(); //開始
WrByte1650(0x49); //讀按鍵命令
Ask1650(); //ASK
//DIO = 1 ;
TRI_DAT = 1; //數(shù)據(jù)端口位輸入模式
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; //數(shù)據(jù)端口位輸出模式
Ask1650(); //ASK
Stop1650(); //停止
return(rekey);
}
/******************************************************************************
* 函 數(shù) 名: WrByte1650(uchar oneByte)
* 函數(shù)功能: 寫一個字節(jié)
* 入口函數(shù): oneByte 要寫入的字節(jié)
* 返 回: 無
*******************************************************************************/
void WrByte1650(uchar oneByte)//寫一個字節(jié) 高位在前,低位在后
{
uchar i;
CLK = 0;
Delay_us(5);
for(i=0;i<8;i++)
{
oneByte = oneByte<<1;
DIO = nC ; //進(jìn)位標(biāo)志 溢出1 空位0
CLK = 0;
Delay_us(5);
CLK = 1;
Delay_us(5);
CLK = 0;
}
}
/******************************************************************************
* 函 數(shù) 名: Stop1650(void)
* 函數(shù)功能: 停止信號
* 入口函數(shù): 無
* 返 回: 無
*******************************************************************************/
void Stop1650(void)//停止信號
{
CLK = 1;
DIO = 0;
Delay_us(5);
DIO = 1;
}
/******************************************************************************
* 函 數(shù) 名: Ask1650(void)
* 函數(shù)功能: ACK信號
* 入口函數(shù): 無
* 返 回: 無
*******************************************************************************/
void Ask1650(void)//ACK信號
{
int timeout = 1;
TRI_DAT = 1; //數(shù)據(jù)端口位輸入模式
Delay_us(5);
while((DIO)&&(timeout<=300)) //延時等待反饋信號
{
timeout++;
}
CLK = 1;
Delay_us(5);
CLK = 0;
TRI_DAT = 0; //數(shù)據(jù)端口位輸出模式
}
/******************************************************************************
* 函 數(shù) 名: Start1650(void)
* 函數(shù)功能: 開始信號
* 入口函數(shù): 無
* 返 回: 無
*******************************************************************************/
void Start1650(void)//開始信號
{
CLK = 1;
DIO = 1;
Delay_us(5);
DIO = 0;
}
/******************************************************************************
* 函 數(shù) 名: Delay_us(uint i)
* 函數(shù)功能: us延時
* 入口函數(shù): i 延時長度
* 返 回: 無
*******************************************************************************/
void Delay_us(uint i)//us延時
{
for(;i>0;i--)
{
NOP();
NOP();
NOP();
NOP();
NOP();
}
} |