麻烦哪位大神看一下下面关于DS1302和1602液晶显示器的程序,为啥仿真显示的星期总是后一天的呀,比如今天星期三,就显示成星期四
下面是的DS1302的程序
#include
#include
//#define uchar unsigned char
//#define uint unsigned int
/*复位脚*/
#define RST_CLR PORTB&=~(1<
#define RST_SET PORTB|=(1
#define RST_IN DDRB&=~(1
#define RST_OUT DDRB|=(1
/*双向数据*/
#define IO_CLR PORTB&=~(1
#define IO_SET PORTB|=(1
#define IO_R PINB&(1
#define IO_IN DDRB&=~(1
#define IO_OUT DDRB|=(1
/*时钟信号*/
#define SCK_CLR PORTB&=~(1
#define SCK_SET PORTB|=(1
#define SCK_IN DDRB&=~(1
#define SCK_OUT DDRB|=(1
/*函数声明*/
void Delay_us(uint us);
void write_byte(uchar inbyte);
uchar read_byte(void);
void write_ds1302(uchar cmd,uchar indata);
uchar read_ds1302(uchar addr);
void set_ds1302(uchar addr,uchar *p,uchar n);
void init_ds1302(void);
/*us延时函数*/
void Delay_us(uint us)
{
uint i;
us=us*5/4;
for(i=0;i
}
/*从ds1302中读一字节数据*/
uchar read_byte(void)
{
uchar i,dat=0;
IO_IN;
IO_CLR;
for(i=0;i
{
SCK_SET;
Delay_us(10);
SCK_CLR;
Delay_us(10);
if(IO_R)
{dat=dat|0x80;}
else
{dat=dat&0x7f;}
SCK_SET;
dat=dat>>1;
}
IO_OUT;
return dat;
}
/*向ds1302中写入一字节数据*/
void write_byte(uchar dat)
{
uchar i;
for(i=0;i
{
SCK_CLR;
if(dat&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
Delay_us(10);
SCK_SET;
dat>>=1;
}
}
/*从ds1302的指定地址读一字节数据*/
uchar read_ds1302(uchar addr)
{
char data;
RST_CLR;
SCK_CLR;
Delay_us(10);
RST_SET;
Delay_us(10);
write_byte(addr);
Delay_us(10);
data=read_byte();
Delay_us(10);
SCK_CLR;
RST_CLR;
return data;
}
void write_ds1302(uchar addr,uchar data)
{
RST_CLR;
SCK_CLR;
Delay_us(10);
RST_SET;
Delay_us(10);
write_byte(addr);
Delay_us(10);
SCK_CLR;
Delay_us(10);
write_byte(data);
SCK_CLR;
Delay_us(10);
RST_CLR;
}
/*设置初始时间函数*/
void set_ds1302(uchar addr,uchar *p,uchar n)
{
write_ds1302(0x8e,0x00);
for(;n>0;n--)
{
write_ds1302(addr,*p);
p++;
addr=addr+2;
}
write_ds1302(0x8e,0x80);
}
/*初始化ds1302*/
void init_ds1302()
{
RST_CLR;
SCK_CLR;
//RST_OUT;
//SCK_OUT;
write_ds1302(0x80,0x00);
write_ds1302(0x90,0xab);
write_ds1302(0x8e,0x80);
}
下面是1602的程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define RS_0 PORTC&=~(1<<PC0)
#define RS_1 PORTC|=(1<<PC0)
#define RW_0 PORTC&=~(1<<PC1)
#define RW_1 PORTC|=(1<<PC1)
#define EN_0 PORTC&=~(1<<PC2)
#define EN_1 PORTC|=(1<<PC2)
/*函数声明*/
void delay_us(uint n);
void Delay_ms(uint xms);
uchar lcd_busy(void);
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar dat);
void lcd_clr(void);
void lcd_init(void);
void LocateXY(uchar x,uchar y);
void LCD_write_char(uchar x,uchar y,uchar data);
void LCD_write_str(uchar x,uchar y,uchar s);
/*us延时函数/
void delay_us(uint n)
{
if(n==0)
return;
while(n--);
}
/*ms延时函数*/
void Delay_ms(uint xms)
{
int i,j;
for(i=0;i<xms;i++)
{
for(j=0;j<1140;j++);
}
}
/*LCD忙碌检测函数*/
uchar lcd_busy()
{
uchar result;
DDRA=0X00;
RS_0;
RW_1;
EN_1;
delay_us(40);
result=PINA&0X80;
EN_0;
return result;
}
/*写指令寄存器IR函数*/
void lcd_wcmd(uchar cmd)
{
DDRA=0xff;
RS_0;
RW_0;
EN_0;
PORTA=cmd;
EN_1;
delay_us(40);
EN_0;
}
/*写寄存器DR函数*/
void lcd_wdat(uchar dat)
{
DDRA=0XFF;
RS_1;
RW_0;
EN_0;
PORTA=dat;
delay_us(40);
EN_1;
delay_us(40);
EN_0;
}
/**LCD清屏程序*/
void lcd_clr()
{
lcd_wcmd(0x01);
Delay_ms(5);
}
/*lcd初始化函数*/
void lcd_init()
{
Delay_ms(15);
while(lcd_busy());
lcd_wcmd(0x38);
Delay_ms(10);
while(lcd_busy());
lcd_wcmd(0x38);
Delay_ms(10);
while(lcd_busy());
lcd_wcmd(0x38);
Delay_ms(10);
while(lcd_busy());
lcd_wcmd(0x0c);
Delay_ms(10);
while(lcd_busy());
lcd_wcmd(0x06);
Delay_ms(10);
while(lcd_busy());
lcd_wcmd(0x10);
Delay_ms(10);
}
/*光标定位函数*/
void LocateXY(uchar x,uchar y)
{
if(y==0)
{
lcd_wcmd(0x80+x);
}
else
{
lcd_wcmd(0xc0+x);
}
}
/*显示屏字符串写入函数*/
void LCD_write_str(uchar x,uchar y,uchar s)
{
LocateXY(x,y);
while(*s)
{
lcd_wdat(*s);
s++;
}
}
/显示屏单字符写入函数*/
void LCD_write_char(uchar x,uchar y,uchar data)
{
LocateXY(x,y);
lcd_wdat(data);
}