ATmega16DS1302.docx
《ATmega16DS1302.docx》由会员分享,可在线阅读,更多相关《ATmega16DS1302.docx(102页珍藏版)》请在冰豆网上搜索。
![ATmega16DS1302.docx](https://file1.bdocx.com/fileroot1/2023-1/10/68961adc-9c26-4965-a3cb-43a0edbe9a0e/68961adc-9c26-4965-a3cb-43a0edbe9a0e1.gif)
ATmega16DS1302
/*
*DS1302.c
*
*Created:
2015/2/1813:
30:
42
*Author:
Administrator
*/
/************************************************************************/
/*常用头文件及宏定义*/
/************************************************************************/
#include
#include//延时文件
#include//睡眠文件
#include//中断文件
#include//eeprom
#defineBIT(x)(1<<(x))
#defineucharunsignedchar
#defineuintunsignedint
uinttop_t=95,t=0;
ucharMODE=1,a[6]={0},ding_0=0,ding_1=0,ding_2=0;
ucharding0[8]={0},ding1[8]={0},ding2[8]={0},kaiguan=1,l=1;
/************************************************************************/
/*12864*/
/************************************************************************/
/*串行模式*/
/*引脚说明*/
/*PC0CSPC1SIDPC2CLKPC3背光PC4RST*/
/*宏定义*/
#defineDDR_KZDDRC
#definePORT_KZPORTC
#definePIN_KZPINC
#defineCS_HPORT_KZ|=BIT(0)
#defineCS_LPORT_KZ&=~(BIT(0))
#defineSID_HPORT_KZ|=BIT
(1)
#defineSID_LPORT_KZ&=~(BIT
(1))
#defineCLKPORT_KZ|=BIT
(2),PORT_KZ&=~(BIT
(2))
#defineBEIGUABG_HPORT_KZ|=BIT(3)
#defineBEIGUABG_LPORT_KZ&=~(BIT(3))
#defineRESETPORT_KZ&=~(BIT(4)),PORT_KZ|=BIT(4)
voidlcd_write_char(ucharshuju)//写字符函数
{
_delay_ms
(1);
ucharbl,a;
inti;
CS_H;
a=0xfa;
for(i=7;i>=0;i--)
{
bl=a>>i;
if(bl&1)
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
a=shuju&0xf0;
for(i=7;i>=0;i--)
{
bl=a>>i;
if(bl&1)
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
a=shuju<<4;
for(i=7;i>=0;i--)
{
bl=a>>i;
if(bl&1)
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
CS_L;
}
voidlcd_write_string(char*str)//写字符串函数
{
while(*str!
='\0')
{
lcd_write_char(*str);
str++;
}
}
voidlcd_write_zhiling(ucharzhiling)//写指令
{
_delay_ms
(1);
ucharbl,a;
inti;
CS_H;
a=0xf8;
for(i=7;i>=0;i--)
{
bl=a>>i;
if(bl&1)
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
a=zhiling&0xf0;
for(i=7;i>=0;i--)
{
bl=a>>i;
if(bl&1)
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
a=zhiling<<4;
for(i=7;i>=0;i--)
{
bl=a>>i;
if(bl&1)
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
CS_L;
}
//指令集宏定义//
#defineZHILINGJI_JIBENlcd_write_zhiling(0x30)//基本指令集
#defineQINGPING_WENZIlcd_write_zhiling(0x01)//文字清屏
voidchushihua_12864()
{
PORT_KZ|=BIT(4);
DDR_KZ=0xff;
RESET;
ZHILINGJI_JIBEN;//基本指令集
lcd_write_zhiling(0x08);//显示关
lcd_write_zhiling(0x01);//清显示
lcd_write_zhiling(0x02);//地址归位
lcd_write_zhiling(0x10);//设置游标
lcd_write_zhiling(0x0c);//开显示
}
/************************************************************************/
/*矩阵键盘积木块*/
/************************************************************************/
/*引脚说明*/
/*键盘PD0~PD3行*/
/*键盘PD4~PD7列*/
/*键盘宏定义*/
#defineDDR_JIANPANDDRD
#definePORT_JIANPANPORTD
#definePIN_JIANPANPIND
voidchushihua_jianpan()//键盘初始化函数
{
DDR_JIANPAN=0;//输入态
PORT_JIANPAN=0xff;//启用上拉电阻
}
intjiance()//检测函数//行扫描
{
DDR_JIANPAN=0xf0;//行扫描//0~3输入态//4~7输出态
PORT_JIANPAN=0x0f;//0~3启用上拉电阻//4~7输出低电平
_delay_ms
(1);
if((PIN_JIANPAN|0xf0)==0xff)//屏蔽高四位//读取低四位状态
{
return0;
}
else
{
return1;
}
}
intshibie_hang()//行识别状态(与检测函数扫描一致,不用切换状态)
{
switch(PIN_JIANPAN|0xf0)
{
case0xfe:
return1;break;
case0xfd:
return2;break;
case0xfb:
return3;break;
case0xf7:
return4;break;
default:
return0;
}
}
intshibie_lie()//列识别状态,需要切换扫描状态
{
DDR_JIANPAN=0x0f;//行扫描//0~3输出态//4~7输入态
PORT_JIANPAN=0xf0;//0~3输出低电平//4~7启用上拉电阻
_delay_ms
(1);
switch(PIN_JIANPAN|0x0f)//屏蔽低四位//读取高四位状态
{
case0xef:
return1;break;
case0xdf:
return2;break;
case0xbf:
return3;break;
case0x7f:
return4;break;
default:
return0;
}
}
intyima(inthang,intlie)//计算按键标号函数
{
intjianma=0;
jianma=(hang-1)*4+lie;//计算按键标号
returnjianma;
}
ucharanjian()
{
ucharhang=0,lie=0,jianma=0;//行列值变量
if(jiance())//是否有按键按下
{
_delay_ms(10);//消除抖动干扰
if(jiance())
{
hang=shibie_hang();//获取行值
lie=shibie_lie();//获取列值
jianma=yima(hang,lie);//获取键码
while(jiance());//等待按键放开
returnjianma;
}
}
return0;
}
/************************************************************************/
/*DS1302程序*/
/************************************************************************/
/*引脚说明*/
/*PC5RESRTPC6I/OPC7SCLK*/
/*宏定义*/
#defineDDR_1302DDRC
#definePORT_1302PORTC
#definePIN_1302PINC
#defineRESET_HPORT_1302|=BIT(5)
#defineRESET_LPORT_1302&=~BIT(5)
#defineIO_HPORT_1302|=BIT(6)
#defineIO_LPORT_1302&=~BIT(6)
#defineSCLK_HPORT_1302|=BIT(7)
#defineSCLK_LPORT_1302&=~BIT(7)
#defineMIAO_READ0x81
#defineMIN_READ0x83
voidds1302_read()
{
uchari;
for(i=0;i<6;i++)
{
a[i]=0;
}
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)
{
if(0x81&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
DDR_1302&=~BIT(6);
PORT_1302|=BIT(6);
for(i=0;i<4;i++)
{
_delay_us(10);
if(PIN_1302&BIT(6))
{
a[1]|=BIT(i);
}
SCLK_H;
SCLK_L;
}
for(i=0;i<4;i++)
{
_delay_us(10);
if(PIN_1302&BIT(6))
{
a[0]|=BIT(i);
}
SCLK_H;
SCLK_L;
}
RESET_L;
DDR_1302|=BIT(6);
PORT_1302&=~BIT(6);
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)
{
if(0x83&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
DDR_1302&=~BIT(6);
PORT_1302|=BIT(6);
for(i=0;i<4;i++)
{
_delay_us(10);
if(PIN_1302&BIT(6))
{
a[3]|=BIT(i);
}
SCLK_H;
SCLK_L;
}
for(i=0;i<4;i++)
{
_delay_us(10);
if(PIN_1302&BIT(6))
{
a[2]|=BIT(i);
}
SCLK_H;
SCLK_L;
}
RESET_L;
DDR_1302|=BIT(6);
PORT_1302&=~BIT(6);
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)
{
if(0x85&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
DDR_1302&=~BIT(6);
PORT_1302|=BIT(6);
for(i=0;i<4;i++)
{
_delay_us(10);
if(PIN_1302&BIT(6))
{
a[5]|=BIT(i);
}
SCLK_H;
SCLK_L;
}
for(i=0;i<4;i++)
{
_delay_us(10);
if(PIN_1302&BIT(6))
{
a[4]|=BIT(i);
}
SCLK_H;
SCLK_L;
}
RESET_L;
DDR_1302|=BIT(6);
PORT_1302&=~BIT(6);
if(a[4]&BIT(0))
{
a[5]+=10;
}
if(a[4]&BIT
(1))
{
a[5]+=12;
}
}
voidds1302_write(ucharb[])
{
uchari,shi=0;
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)//保护寄存器
{
if(0x8e&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
IO_L;
for(i=0;i<8;i++)//去保护
{
SCLK_H;
SCLK_L;
}
RESET_L;
//////////////////////////////////////////////////////////////////////////
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)
{
if(0x84&BIT(i))//小时寄存器
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
shi=b[0]*10+b[1];
if(shi>12)
{
shi-=12;
shi%=10;
}
for(i=0;i<4;i++)
{
if(shi&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
shi=b[0]*10+b[1];
if(shi>12)
{
shi-=12;
if(shi>9)
{
shi=0x0b;
}
else
{
shi=0x0a;
}
}
else
{
if(shi>9)
{
shi=0x09;
}
else
{
shi=0x08;
}
}
for(i=0;i<4;i++)
{
if(shi&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
RESET_L;
//////////////////////////////////////////////////////////////////////////
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)
{
if(0x82&BIT(i))//分钟寄存器
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
for(i=0;i<4;i++)
{
if(b[3]&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
for(i=0;i<4;i++)
{
if(b[2]&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
RESET_L;
//////////////////////////////////////////////////////////////////////////
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)
{
if(0x80&BIT(i))//秒钟寄存器
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
for(i=0;i<4;i++)
{
if(b[5]&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
for(i=0;i<4;i++)
{
if(b[4]&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
RESET_L;
//////////////////////////////////////////////////////////////////////////
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)//保护寄存器
{
if(0x8e&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
for(i=0;i<8;i++)//加保护
{
if(0x80&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
RESET_L;
}
voidqidong_1302()
{
uchari,c;
ds1302_read();
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)//保护寄存器
{
if(0x8e&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
IO_L;
for(i=0;i<8;i++)//去保护
{
SCLK_H;
SCLK_L;
}
RESET_L;
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)
{
if(0x80&BIT(i))//秒钟寄存器
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
for(i=0;i<4;i++)
{
if(a[1]&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
c=a[0]&(~BIT(3));
for(i=0;i<4;i++)
{
if(c&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
RESET_L;
RESET_H;
_delay_us(10);
for(i=0;i<8;i++)//保护寄存器
{
if(0x8e&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
for(i=0;i<8;i++)//加保护
{
if(0x80&BIT(i))
{
IO_H;
}
else
{
IO_L;
}
SCLK_H;
SCLK_L;
}
RESET_L;
}
voidchushih