描述
代码直接拿来用,没时间写思路,
运行效果
代码
#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);
}
}