📄 ds1602+1302_01.c
字号:
#include<reg51.h>
/***************************1302:引角配置**********************/
sbit RST_1302=P1^1;
sbit IO_1302=P1^2;
sbit CLK_1302=P1^0;
/****************************1602:引脚配置**********************/
sbit RS_1602=P2^0;
sbit RW_1602=P2^1;
sbit E_1602=P2^2;
sbit BUSY=P0^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
unsigned char gen_char[5]={"TIME:"};
unsigned char time_char[10]={'0','1','2','3','4','5','6','7','8','9'};
/*************************************延时程序=a*1ms*********/
void delay(unsigned char a)
{
unsigned char i;
while(a-- !=0)
{
for(i=0;i<125;i++);
}
}
/*********************************************************/
/* DS1302 */
/* */
/********************************************************/
void write_dat_1302(unsigned char dat) //DS1302:写入操作
{
unsigned char i;
ACC=dat;
for(i=8;i>0;i--)
{
IO_1302=ACC0;
CLK_1302=0;
CLK_1302=1;
ACC=ACC>>1;
}
}
unsigned char read_dat_1302(void) //DS1302:读取操作
{
unsigned char i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
CLK_1302 = 1;
CLK_1302 = 0;
ACC7 = IO_1302;
}
return(ACC);
}
void write_1302(unsigned char addr,unsigned char dat) //DS1302:写入数据(先送地址,再写数据?
{
RST_1302=0; //停止工作
CLK_1302=0;
RST_1302=1; //重新工作
write_dat_1302(addr); //写入地址
write_dat_1302(dat);
RST_1302=0;
CLK_1302=1;
}
unsigned char read_1302(unsigned char addr) //DS1302:读取数据(先送地址,再读数据)
{
unsigned char temp;
RST_1302=0; //停止工作
CLK_1302=0;
RST_1302=1; //重新工作
write_dat_1302(addr); //写入地址
temp=read_dat_1302();
RST_1302=0;
CLK_1302=1; //停止工作
return(temp);
}
/**************************************************************/
/* LCD: 1602 */
/* */
/**************************************************************/
/*************************************1602:检测忙*************/
void detect_busy_1602(void)
{
do{
P0= 0xff;
RS_1602=0;
RW_1602=1;
E_1602=0;
delay(2);
E_1602=1;
}while(BUSY);
}
/************************************1602:写指令***********/
void write_cmd_1602(unsigned char cmd,unsigned char i)
{
if(i)
detect_busy_1602();
P0=cmd;
RS_1602=0;
RW_1602=0;
E_1602=0;
E_1602=1;
}
/***************************************1602:写数据********/
void write_dat_1602(unsigned char dat)
{
detect_busy_1602();
P0=dat;
RS_1602=1;
RW_1602=0;
E_1602=0;
E_1602=1;
}
/*************************************1602:初始化************/
void ini_1602()
{
delay(15);
write_cmd_1602(0x38,0); //三次显示模式设置,不检测忙信号
delay(5);
write_cmd_1602(0x38,0);
delay(5);
write_cmd_1602(0x38,0);
write_cmd_1602(0x08,1); //显示关闭
write_cmd_1602(0x01,1); //显示清屏
write_cmd_1602(0x06,1); //光标设置;光标加1;字符左移
write_cmd_1602(0x0c,1); //显示打开
}
/******************************************1602:时钟显示***********/
void time_show_1602(unsigned char *poi)
{
unsigned char i;
write_cmd_1602(0xc8,1); //显示秒
i=*poi/16;
write_dat_1602(time_char[i]);//十位
i=*poi%16;
write_dat_1602(time_char[i]);//个位
poi+=1;
write_cmd_1602(0xc5,10); //显示分
i=*poi/16;
write_dat_1602(time_char[i]);//十位
i=*poi%16;
write_dat_1602(time_char[i]);//个位
poi+=1;
write_cmd_1602(0xc2,1); //显示时
i=*poi/16;
write_dat_1602(time_char[i]);//十位
i=*poi%16;
write_dat_1602(time_char[i]); //个位
}
/**********************************************************/
void main(void)
{
unsigned char clk_time[3]={0x00,0x00,0x12}; //秒,分,时寄存器初始值
unsigned char temp=0x80; // 地址80:秒写入寄存器
unsigned char i;
write_1302(0x8e,0x00); //WP=0 写操作
for(i=0;i<3;i++)
{
write_1302(temp,clk_time[i]);
temp+=2;
}
write_1302(0x8e,0x80); //WP=1 写保护
ini_1602();
write_cmd_1602(0x82,1);
for(i=0;i<5;i++)
{
write_dat_1602(gen_char[i]);
}
write_cmd_1602(0xc4,1);
write_dat_1602(':');
write_cmd_1602(0xc7,1);
write_dat_1602(':');
while(1)
{
time_show_1602(clk_time);
temp=0x81; // 地址81:秒写入寄存器
for(i=0;i<3;i++) //更新时间
{
clk_time[i]=read_1302(temp);
temp+=2;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -