//Address:起始地址

//Array:读数据存放的数组

//Number:读取的字节数

voidRead_Nbyte(ucharSlave,ucharAddress,uchar*Array,ucharNumber)

{uchardata0,x;

//第一步:开始信号-》写IIC器件地址-》检查应答位

do{Start();Write_Byte(Slave);Check_Ack();}while(F_Flag==1);

//第二步:写起始地址-》检查应答位

do{Write_Byte(Address《《4);Check_Ack();}while(F_Flag==1);

//第三步:开始信号-》写IIC器件地址+1(表示读)-》检查应答位

do{Start();Write_Byte(Slave+1);Check_Ack();}while(F_Flag==1);

//第四步:读N字节,每读完一字节发一个Ack应答,最后一字节发Nack

for(x=0;x{data0=Read_Byte();*Array=data0;Array++;

if(x《(Number-1)){Ack();}}

Nack();

//第五步:发停止信号,结束读操作

Stop();

}

//***************************按键处理程序**************************//

//说明:为简化程序设计,此程序不保证输入的时间数据的合理性。

voidKey_Process(void)

{uchartemp1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

//输入数据格式依次为年、月、日、星期、小时和分钟

uchartemp2[7]={0,0,0,0,0,0,0,};

ucharteMP3[3]={0,0,0xff};

//输入数据格式依次为小时和分钟

ucharKey;

uchar*Flag;

uchari;

Flag=temp1;

if(PIND!=0xff)

{DelayMs(20);//延时去抖

if(PIND!=0xff)

Key=PINB;

if(Key==0xfe)//“时间设置”键按下

{temp1[0]|=0x80;//年高位设置提示

while(!Enter_Flag)//直到按下确定键方停止

{for(i=0;i《50;i++)

Display(temp1);//显示和延时

Key=~PIND;

switch(Key)

{case0x04://“+”键处理

(*Flag)++;

if(((*Flag)&0x7f)==10)*Flag=0|0x80;

break;

case0x08://“-”键处理

if(((*Flag)&0x7f)==0)*Flag=10|0x80;

(*Flag)--;

break;

case0x10://“下一位”键处理

Flag++;

(*(Flag-1))&=0x7f;//上一位去掉小数点显示

(*Flag)|=0x80;//当前位加上小数点显示

if(Flag==temp1+13)

{Flag=temp1;

(*Flag)|=0x80;

(*(Flag+13))&=0x7f;}

break;

case0x20://“上一位”键处理

if(Flag==temp1)

{(*Flag)&=0x7f;

Flag=temp1+13;

(*Flag)|=0x80;}

elseFlag--;

(*Flag)|=0x80;//当前位加上小数点显示

(*(Flag+1))&=0x7f;//下一位去掉点小数点显示

break;

case0x40:Enter_Flag=1;break;//“确定”键处理

//case0x80:Enter_Flag=1;break;//测试用

default:break;}