//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;}