?? myboard.c
字號:
SCL=0;
IICClockDelay();
}
/*************************************************************************/
void StartIIC() /*發送IIC總線啟動時序*/
{
SCL=1;
IICClockDelay();
SDA=1;
IICClockDelay();
SDA=0;
IICClockDelay();
SCL=0;
IICClockDelay();
}
/*************************************************************************/
void StopIIC() /*發送IIC總線停止時序*/
{
SDA=0;
IICClockDelay();
SCL=1;
IICClockDelay();
SDA=1;
IICClockDelay();
SCL=1;
IICClockDelay();
}
/*************************************************************************/
bit IICSendByte(uchar byteData) /*向24C02發送一個字節數據或地址函數,返回值為發送成功與否標志*/
{
bit ackFlag;
uchar i;
for(i=0;i<8;i++) /*要傳送的數據長度為8位*/
{
if((byteData<<i)&0x80) /*依次判斷待發送位高低*/
SDA=1;
else
SDA=0;
IICClockDelay();
SCL=1; /*置時鐘線為高,通知24C02開始接收數據位*/
IICClockDelay();
SCL=0;
IICClockDelay();
}
SDA=1; /*8位數據發送完后釋放數據線,準備接收應答位*/
IICClockDelay();
SCL=1;
IICClockDelay();
if(SDA==1)
ackFlag=0; /*24c02無應答*/
else
ackFlag=1; /*數據成功發送*/
SCL=0;
IICClockDelay();
return(ackFlag); /*返回24C02應答標志*/
}
/*************************************************************************/
uchar IICRcvByte() /*從24C02讀取一個字節數據函數,返回值為讀入的該字節*/
{
uchar retbyteData=0x00,i; /*置返回值初值為0x00*/
for(i=0;i<8;i++)
{
SDA=1;
IICClockDelay();
SCL=1; /*拉高時鐘線后讀取數據線電平*/
IICClockDelay();
retbyteData=retbyteData<<1; /*返回值依次左移一位*/
if(SDA==1) /*讀取數據線電平至于返回值空出的一位*/
{
retbyteData+=1;
}
SCL=0; /*拉低釋放時鐘線*/
IICClockDelay();
}
return(retbyteData);
}
/*************************************************************************/
/*向24C02的指定地址寫入若干個數據函數*/
bit IICWrite(uchar slaveAddress,uchar subAddress,uchar *dataPointer,uchar num)
{
bit retBit;
uchar i;
StartIIC(); /*啟動總線*/
retBit=IICSendByte(slaveAddress); /*發送器件地址*/
if(retBit==0)
return(0);
retBit=IICSendByte(subAddress); /*發送器件子地址*/
if(retBit==0)
return(0);
for(i=0;i<num;i++)
{
retBit=IICSendByte(*(dataPointer+i)); /*發送數據*/
if(retBit==0)
return(0);
}
StopIIC(); /*結束總線*/
return(0);
}
/*************************************************************************/
/*從24C02的指定地址讀入若干個數據函數*/
bit IICRead(uchar slaveAddress,uchar subAddress,uchar *dataPointer,uchar num)
{
bit retBit;
uchar i;
StartIIC(); /*啟動總線*/
retBit=IICSendByte(slaveAddress); /*發送器件從地址*/
if(retBit==0)
return(0);
retBit=IICSendByte(subAddress); /*發送器件子地址*/
if(retBit==0)
return(0);
StopIIC(); /*結束總線*/
StartIIC(); /*重新啟動總線*/
retBit=IICSendByte(slaveAddress+1);
if(retBit==0)
return(0);
for(i=0;i<num-1;i++)
{
*dataPointer=IICRcvByte(); /*接收數據*/
IICAck(0); /*發送應答位*/
dataPointer++;
}
*dataPointer=IICRcvByte(); /*接收數據*/
IICAck(1);
StopIIC(); /*結束總線*/
return(1);
}
/*************************************************************************/
void Timer0Int() interrupt 1 using 2 /*每隔SCAN_CYCLEus中斷掃描一次數碼管*/
{
uint temp;
LEDCycle500usFlag=1; /*置500us標志位*/
ScanSeg7();
if(Int0Flag==1) /*如果需要產生音樂頻率則按音頻改變Timer0的中斷周期*/
{
P3_3=~P3_3; /*每個Timer0中斷翻轉一下P3.7的電平以產生相應頻率的方波*/
TH0=TH0Global;
TL0=TL0Global;
}
else /*如果不需要產生音樂頻率則按固定掃描時間改變Timer0的中斷周期*/
{
temp=65536-SCAN_CYCLE;
TH0=temp>>8;
TL0=temp-((temp>>8)<<8);
}
}
/*************************************************************************/
void Timer1Int() interrupt 3 using 3 /*Timer1中斷服務程序,中斷周期為10ms*/
{
uchar ucharTemp,ucharTemp1,TH0temp,TL0temp;
uint temp;
static uchar s_timeBaseCounter;
static uchar s_paiCounter,s_secCounter,s_paiNum;
temp=65536-10000; /*中斷周期為10ms*/
TH1=temp>>8; /*temp/256相當于右移8位*/
TL1=temp-((temp>>8)<<8); /*temp%256*/
if(++s_timeBaseCounter>=10) /*100ms到了則設置100ms標志位*/
{
s_timeBaseCounter=0;
LEDCycle100msFlag=1;
}
LEDCycle10msFlag=1; /*設置10ms標志位*/
if(++s_paiCounter>=s_paiNum) /*音樂一拍的時間到了*/
{
s_paiCounter=0;
switch(s_musicCounter) /*根據當前音樂編號查找下一個音樂標識碼*/
{
case 0x01: ucharTemp=c_music1[s_tableCounter++];break;
case 0x02: ucharTemp=c_music2[s_tableCounter++];break;
case 0x03: ucharTemp=c_music3[s_tableCounter++];break;
case 0x04: ucharTemp=c_music4[s_tableCounter++];break;
case 0x05: ucharTemp=c_music5[s_tableCounter++];break;
case 0x06: ucharTemp=c_music6[s_tableCounter++];break;
case 0x07: ucharTemp=c_music7[s_tableCounter++];break;
case 0x08: ucharTemp=c_music8[s_tableCounter++];break;
case 0x09: ucharTemp=c_music9[s_tableCounter++];break;
case 0x00: ucharTemp=c_music0[s_tableCounter++];break;
}
if(ucharTemp==0x00) /*如果查到0x00則表示本首歌曲結束*/
{
Int0Flag=0; /*產生音樂頻率標志置零*/
temp=65536-SCAN_CYCLE;
TH0temp=temp>>8; /*temp/256相當于右移8位*/
TL0temp=temp-((temp>>8)<<8); /*temp%256*/
TH0=TH0temp;
TL0=TL0temp;
s_paiNum=4*PAI_BASE; /*本首歌曲結束后停頓4*PAI_BASE*10ms=600ms再繼續播放*/
P3_7=1; /*把喇叭關掉*/
s_tableCounter=0;
if(musicAutoFlag==1) /*如果歌曲自動循環播放功能打開則跳到下一首歌曲*/
{
if(++s_musicCounter>(uchar)MUSIC_NUM)
{
s_musicCounter=0x01;
}
}
}
else /*如果查到非0x00則表示是音樂標識碼*/
{
s_paiNum=(ucharTemp&0x0f)*PAI_BASE; /*音樂標識碼的低四位為節拍碼*/
ucharTemp1=(ucharTemp&0xf0)>>4; /*音樂標識碼的高四位為音頻碼*/
if(ucharTemp1==0) /*如果音頻碼為零則表示不發音*/
{
Int0Flag=0;
temp=65536-SCAN_CYCLE;
TH0temp=temp>>8; /*temp/256相當于右移8位*/
TL0temp=temp-((temp>>8)<<8); /*temp%256*/
TH0=TH0temp;
TL0=TL0temp;
Int0Flag=0;
}
else /*如果音頻碼不為零則按此改變Timer0的中斷周期*/
{
Int0Flag=0;
temp=c_musicFreq[ucharTemp1-1];
TH0temp=temp>>8; /*temp/256相當于右移8位*/
TL0temp=temp-((temp>>8)<<8); /*temp%256*/
TH0=TH0temp;
TL0=TL0temp;
TH0Global=TH0; /*保存新的代表音頻的Timer0周期值*/
TL0Global=TL0;
Int0Flag=1;
}
}
}
if(++s_secCounter>=100) /*如果Timer1中斷100次則表示1s到了*/
{
s_secCounter=0;
sec++; /*秒加一*/
modifyTimeFlag=1;
}
TF1=0;
}
/*************************************************************************/
void UARTInt() interrupt 4 using 1 /*串口中斷服務程序*/
{
if(TI==1) /*是發送中斷則返回*/
{
TI=0;
return;
}
else /*接收到數據*/
{
uchar rcv;
while(RI!=1);
{
RI=0; /*請接收標志位以激活下次串口中斷*/
rcv=SBUF;
switch(rcv)
{
case 48: UARTKeyFlag=0x0d; /*收到'0'*/
break;
case 49: UARTKeyFlag=0x00; /*收到'1'*/
break;
case 50: UARTKeyFlag=0x01; /*收到'2'*/
break;
case 51: UARTKeyFlag=0x02; /*收到'3'*/
break;
case 52: UARTKeyFlag=0x04; /*收到'4'*/
break;
case 53: UARTKeyFlag=0x05; /*收到'5'*/
break;
case 54: UARTKeyFlag=0x06; /*收到'6'*/
break;
case 55: UARTKeyFlag=0x08; /*收到'7'*/
break;
case 56: UARTKeyFlag=0x09; /*收到'8'*/
break;
case 57: UARTKeyFlag=0x0a; /*收到'9'*/
break;
case 65: UARTKeyFlag=0x03; /*收到'A'*/
break;
case 66: UARTKeyFlag=0x07; /*收到'B'*/
break;
case 67: UARTKeyFlag=0x0b; /*收到'C'*/
break;
case 68: UARTKeyFlag=0x0f; /*收到'D'*/
break;
case 69: UARTKeyFlag=0x0c; /*收到'E'*/
break;
case 70: UARTKeyFlag=0x0e; /*收到'F'*/
break;
}
}
}
}
/*************************************************************************/
/////////////////////////////End of Program////////////////////////////////
/*************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -