問題描述:
ds1302顯示秒的個位數值依次是:
00 01 02 03 04 08 0A 0B 0C
很好奇為什么到了04直接到08了。。
代碼如下
#include <config.h>
#include <lcd1602.h>
#include <delay.h>
#include <math.h>
#include "serial.h"
#include <intrins.h>
typedef unsigned char uchar;
//寫字節
void write_byte(uchar tmp)
{
int i;
for(i=0;i<8;i++)
{
if(tmp&0x01)
IO=1;
else
IO=0;
Delay6us() ;
SCLK=1;
Delay6us() ;
SCLK=0;
Delay6us() ;
tmp=tmp>>1;
}
}
//讀字節
unsigned char read_byte()
{
int i;
uchar tmp;
SCLK=0;
IO=1;
Delay6us();
for(i=0;i<8;i++)
{
tmp=tmp>>1;
SCLK=1;
Delay6us();
SCLK=0;
Delay6us();
if(IO)
tmp=tmp|0x80;
// else
// tmp=tmp|0x00;
Delay6us();
}
return tmp;
}
//寫操作
void write_addr_and_data(unsigned char addr,unsigned char dat)
{
CE=0;
SCLK=0;
Delay6us() ;
CE=1;
write_byte(addr);
write_byte(dat);
SCLK=0;
Delay6us() ;
CE=0;
Delay6us() ;//
}
//讀操作
uchar read_ds1302_data(unsigned char addr)
{
int date;
CE=0;
SCLK=0;
Delay6us();
CE=1;
Delay6us();
write_byte(addr);
date=read_byte();
Delay6us() ;
CE=0;
_nop_(); //以下為DS1302復位的穩定時間,必須的。
return date;
}
void main()
{
write_addr_and_data(0x8e,0x00);
write_addr_and_data(0x84,0x00);
write_addr_and_data(0x82,0x00);
write_addr_and_data(0x80,0x05);
// lcd_initial();
lcd_initial();
while(1)
{
uchar sec_10,sec,dataSecond;
dataSecond=read_ds1302_data(0x81);
//秒的個位串口打印
serial((dataSecond&0x0f));
}
}
|