/********************************************************************
* 文件名 : 时钟DS1302LCD.c
* 描述 : 该文件实现用DS1302来实现日历和时钟功能,液晶1602上显示出来。
* 创建人 : 东流,2009年4月10日
* 版本号 : 2.0
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
sbit T_IO = P3^5; /*实时时钟数据线引脚 */
sbit T_RST = P1^7; /*实时时钟复位线引脚 */
//这三个引脚参考资料
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void enable(uchar del)
{
P0 = del;
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write(uchar del)
{
P0 = del;
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}
/********************************************************************
* 名称 : v_RTInputByte()
* 功能 : 往DS1302写入1Byte数据
* 输入 : ucDa 写入的数据
* 输出 : 无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
T_RST = 1;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
* 名称 : uc_RTOutputByte()
* 功能 : 从DS1302读取1Byte数据
* 输入 : 无
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
T_RST = 1;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
T_IO=1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
* 名称 : v_W1302(uchar ucAddr, uchar ucDa)
* 功能 : 往DS1302写入数据
* 输入 : ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值 : 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); // 写地址
_nop_();
_nop_();
v_RTInputByte(ucDa); // 写1Byte数据
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名称 : uc_R1302(uchar ucAddr)
* 功能 : 读取DS1302某地址的数据
* 输入 : ucAddr: DS1302地址
* 返回值 : ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); //写地址,命令
_nop_();
_nop_();
ucDa = uc_RTOutputByte(); //读1Byte数据
T_CLK = 1;
T_RST = 0;
return(ucDa);
}
/********************************************************************
* 名称 : v_BurstW1302T
* 功能 : 往DS1302写入时钟数据(多字节方式)
* 输入 : pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值 : 无
***********************************************************************/
void v_BurstW1302T(uchar *pSecDa)
{
uchar i;
v_W1302(0x8e, 0x00); //控制命令,WP=0,写操作
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xbe); //0xbe:时钟多字节写命令
for(i=8; i>0; i--) //8Byte = 7Byte 时钟数据 + 1Byte 控制
{
v_RTInputByte(*pSecDa); //写1Byte数据
pSecDa++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名称 : v_BurstR1302T(uchar *pSecDa)
* 功能 : 读取DS1302时钟数据
* 输入 : pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值 : ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(uchar *pSecDa)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xbf); //0xbf:时钟多字节读命令
for(i=8; i>0; i--)
{
*pSecDa = uc_RTOutputByte(); //读1Byte数据
pSecDa++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名称 : v_BurstW1302R(uchar *pReDa)
* 功能 : 往DS1302寄存器数写入数据(多字节方式)
* 输入 : pReDa: 寄存器数据地址
* 返回值 : 无
***********************************************************************/
void v_BurstW1302R(uchar *pReDa)
{
uchar i;
v_W1302(0x8e,0x00); //控制命令,WP=0,写操作
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xfe); //0xbe:时钟多字节写命令
for(i=31; i>0; i--) //31Byte 寄存器数据
{
v_RTInputByte(*pReDa); //写1Byte数据
pReDa++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名称 : v_BurstR1302R(uchar *pReDa)
* 功能 : 读取DS1302寄存器数据
* 输入 : pReDa: 寄存器数据地址
* 返回值 : 无
***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xff); //0xbf:时钟多字节读命令
for(i=31; i>0; i--) //31Byte 寄存器数据
{
*pReDa = uc_RTOutputByte(); //读1Byte数据
pReDa++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名称 : v_Set1302(uchar *pSecDa)
* 功能 : 设置初始时间
* 输入 : pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e, 0x00);
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
199时钟DS1302(LCD)单片机C语言源码单片机C语言源码.zip项目程序C语言源码下载199时钟DS1302(LCD)单片机C语言源码单片机C语言源码.zip项目程序C语言源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 3.适合单片机公司开发项目参考
资源推荐
资源详情
资源评论
收起资源包目录
199时钟DS1302(LCD)单片机C语言源码单片机C语言源码.zip (15个子文件)
199-时钟DS1302(LCD)
时钟DS1302LCD.Uv2 2KB
时钟DS1302LCD.lnp 74B
STARTUP.OBJ 749B
时钟DS1302LCD.Opt 1KB
时钟DS1302LCD_Uv2.Bak 2KB
时钟DS1302LCD.hex 3KB
STARTUP.A51 5KB
时钟DS1302LCD_Opt.Bak 1KB
时钟DS1302LCD.plg 1KB
STARTUP.LST 11KB
时钟DS1302LCD.M51 25KB
时钟DS1302LCD.LST 22KB
时钟DS1302LCD.OBJ 19KB
时钟DS1302LCD.c 12KB
时钟DS1302LCD 17KB
共 15 条
- 1
资源评论
yxkfw
- 粉丝: 76
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 同态加密python.zip
- 基于Python的PCA人脸识别算法的原理及实现代码详解+源码+详细代码解析+开发文档+数据(毕业设计&课程设计&项目开发)
- Decision tree20240105(1).ipynb
- zuoyezuoyezuoye
- zuoyezuoyezuoye
- 机械设计电机转子装配设备sw22非常好的设计图纸100%好用.zip
- 作业作业作业作业作业作业
- xdotool.c
- RLMD鲁棒性局部均值分解信号分量可视化(Matlab完整源码和数据)
- Screenshot_2024-04-26-17-17-26-36_9d26c6446fd7bb8e41d99b6262b17def.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功