?? at24c02.c
字號:
/*****************************************************************************
MCS8051-III學習板演示程序
(c) Copyright 2007-2007,廣州恒芯電子
All Rights Reserved
*****************************************************************************/
/*****************************************************************************
程序說明
名稱: MCS8051-III學習板演示程序(AT24C02測試)
功能: 保存鍵盤值到AT24C02中并在數碼管顯示
版本:2007-07-01
*****************************************************************************/
/*****************************************************************************
硬件說明
單片機: 兼容MCS-51單片機/STC89C51
晶振頻率: 12MHz
*****************************************************************************/
#include "regx52.h"
#include <intrins.h>
/****************************************************************************
說明: 程序預定義
*****************************************************************************/
#define LED7A_CTRL P1_7/*數碼管第一位控制引腳(0為有效,1為無效)*/
#define LED7B_CTRL P1_6/*數碼管第二位控制引腳(0為有效,1為無效)*/
#define LED7C_CTRL P1_5/*數碼管第三位控制引腳(0為有效,1為無效)*/
#define LED7D_CTRL P1_4/*數碼管第四位控制引腳(0為有效,1為無效)*/
#define LED7_STATUS P0/*數碼管狀態引腳(0為有效,1為無效)*/
#define KEY_STATUS P2/*鍵盤狀態引腳*/
#define IC24X_ORDER_WRITE 0xa0/*AT24C02寫指令*/
#define IC24X_ORDER_READ 0xa1/*AT24C02讀指令*/
#define IIC_SDA P1_1/*IIC總線SDA引腳定義*/
#define IIC_SCL P1_0/*IIC總線SCL引腳定義*/
#define IIC_TLOW 10/*IIC總線等待時間*/
/****************************************************************************
說明: 變量定義
*****************************************************************************/
code unsigned char m_ucLedTab[]=
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
0x88, 0x83, 0xC6, 0xa1 ,0x86 ,0x8e, 0xff
};/*數碼管十六進制編碼表*/
unsigned char code m_ucKeyTab[]=
{
0xde, 0xe7, 0xd7, 0xb7, 0xeb, 0xdb, 0xbb, 0xed, 0xdd, 0xbd,
0x77, 0x7b, 0x7d, 0x7e, 0xbe, 0xee
};/*鍵盤十六進制編碼表*/
unsigned char m_ucLedBuf[4];/*數碼管顯示值緩存*/
/****************************************************************************
名稱: KeyCheck()
說明: 鍵盤檢測
參數: 無
返回: 鍵盤碼值,若無鍵按下則返回16
*****************************************************************************/
unsigned char KeyCheck();
/****************************************************************************
名稱: Led7Scan()
說明: 數碼管動態掃描處理程序
參數: 無
返回: 無
*****************************************************************************/
void Led7Scan();
/****************************************************************************
說明: IIC總線處理函數
*****************************************************************************/
void IicDelay();
void IicStart();
void IicStop();
void IicAck();
void IicNAck();
void IicWrite(unsigned char ucData);
unsigned char IicRead();
/*****************************************************************************
名稱: AT24C02WriteByte()
說明: AT24C02寫操作
參數: unsigned int uiAddr 地址
unsigned char ucData 數據
返回: 無
*****************************************************************************/
void AT24C02WriteByte(unsigned int uiAddr,unsigned char ucData);
/*****************************************************************************
名稱: AT24C02ReadByte()
說明: AT24C02讀操作
參數: unsigned int uiAddr 地址
返回: unsigned char 數據
*****************************************************************************/
unsigned char AT24C02ReadByte(unsigned int uiAddr);
/*****************************************************************************
程序開始
*****************************************************************************/
void main()
{
unsigned char ucKey=0;/*鍵盤值*/
IIC_SCL=0;/*IIC時鐘引腳至0*/
P1_7=0;
/*T0中斷設定*/
TMOD=0x01;/*使用T0:GATE=0,C/T=0(定時),M1 M0=01(工作方式1)*/
TH0=0xec;/*定時時間 50Hz/4 計算公式:10000H - (5 x 1000) = EC78H*/
TL0=0x78;
ET0=1; /*允許T0中斷*/
TR0=1; /*使T0工作*/
ucKey=AT24C02ReadByte(0);/*從AT24C02地址為0000H中讀取鍵盤值*/
m_ucLedBuf[0]=ucKey;/*將鍵盤值放到數碼管顯示緩沖*/
m_ucLedBuf[1]=ucKey;
m_ucLedBuf[2]=ucKey;
m_ucLedBuf[3]=ucKey;
EA=1;/*總中斷開啟*/
while(1)
{
ucKey=KeyCheck();/*獲得鍵盤值*/
if(ucKey!=16)/*判斷是否有鍵按下,若有則將它在數碼管顯示出來*/
{
m_ucLedBuf[0]=ucKey;/*將鍵盤值放到數碼管顯示緩沖*/
m_ucLedBuf[1]=ucKey;
m_ucLedBuf[2]=ucKey;
m_ucLedBuf[3]=ucKey;
EA=0;
AT24C02WriteByte(0,ucKey);/*保存鍵盤值到AT24C02地址為0000H中*/
EA=1;
}
}
}
/*****************************************************************************
名稱: Interrupt1Handler
說明: T0中斷處理
參數: 無
返回 :無
*****************************************************************************/
void Interrupt1Handler() interrupt 1
{
Led7Scan();/*數碼管動態掃描*/
TH0=0xec;/*重新設置T0定時值*/
TL0=0x78;
}
/****************************************************************************
名稱: Led7Scan()
說明: 數碼管動態掃描處理程序
參數: 無
返回: 無
*****************************************************************************/
void Led7Scan()
{
static unsigned char a=0;
switch(a) /*判斷數碼管動態掃描值*/
{
case 0: /*處理數碼管第一位*/
LED7D_CTRL=1; /*設置數碼管第四位為無效*/
LED7A_CTRL=0; /*設置數碼管第一位位有效*/
break;
case 1: /*處理數碼管第二位*/
LED7A_CTRL=1; /*設置數碼管第一位為無效*/
LED7B_CTRL=0; /*設置數碼管第二位位有效*/
break;
case 2: /*處理數碼管第三位*/
LED7B_CTRL=1; /*設置數碼管第二位為無效*/
LED7C_CTRL=0; /*設置數碼管第三位位有效*/
break;
case 3: /*處理數碼管第四位*/
LED7C_CTRL=1; /*設置數碼管第三位為無效*/
LED7D_CTRL=0; /*設置數碼管第四位位有效*/
break;
}
LED7_STATUS=m_ucLedTab[m_ucLedBuf[a]]; /*將顯示碼送數碼管狀態引腳*/
a++; /*數碼管動態掃描值加1,若該值4則置為0*/
if(a>3)
a=0;
}
/****************************************************************************
名稱: KeyCheck()
說明: 鍵盤檢測
參數: 無
返回: 鍵盤碼值,若無鍵按下則返回16
*****************************************************************************/
unsigned char KeyCheck()
{
unsigned char a,b;
for(a=0;a<4;a++)/*循環4次*/
{
switch(a)/*改變鍵盤掃描碼*/
{
case 0:KEY_STATUS=0xef;break;
case 1:KEY_STATUS=0xdf;break;
case 2:KEY_STATUS=0xbf;break;
case 3:KEY_STATUS=0x7f;break;
};
b=KEY_STATUS;
if((b&0x0f)!=0x0f)/*判斷是否有按鍵按下*/
{
for(a=0;a<16;a++)/*根據鍵盤碼判斷那個鍵按下*/
{
if(b==m_ucKeyTab[a])
{
return a;
}
}
}
}
return 16;
}
/*****************************************************************************
名稱: AT24C02WriteByte()
說明: AT24C02寫操作
參數: unsigned int uiAddr 地址
unsigned char ucData 數據
返回: 無
*****************************************************************************/
void AT24C02WriteByte(unsigned int uiAddr,unsigned char ucData)
{
IicStart();
IicWrite(IC24X_ORDER_WRITE);
IicAck();
IicWrite(uiAddr);
IicAck();
IicWrite(ucData);
IicAck();
IicStop();
IicDelay();
}
/*****************************************************************************
名稱: AT24C02ReadByte()
說明: AT24C02讀操作
參數: unsigned int uiAddr 地址
返回: unsigned char 數據
*****************************************************************************/
unsigned char AT24C02ReadByte(unsigned int uiAddr)
{
unsigned char ucData;
IicStart();
IicWrite(IC24X_ORDER_WRITE);
IicAck();
IicWrite(uiAddr);
IicAck();
IicStart();
IicWrite(IC24X_ORDER_READ);
IicAck();
ucData=IicRead();
IicNAck();
IicStop();
return ucData;
}
/****************************************************************************
說明: IIC總線處理函數
*****************************************************************************/
void IicDelay()
{
unsigned char a;
for(a=0;a<IIC_TLOW;a++);
}
void IicStart()
{
IIC_SDA=1;
IIC_SCL=1;
IicDelay();
IIC_SDA=0;
IicDelay();
IIC_SCL=0;
}
void IicStop()
{
IIC_SCL=0;
IIC_SDA=0;
IIC_SCL=1;
IIC_SDA=1;
}
void IicAck()
{
IIC_SDA=0;
IIC_SCL=1;
IicDelay();
IIC_SCL=0;
IIC_SDA=1;
}
void IicNAck()
{
IIC_SDA=1;
IIC_SCL=1;
IicDelay();
IIC_SDA=0;
IIC_SCL=0;
}
void IicWrite(unsigned char ucData)
{
unsigned char a;
for(a=0;a<8;a++)
{
if(ucData&0x80)
{
IIC_SDA=1;
}
else
{
IIC_SDA=0;
}
IIC_SCL=1;
IIC_SCL=0;
ucData=ucData<<1;
}
}
unsigned char IicRead()
{
unsigned char a,ucData=0;
for(a=0;a<8;a++)
{
IIC_SDA=1;
IIC_SCL=1;
ucData<<=1;
if(IIC_SDA==1)
{
ucData|=0x01;
}
else
{
ucData&=0xfe;
}
IIC_SCL=0;
}
return ucData;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -