新闻中心

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

AVR M16实验之七 DS1302测试

作者: 时间:2016-11-25 来源:网络 收藏
/**********************************************************************
* 文件名称: main.c
* 程序作者: kidcao1987
* 程序版本: V1.0
* 功能描述: 装上LCD1602,在其上显示时间,年月等
* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:http://bbs.cepark.com
**********************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define SCLK PA1
#define IO PA2
#define RST PA3
#define RS PA4
#define RW PA5
#define EN PA6

uchar DisplayNum[]={"0123456789"};
uint Calendar[]={0x10,0x02,0x4,0x12,0x22,0x40,0x00};//年月周日时分秒
uchar Weeks[7][3]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};//字符数组
uchar ConversionResult[]={"20**-**:*-**-**-**-**"};//开辟空间存储转换结果
uchar i=1;

void LCD1602_Initial(void);
void LCD1602_CommandWrite(uchar com);
void LCD1602_ByteWrite(uchar date);
void LCD1602_Display(uchar adr,uchar date);
void LCD1602_BusyCheck(void);
void PORTx_Initial(void);
void Initial_DS1302(void);
void DS1302_RST(void);
void DS1302_ByteWrite(uchar command,uchar Byte);
uchar DS1302_ByteRead(uchar command);
void DS1302_TimeShow(void);
uchar BCD_Conversion(uchar date);
void Calendar_ReadBack(void);

int main(void)
{
PORTx_Initial();//初始化IO
LCD1602_Initial();//初始化1602
Initial_DS1302();//初始化DS1302
while(1)
{
DS1302_TimeShow();//显示时间
}
}
/*LCD1602初始化*/
void LCD1602_Initial(void)
{
LCD1602_CommandWrite(0x38);
_delay_ms(15);
LCD1602_CommandWrite(0x38);
_delay_ms(5);
LCD1602_CommandWrite(0x38);
_delay_ms(5);
LCD1602_CommandWrite(0x01);
_delay_ms(1);
LCD1602_CommandWrite(0x38);
_delay_ms(1);
LCD1602_CommandWrite(0x0c);
_delay_ms(1);
LCD1602_CommandWrite(0x06);
}
/*端口初始化函数*/
void PORTx_Initial(void)
{
PORTA&=~((1< PORTA&=~((1<<4)|(1<<5)|(1<<6));
DDRA|=(1<
PORTB=0x00;
DDRB=0xff; //B口初始化为输出方向输出低电平
}
/*DS1302初始化函数*/
void Initial_DS1302(void)
{
DS1302_RST();
DS1302_ByteWrite(0x90,0xa9);//使能充电,双二极管,2K电阻
DS1302_RST();
DS1302_ByteWrite(0x8e,0x00);//关闭写保护
DS1302_RST();
DS1302_ByteWrite(0x8c,Calendar[0]);//10年
DS1302_RST();
DS1302_ByteWrite(0x88,Calendar[1]);//2月
DS1302_RST();
DS1302_ByteWrite(0x8a,Calendar[2]);//周三
DS1302_RST();
DS1302_ByteWrite(0x86,Calendar[3]);//10日
DS1302_RST();
DS1302_ByteWrite(0x84,Calendar[4]);//00时
DS1302_RST();
DS1302_ByteWrite(0x82,Calendar[5]);//00分
DS1302_RST();
DS1302_ByteWrite(0x80,0x00);//00秒
DS1302_RST();
}
/*DS1302复位函数*/
void DS1302_RST(void)
{
PORTA&=~(1< _delay_us(1);
PORTA|=(1< _delay_us(1);
}
/*DS1302字节写入函数*/
void DS1302_ByteWrite(uchar command,uchar Byte)
{
uchar n=0;
for(n=0;n<8;n++)
{
if(command&0x01)
PORTA|=(1< else
PORTA&=~(1< PORTA|=(1< _delay_us(1);
PORTA&=~(1< _delay_us(1);
command>>=1;
}
for(n=0;n<8;n++)
{
if(Byte&0x01)
PORTA|=(1< else
PORTA&=~(1< PORTA|=(1< _delay_us(1);
PORTA&=~(1< _delay_us(1);
Byte>>=1;
}
}

上一页 1 2 下一页

关键词:AVRM16实验DS1302测

评论


技术专区

关闭