DS1302

描述

代码直接拿来用,没时间写思路,

运行效果

在这里插入图片描述

代码

#include "reg52.h"
#include "stdio.h"

typedef unsigned int u16;
typedef unsigned char u8;

sbit LCD2064_RS = P2^6;
sbit LCD2064_RW = P2^5;
sbit LCD2064_EN = P2^7;
#define LCD2064_DAT P0


// ============
// |  LCD2064 |
// ============


void delay_us(u16 us)
{
	while(--us);
}

void delay_ms(u16 ms)
{
	u16 x, y;
	for (x = ms; x > 0; --x)
	{
		for (y = 110; y > 0; --y){}
	}
}

/** lcd写指令 **/
void lcd_write_cmd(u8 cmd)
{
	LCD2064_RW = 0;
	LCD2064_RS = 0;
	LCD2064_DAT = cmd;
	LCD2064_EN = 1;
	delay_ms(1);
	LCD2064_EN = 0;
	delay_ms(1);
}

/** lcd写数据 **/
void lcd_write_dat(u8 dat)
{
	LCD2064_RW = 0;
	LCD2064_RS = 1;
	LCD2064_DAT = dat;
	LCD2064_EN = 1;
	delay_ms(1);
	LCD2064_EN = 0;
	delay_ms(1);
}

/** lcd初始化 **/
void lcd_init(void)
{
	lcd_write_cmd(0x38);
	lcd_write_cmd(0x08);
	lcd_write_cmd(0x01);
	lcd_write_cmd(0x06);
	lcd_write_cmd(0x0c);
}

/** 显示字符 **/
//void lcd_show_char(u8 cmd, u8 dat)
//{
//	lcd_write_cmd(0x80 + cmd);
//	lcd_write_dat(dat);
//}

/**显示字符串**/
void lcd_show_str(u8 cmd, u8 *str)
{
	lcd_write_cmd(0x80 + cmd);
	while (*str)
	{
		lcd_write_dat(*str);
		++str;
	}
}

/** 显示数字 **/
void lcd_show_int(u8 cmd, int dat)
{
	u8 str[10];
	sprintf(str, "%02d", dat);
	lcd_show_str(cmd, (u8 *)str);
}


// ====================
// |   DS1302模块     |
// ====================

sbit DS1302_CE = P3^5;
sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;

/** DS1032写命令封装 **/
void write_(u8 cmd)
{
	u8 i;
	DS1302_SCLK = 0;
	for (i = 0; i < 8; ++i)
	{		
		/** 下降沿写入数据 **/
		DS1302_IO = cmd & 0x01;
		cmd >>= 1;
		DS1302_SCLK = 1;
		delay_us(1);
		DS1302_SCLK = 0;
		delay_us(1);
	}
}

/** DS1032写 **/
void ds1306_write(u8 cmd, u8 dat)
{
	DS1302_CE =  1;
	delay_us(1);
	
	write_(cmd);
	write_(dat);
	
	DS1302_CE = 0;
	delay_us(1);
}

/** DS1032读数据 **/
int ds1302_read_dat(u8 cmd)
{
	u8 i, dat;
	DS1302_CE = 1;
	
	/** 上升延写入数据 **/
	for (i = 0; i < 8; ++i)
	{		
		DS1302_IO = cmd & 0x01;
		cmd >>= 1;
		DS1302_SCLK = 0;
		delay_us(1);
		DS1302_SCLK = 1;
		delay_us(1);
	}
	
	/** 下降延写入数据 **/
	for (i = 0; i < 8; ++i)
	{
		DS1302_SCLK = 1;
		delay_us(1);
		DS1302_SCLK = 0;
		if (DS1302_IO) dat |= ((0x01) << i);
	}
	
	DS1302_CE = 0;
	delay_us(1);
	DS1302_IO = 0;
	delay_us(1);
	
	/** 十六进制转十进制,高四位是十位,低四位是个位 **/
	return (dat & 0x0f) + (dat >> 4) * 10;
}


/** DS1032初始化 **/
void ds1302_init()
{
	/** 对照文档写 **/
	ds1306_write(0x8e, 0x00);
	ds1306_write(0x80, 0x00); /** seconds **/
	ds1306_write(0x82, 0x00); /** minutes **/
	ds1306_write(0x84, 0x22); /** hour **/
	
	ds1306_write(0x86, 0x12); /** month **/
	ds1306_write(0x88, 0x02); /** day **/
	ds1306_write(0x8e, 0x80);
}


void main()
{
	DS1302_CE = 0;
	DS1302_SCLK = 0;
	lcd_init();
	ds1302_init();
	lcd_show_str(0x00, "  -  "); /** [0,4] **/
	lcd_show_str(0x06, "  :  :  "); /** [6, 14] **/
	while (1)
	{
		// 对照文档,一个一个写
		lcd_show_int(0x03, ds1302_read_dat(0x89));
		lcd_show_int(0x00, ds1302_read_dat(0x87));
		lcd_show_int(0x0c, ds1302_read_dat(0x81));
		lcd_show_int(0x09, ds1302_read_dat(0x83));
		lcd_show_int(0x06, ds1302_read_dat(0x85));
		delay_ms(500);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值