📄 funcs.c
字号:
#ifndef OS_MASTER_FILE
#include "includes.h"
#include "AVR_PQ1A.h"
#endif
#pragma data:code
const SEGMENT[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#pragma data:data
/*******************************************
函数名称: DS1302_init
功 能: 初始化DS1302的数据接口
参 数: 无
返回值 : 无
/********************************************/
void DS1302_portinit(void)
{
DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
}
/*******************************************
函数名称: DS1302_writeB
功 能: 向DS1302写入一个字节数据(没有RST操作)
参 数: byte--要写入的数据
返回值 : 无
/********************************************/
void DS1302_writeB(uchar byte)
{
uchar i;
for(i=0;i<8;i++) //8位数据计数
{
PORTB&=~BIT(RTC_CLK); //拉低时钟端
if(byte&0x01) //当前位是否是1
{
PORTB|=BIT(RTC_DATA); //当前位是1,拉高数据端
}
else
{
PORTB&=~BIT(RTC_DATA); //当前位是0,拉低数据端
}
Delayus(10); //调整时钟和脉冲宽度
PORTB|=BIT(RTC_CLK); //时钟上升沿(DS1302采样数据)
byte>>=1; //数据右移1位,为送出新数据位做准备
}
}
/*******************************************
函数名称: DS1302_readB
功 能: 从DS1302读出一个字节数据(没有RST操作)
参 数: 无
返回值 : byte--读出的数据
/********************************************/
uchar DS1302_readB(void)
{
uchar i,byte=0;
DDRB&=~BIT(RTC_DATA); //将数据端口设置为输入
PORTB&=~BIT(RTC_DATA); //无上拉电阻
for(i=0;i<8;i++) //8位数据计数
{
byte>>=1; //保存读入的数据位
PORTB|=BIT(RTC_CLK); //时钟上升沿
Delayus(10); //延时,调整时钟脉冲宽度
PORTB&=~BIT(RTC_CLK); //时钟下降沿,DS1302输出数据位
Delayus(10); //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
if(PINB&BIT(RTC_DATA)) //当前位是否是高电平
{
byte|=BIT(PB7); //是高电平就将返回数据的当前位置1
}
else
{
byte&=~BIT(PB7); //是低电平就将返回数据的当前位置0
}
}
DDRB|=BIT(RTC_DATA); //最后将数据端口设置为输出
return byte; //返回读出的数据
}
/*******************************************
函数名称: DS1302_writeD
功 能: 向DS1302的某个地址写入一个字节数据
参 数: addr--地址值(寄存器或RAM)
data--要写入的地址
返回值 : 无
/********************************************/
void DS1302_writeD(uchar addr,uchar data)
{
PORTC&=~BIT(RTC_CS); //拉低片选端
PORTB&=~BIT(RTC_CLK); //拉低时钟端
Delayus(10);
PORTC|=BIT(RTC_CS); //拉高片选端
Delayus(10); //调整片选脉冲
DS1302_writeB(addr); //写入操作命令(地址)
Delayus(10);
PORTB&=~BIT(RTC_CLK); //拉低时钟端
Delayus(10);
DS1302_writeB(data); //写入数据
PORTB&=~BIT(RTC_CLK); //拉低时钟端
Delayus(10); //调整片选脉冲
PORTC&=~BIT(RTC_CS); //拉低片选端
}
/*******************************************
函数名称: DS1302_readD
功 能: 从DS1302的某个地址读出一个字节数据
参 数: addr--地址值(寄存器或RAM)
返回值 : data--读出的数据
/********************************************/
uchar DS1302_readD(uchar addr)
{
uchar data;
PORTC&=~BIT(RTC_CS); //拉低片选端
PORTB&=~BIT(RTC_CLK); //拉低时钟端
Delayus(10);
PORTC|=BIT(RTC_CS); //拉高片选端
Delayus(10); //调整片选脉冲
DS1302_writeB(addr); //写入操作命令(地址)
Delayus(10);
data=DS1302_readB(); //读出数据
Delayus(10);
PORTB&=~BIT(RTC_CLK); //拉低时钟端
PORTC&=~BIT(RTC_CS); //拉低片选端
return data; //返回读出的数据
}
/*******************************************
函数名称: DS1302_getT
功 能: 读取DS1302的当前时间的时、分、秒
参 数: time[]--读取的时间数组
返回值 : 无
/********************************************/
void DS1302_getT(INT8U time[])
{
uchar i;
uchar addr = 0x80; //读取地址从秒寄存器开始
for(i=0;i<3;i++)
{
time[i*2]=DS1302_readD(addr|RD); // 秒 分 时 日 月 星期 年
addr+=2;
}
PORTB&=~BIT(RTC_CLK); //拉低时钟端(时钟端在不操作时为低)
}
/*******************************************
函数名称: One_smg_display
功 能: 指定的数码管显示指定的内容
参 数: data--显示的内容(0-15)
number--指定的数码管(1-6)
返回值 : 无
/********************************************/
void One_smg_display(uchar data,uchar number)
{
PORTB|=0x3F; //输出位选
PORTA|=BIT(BITLK); //更新位选
//Delayus(50); //调整时序
PORTA&=~BIT(BITLK); //锁存位选
PORTB=SEGMENT[data]; //输出段选
PORTA|=BIT(SEGLK); //更新段选
//Delayus(50); //调整时序
PORTA&=~BIT(SEGLK); //锁存段选
number=~BIT(number-1); //调整位选(指定时是1~6,而操作的时候是0~5)
PORTB=number; //输出位选
PORTA|=BIT(BITLK); //更新位选
//Delayus(50); //调整时序
PORTA&=~BIT(BITLK); //锁存位选
}
/*******************************************
函数名称: All_smg_display
功 能: 6个数码管显示指定的内容
参 数: *pdata--显示内容数组地址
返回值 : 无
/********************************************/
void All_smg_display(uchar *pdata)
{
uchar i;
for(i=0;i<6;i++)
{
One_smg_display(pdata[5-i],i+1);
Delayms(3);
}
}
/*******************************************
函数名称: One_led
功 能: 点亮或者熄灭指定的LED
参 数: number--指定的LED
light--为TRUE的时候为点亮LED,为FALSE的时候为熄灭LED
返回值 : 无
/********************************************/
void One_led(uchar number,uchar light)
{
uchar i;
if(light==TRUE) //点亮操作
{
PORTB&=~BIT(number); //输出数据
PORTA|=BIT(LEDLK); //更新数据
//Delayms(5); //调整时序
PORTA&=~BIT(LEDLK); //锁存数据
}
else
{
PORTB|=BIT(number); //输出数据
PORTA|=BIT(LEDLK); //更新数据
//Delayms(5); //调整时序
PORTA&=~BIT(LEDLK); //锁存数据
}
}
/*******************************************
函数名称: All_led
功 能: 点亮或者熄灭全部LED
参 数: light--为TRUE的时候为点亮全部LED,为FALSE的时候为熄灭全部LED
返回值 : 无
/********************************************/
void All_led(uchar light)
{
if(light)
{
PORTB&=~ALLLED;
PORTA|=BIT(LEDLK);
//Delayms(5);
PORTA&=~BIT(LEDLK);
}
else
{
PORTB|=ALLLED;
PORTA|=BIT(LEDLK);
//Delayms(5);
PORTA&=~BIT(LEDLK);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -