新闻中心

EEPW首页>嵌入式系统>设计应用> AVR M16实验之七 DS1302测试

AVR M16实验之七 DS1302测试

作者: 时间:2016-11-25 来源:网络 收藏

/*DS1302字节读取函数,注意下降沿读出数据和第八个下降沿*/
uchar DS1302_ByteRead(uchar command)
{
uchar i=0,n=0,readback=0;
PORTA|=(1< DDRA|=(1< for(n=0;n<8;n++)
{
PORTA&=~(1< _delay_us(1);
if(command&0x01)
PORTA|=(1< else
PORTA&=~(1< command>>=1;
PORTA|=(1< _delay_us(1);
}
PORTA|=(1< DDRA&=~(1< for(i=0;i<8;i++)
{
readback>>=1;
PORTA|=(1< _delay_us(1);
PORTA&=~(1< _delay_us(1);
if(PINA&(1< readback|=0x80;
}
return readback;
}
/*读取DS1302数据,分别是年月周日时分秒*/
void Calendar_ReadBack(void)
{
DS1302_RST();
Calendar[0]=DS1302_ByteRead(0x8d);
DS1302_RST();
Calendar[1]=DS1302_ByteRead(0x89);
DS1302_RST();
Calendar[2]=DS1302_ByteRead(0x8b);
DS1302_RST();
Calendar[3]=DS1302_ByteRead(0x87);
DS1302_RST();
Calendar[4]=DS1302_ByteRead(0x85);
DS1302_RST();
Calendar[5]=DS1302_ByteRead(0x83);
DS1302_RST();
Calendar[6]=DS1302_ByteRead(0x81);
DS1302_RST();
}
/*1602写命令字子函数*/
void LCD1602_CommandWrite(uchar com)
{
LCD1602_BusyCheck();
PORTA&=~(1< PORTB=com; //将数据送到8位并行数据口
PORTA|=(1< _delay_ms(1); //延时5ms,保持EN电平
PORTA&=~(1< }
/*1602写数据子函数*/
void LCD1602_ByteWrite(uchar date)
{
LCD1602_BusyCheck();
PORTA|=(1< PORTB=date; //将数据送到8位并行数据口
PORTA|=(1< _delay_ms(1); //延时5ms,保持EN电平
PORTA&=~(1< }
/*在某位置显示某字符,参数adr为待写地址,date为待写字节*/
void LCD1602_Display(uchar adr,uchar date)
{
LCD1602_BusyCheck();
LCD1602_CommandWrite(adr);
LCD1602_BusyCheck();
LCD1602_ByteWrite(date);
}
void LCD1602_BusyCheck(void)
{
PORTB=0xff;
DDRB=0x00;
PORTA|=(1< PORTA&=~(1< PORTA|=(1< _delay_us(5);
while(PINB&0x80);
PORTA&=~(1< PORTA&=~(1< PORTB=0xff;
DDRB=0xff;
}
/*将BCD码转换为10进制*/
uchar BCD_Conversion(uchar date)
{
uchar highbit=0,lowbit=0,Result;
highbit=date/16;
lowbit=date%16;
Result=highbit*10+lowbit;
return Result;
}
void DS1302_TimeShow(void)
{
Calendar_ReadBack();
ConversionResult[2]=(BCD_Conversion(Calendar[0]))/10;
ConversionResult[3]=(BCD_Conversion(Calendar[0]))%10;//转换后存入年
ConversionResult[5]=(BCD_Conversion(Calendar[1]))/10;
ConversionResult[6]=(BCD_Conversion(Calendar[1]))%10;//转换后存入月
ConversionResult[8]=Calendar[2];//不转换直接存入周
ConversionResult[10]=(BCD_Conversion(Calendar[3]))/10;
ConversionResult[11]=(BCD_Conversion(Calendar[3]))%10;//转换后存入日
ConversionResult[13]=(BCD_Conversion(Calendar[4]))/10;
ConversionResult[14]=(BCD_Conversion(Calendar[4]))%10;//转换后存入时
ConversionResult[16]=(BCD_Conversion(Calendar[5]))/10;
ConversionResult[17]=(BCD_Conversion(Calendar[5]))%10;//转换后存入分
ConversionResult[19]=(BCD_Conversion(Calendar[6]))/10;
ConversionResult[20]=(BCD_Conversion(Calendar[6]))%10;//转换后存入秒
uchar n;
/*以下为1602显示语句*/
for(n=0;n<2;n++)
{
LCD1602_Display(0x81+n,ConversionResult[n]);
}
for(n=2;n<4;n++)
{
LCD1602_Display(0x81+n,DisplayNum[ConversionResult[n]]);
}
LCD1602_Display(0x85,ConversionResult[4]);
for(n=5;n<7;n++)
{
LCD1602_Display(0x81+n,DisplayNum[ConversionResult[n]]);
}
LCD1602_Display(0x88,ConversionResult[4]);
for(n=8;n<10;n++)
{
LCD1602_Display(0x81+n,DisplayNum[ConversionResult[n+2]]);
}
for(n=0;n<3;n++)
{
LCD1602_Display(0x80+13+n,Weeks[ConversionResult[8]][n]);
}
for(n=0;n<2;n++)
{
LCD1602_Display(0x80+0x42+n,DisplayNum[ConversionResult[n+13]]);
}
LCD1602_Display(0x80+0x40+4,ConversionResult[7]);
for(n=3;n<5;n++)
{
LCD1602_Display(0x80+0x42+n,DisplayNum[ConversionResult[n+13]]);
}
LCD1602_Display(0x80+0x40+7,ConversionResult[7]);
for(n=6;n<8;n++)
{
LCD1602_Display(0x80+0x42+n,DisplayNum[ConversionResult[n+13]]);
}
}

视频地址:

本文引用地址: //m.amcfsurvey.com/article/201611/321116.htm

http://v.youku.com/v_show/id_XMTYxNDk1ODY4.html


上一页 1 2 下一页

关键词:AVRM16实验DS1302测

评论


技术专区

关闭