?? iic_51.c
字號:
#include <define.h>
#define BYTE unsigned char
#define WORD unsigned int
sbit POWER=P1^0; //電源
sbit RST=P1^1; //復位
sbit CHECK=P3^3; //檢卡
sbit VPP=P1^4;
bit count=0;
bit mark=0;
void mDelay(BYTE j)
{
WORD i;
for(;j>0;j--)
{
for(i=0;i<228;i--) //125
{;}
}
}
/**********************************************************
初始化CPU及IO
***********************************************************/
void InitCPUIO(void)
{
//-------------------------------------
P0=0xff;
P1=0xff;
P3=0xfe;
P2=ReadyTwice;
LE373=1;
LE373=0;
P2=0xff;
//-------------------------------------
IE=0x00;
IP=0x00;
// SP=0xd0;
}
/**************************************
* 延時函數1mS(實測為1.18ms)
***************************************/
void Delayms(Word count)
{Word j;
while(count--!=0)
for(j=0;j<46;j++);
}
/**************************************
* 延時函數250uS
***************************************/
void Delay250uS(Word count)
{Word j;
while(count--!=0)
for(j=0;j<12;j++);
}
/*****************************************************************************
Function: Power_Up
*****************************************************************************/
/**************************************
*蜂鳴器函數: Beep()
*入口參數: count 鳴叫次數
***************************************/
void SBeep(Byte count)
{ Byte i;
for(;count;count--)
{
for(i=0;i<50;i++) //255個脈沖
{
P2=ReadyTwice;
P_Beep=0; //拉低
LE373=1;
LE373=0;
P2=0xff;
Delay250uS(2);
P2=ReadyTwice; //拉高
LE373=1;
LE373=0;
P2=0xff;
Delay250uS(2);
}
Delayms(100); //延時0.5S
}
}
void Power_dUp(void)
{
RST=0;
SCL=0;
SDA=0;
VPP=0;
POWER=0;
mDelay(20);
}
/*****************************************************************************
Function: Power_off
*****************************************************************************/
void Power_off(void)
{
SCL=0;
SDA=0;
RST=0;
VPP=0;
POWER=1;
mDelay(10);
}
/*****************************************************************************
Function: I2C_Start
*****************************************************************************/
void I2C_Start(void)
{
SDA=1;
SCL=1;
if(SDA==0)CY=1;
if(SCL==0)return;
_nop_();_nop_();
SDA=0;
_nop_();_nop_();
_nop_();_nop_();
SCL=0;
CY=0;
return;
}
/*****************************************************************************
Function: I2C_Stop
*****************************************************************************/
void I2C_Stop(void)
{
SDA=0;
_nop_();_nop_();
SCL=1;
_nop_();_nop_();
_nop_();_nop_();
SDA=1;
}
/*****************************************************************************
Function: I2C_WtByt
*****************************************************************************/
void I2C_WtByt(BYTE _data)
{
BYTE i;
for(i=8;i!=0;i--)
{
_data<<=1;
SDA=CY;
_nop_();
SCL=1;
_nop_();_nop_();
_nop_();_nop_();
SCL=0; //??
}
SDA=1;
_nop_();_nop_();
SCL=1;
_nop_();_nop_();
_nop_();_nop_();
CY=SDA;
SCL=0;
}
/*****************************************************************************
Function: I2C_NoAck
*****************************************************************************/
void I2C_NoAck(void)
{
SDA=1;
_nop_();_nop_();
SCL=1;
_nop_();_nop_();
_nop_();_nop_();
SCL=0;
}
/*****************************************************************************
Function: I2C_Ack
*****************************************************************************/
void I2C_Ack(void)
{
SDA=0;
_nop_();_nop_();
SCL=1;
_nop_();_nop_();
_nop_();_nop_();
SCL=0;
}
/*****************************************************************************
Function: I2C_RdByt
*****************************************************************************/
BYTE I2C_RdByt(void)
{
BYTE i,_data;
SDA=1;
for(i=8;i!=0;i--)
{
_nop_();_nop_();
SCL=1;
_nop_();_nop_();
if(SDA)
_data=_data|0x01;
else
_data=_data&0xfe;
_data<<=1;
SCL=0;
}
return(_data);
}
/*****************************************************************************
Function: I2C_WtIC
*****************************************************************************/
void I2C_WtIC(WORD Address,BYTE Data[],BYTE Num)
{
BYTE i;
BYTE *PData;
PData=Data;
for(i=0;i<Num;i++)
{
I2C_Start();
I2C_WtByt(0xa0);
I2C_Ack();
I2C_WtByt(Address+i);
I2C_Ack();
I2C_WtByt(*(PData+i));
I2C_Ack();
I2C_Stop();
mDelay(20);
}
}
/*****************************************************************************
Function: I2C_RdIC
*****************************************************************************/
void I2C_RdIC(WORD Address,BYTE Data[],BYTE Num)
{
BYTE i;
BYTE *PData;
PData=Data;
I2C_Start();
I2C_WtByt(0xa0);
I2C_Ack();
I2C_WtByt(Address);
I2C_Ack();
I2C_Start();
I2C_WtByt(0xa1);
I2C_Ack();
for(i=0;i<Num;i++)
{
*(PData+i)=I2C_RdByt();
SCL=0;
I2C_NoAck();
I2C_Stop();
}
}
/**********************************************************
*發送數據到Led1---Led4進行顯示。
*入口參數: dat(低四位有效的4位數據)
*出口參數: 無
***********************************************************/
void DisplayData(Byte dat)
{
if (dat&0x08) LED4=0; //Led4亮
else LED4=1; //Led4滅
P1=~(dat&0x07); //Led1---Led3
}
/**********************************************************
*啟動定時器函數:
*入口參數:bit tx (0:計數器0 1:定時器1)
*出口參數: 無
***********************************************************/
void StartTimer(bit tx)
{
TMOD=0x15; //計數器0,定時器1
TCON=0;
IP=0;
IE=0;
if(!tx)
{
TH0=0xff; //計數一次溢出
TL0=0xff;
ET0=1;
TR0=1;
EA=1;
}
else
{
TH1=0xEC;
TL1=0x78;
ET1=1;
TR1=1;
EA=1;
}
}
#pragma save
#pragma noregparms
Byte idata * MakeVoice(Word Num)
{
Word Tmp;
static Byte idata Musicbuf[5]; //千位,百位,十位,個位,0
if (Num<10)
{
Musicbuf[0]=(Byte)(Num+1);
Musicbuf[1]=0;
}
else if (Num<100)
{
Musicbuf[0]=Num/10+1;
Musicbuf[1]=Num%10+1;
Musicbuf[2]=0;
}
else if (Num<1000)
{
Musicbuf[0]=Num/100+1;
Tmp=Num%100;
Musicbuf[1]=Tmp/10+1;
Musicbuf[2]=Tmp%10+1;
Musicbuf[3]=0;
}
else if (Num<10000)
{
Musicbuf[0]=Num/1000+1;
Tmp=Num%1000;
Musicbuf[1]=Tmp/100+1;
Tmp%=100;
Musicbuf[2]=Tmp/10+1;
Musicbuf[3]=Tmp%10+1;
Musicbuf[4]=0;
}
else
{
Musicbuf[0]=10;
Musicbuf[1]=10;
Musicbuf[2]=10;
Musicbuf[3]=10;
Musicbuf[4]=0;
}
return Musicbuf;
}
#pragma restore
/**********************************************************
*停止定時器函數:
*入口參數:bit tx (0:計數器0 1:定時器1)
*出口參數: 無
***********************************************************/
void StopTimer(bit tx)
{
if(!tx)
{
TR0=0;
}
else
{
TR1=0;
}
}
/**********************************************************
*片選脈沖 ISDPulse()
*入口參數: Number 第幾段
*出口參數: 無
***********************************************************/
void PSearch(void)
{
ISD_CE=0; //CE加脈沖
LE373=1;
LE373=0;
ISD_CE=1;
LE373=1;
LE373=0;
StartTimer(0); //啟動定時器
while(!FgT0Over);
StopTimer(0);
FgT0Over=0;
}
/**********************************************************
*放音函數PlayMusic()
*入口參數: Number 第幾段
*出口參數: 無
***********************************************************/
void PlayMusic(Byte idata *p)
{ bit Tmpbb;
Byte i;
while(*p!=0)
{
P_Speak=0; //放音繼電器吸合
P0=0;
ISD_A8=1;
ISD_A9=1;
ISD_PD=1; //PD=1地址復位
ISD_PR=1;
LE373=1;
LE373=0;
Delayms(20); //Tpud Max=27.8ms
ISD_PD=0; //PD=0,開始操作
LE373=1;
LE373=0;
ISD_A0=1; //檢索模式,連續尋址,開始搜索
ISD_A4=1;
for(i=0;i<*p-1;i++)
{
PSearch();
}
p++;
ISD_A0=0; // 退出檢索,開始放音
PSearch();
Tmpbb=P_Online;
P2=0xBF; //此處片選置 1,繼電器保持
P_Online=Tmpbb;
LE373=1;
LE373=0;
P2=0xff;
P0=0xff;
}
}
//**********************************************************
void main(void)
{
BYTE *Number={3,4,5,6,7,8,9,10};
BYTE *OutNumber;
Byte i;
InitCPUIO();
Power_dUp();
I2C_WtIC(10,Number,8);
Power_off();
mDelay(20);
Power_dUp();
I2C_RdIC(10,OutNumber,8);
Power_off();
for (i=0;i<8;i++)
{
DisplayData(i);
if(*(OutNumber+i)==*(Number+i))
{
PlayMusic(MakeVoice(*(OutNumber+i)));
SBeep(1);
Delayms(2000);
}
}
}
//***********************************************************
//Timer0中斷服務函數
void ISR_Timer0() interrupt 1 using 1
{
FgT0Over=1;
TR0=0;
}
//說明:我用的是22.118M的晶體,如用12M,用(_nop())代替(_nop_();_nop_())即可(我沒試)
// 好痛快!!!再次感謝cwcyxy兄,也請他原諒我的打擾!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -