nn=(nn&0xfe);
SetSCL(0);}
else
{nn<<=1;
nn=(nn|0x01);
SetSCL(0);}
}
DDRB=DDRB|0x02;
return(nn);
}
//****************************写N个字节子程序**********************//
//函数参数说明:
//Slave:IIC器件地址,如上文定义的SD2303
//Address:起始地址
//Array:读数据存放的数组
//Number:读取的字节数
void Write_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
{uchar k;
writ:do //开始->写IIC器件地址->检查应答位
{Start();
Write_Byte(Slave);
Check_Ack();
}while(F_Flag==1);
do
{Write_Byte(Address<<4); //送起始地址->检查应答位
Check_Ack();
}while(F_Flag==1);
for(k=0;k<Number;k++) //写Number个数据
{Write_Byte(*Array);
Array++;
Check_Ack();} //检查应答位
Stop();
}
//****************************写一个字节子程序**********************//
//函数参数说明:
//Slave:IIC器件地址,如上文定义的SD2303
//Address:IIC器件寄存器地址
//Data:数据
void Write_1byte(uchar Slave,uchar Address,uchar Data)
{writ:do //开始->写IIC器件地址->检查应答位
{Start();
Write_Byte(Slave);
Check_Ack();
}while(F_Flag==1);
do
{Write_Byte(Address<<4); //送起始地址->检查应答位
Check_Ack();
}while(F_Flag==1);
Write_Byte(Data);
Check_Ack(); //检查应答位
Stop(); //停止信号
}
//***************************读N个字节子程序***********************//
//函数参数说明:
//Slave:IIC器件地址,如上文定义的SD2303
//Address:起始地址
//Array:读数据存放的数组
//Number:读取的字节数
void Read_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
{uchar data0,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<Number;x++)
{data0=Read_Byte();*Array=data0;Array++;
if(x<(Number-1)) { Ack(); }}
Nack();
//第五步:发停止信号,结束读操作
Stop();
}
//***************************按键处理程序**************************//
//说明:为简化程序设计,此程序不保证输入的时间数据的合理性。
void Key_Process(void)
{uchar temp1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//输入数据格式依次为年、月、日、星期、小时和分钟
uchar temp2[7]={0,0,0,0,0,0,0,};
uchar teMP3[3]={0,0,0xff};
//输入数据格式依次为小时和分钟
uchar Key;
uchar *Flag;
uchar i;
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)
{case 0x04: //"+"键处理
(*Flag)++;
if(((*Flag)&0x7f)==10) *Flag=0|0x80;
break;
case 0x08: //"-"键处理
if(((*Flag)&0x7f)==0) *Flag=10|0x80;
(*Flag)--;
break;
case 0x10: //"下一位"键处理
Flag++;
(*(Flag-1))&=0x7f; //上一位去掉小数点显示
上一页 [1] [2] [3] [4] [5] 下一页
本文关键字:单片机 程序 万年历 AVR单片机,单片机-工控设备 - AVR单片机