|
程序基本可以用,就是顯示數(shù)據(jù)為空,按鍵讀出來(lái)沒(méi)有處理。在這個(gè)程序基礎(chǔ)上,稍加修改,可以顯示按鍵,代碼如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
//uchar code ktab[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef};
uchar code ktab[]={0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef,0xee,0xed,0xec,0xeb,0xea,0xe9,0xe8};
//定義端口
sbit clk = P1^2;
sbit dio = P1^1;
uchar buf[6]={1,2,3,4,5,6};
uchar keyval;
///=======================================
void Delay_us(unsigned int i) //nus 延時(shí)
{
for(;i>0;i--)
_nop_();
}
///======================================
void I2CStart(void) //1637 開(kāi)始
{
clk = 1;
dio = 1;
Delay_us(2);
dio = 0;
}
///=============================================
void I2Cask(void) //1637 應(yīng)答
{
clk = 0;
Delay_us(5); //在第八個(gè)時(shí)鐘下降沿之后延時(shí) 5us,開(kāi)始判斷 ACK 信號(hào)
while(dio);
clk = 1;
Delay_us(2);
clk=0;
}
///========================================
void I2CStop(void) // 1637 停止
{
clk = 0;
Delay_us(2);
dio = 0;
Delay_us(2);
clk = 1;
Delay_us(2);
dio = 1;
}
///=========================================
void I2CWrByte(unsigned char oneByte) //寫(xiě)一個(gè)字節(jié)
{
unsigned char i;
for(i=0;i<8;i++)
{ clk = 0;
if(oneByte&0x01) //低位在前
{
dio = 1;
}
else
{
dio = 0;
}
Delay_us(3);
oneByte=oneByte>>1;
clk=1;
Delay_us(3);
}
}
//-------------------------------------------------
unsigned char Scankey(void) //讀按鍵
{
unsigned char rekey,i;
I2CStart();
I2CWrByte(0x42); //讀按鍵命令
I2Cask();
dio=1; // 在讀按鍵前拉高數(shù)據(jù)線
for(i=0;i<8;i++) //從低位開(kāi)始讀
{ clk=0;
rekey=rekey>>1;
Delay_us(30);
clk=1;
if(dio)
{
rekey=rekey|0x80;
}
else
{
rekey=rekey|0x00;
}
Delay_us(30);
}
I2Cask();
I2CStop();
return (rekey);
}
///================================================
void SmgDisplay(void) //寫(xiě)顯示寄存器
{
unsigned char i;
I2CStart();
I2CWrByte(0x40); // 40H 地址自動(dòng)加 1 模式,44H 固定地址模式,本程序采用自加 1 模式
I2Cask();
I2CStop();
I2CStart();
I2CWrByte(0xc0); //設(shè)置首地址,
I2Cask();
for(i=0;i<6;i++) //地址自加,不必每次都寫(xiě)地址
{
I2CWrByte(table[buf[i]]); //送數(shù)據(jù)
I2Cask();
}
I2CStop();
I2CStart();
I2CWrByte(0x8f); //開(kāi)顯示 ,最大亮度
I2Cask();
I2CStop();
}
//-----------------------------------------------
void keydeal(uchar kdat)
{
uchar i;
for(i=0;i<16;i++)
{
if(kdat==ktab[i])break;
}
keyval=i;
}
///==============================================
void init() //初始化子程序
{
//初始化略
}
///==============================================
void main(void)
{
uchar keydate,keyo;
init(); //初始化
SmgDisplay(); //寫(xiě)寄存器并開(kāi)顯示
while(1)
{
keydate=Scankey(); //讀按鍵值 ,讀出的按鍵值不作處理。
if(keydate!=0xff && keydate!=keyo)
{
keyo=keydate;
keydeal(keydate);
buf[5]=buf[4];
buf[4]=buf[3];
buf[3]=buf[2];
buf[2]=buf[1];
buf[1]=buf[0];
buf[0]=keyval;
SmgDisplay(); //寫(xiě)寄存器并開(kāi)顯示
}
}
}
//===========end================================== |
|