基于DS1302写的12864LCD时钟程序word文档良心出品.docx
- 文档编号:29276308
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:27
- 大小:19.44KB
基于DS1302写的12864LCD时钟程序word文档良心出品.docx
《基于DS1302写的12864LCD时钟程序word文档良心出品.docx》由会员分享,可在线阅读,更多相关《基于DS1302写的12864LCD时钟程序word文档良心出品.docx(27页珍藏版)》请在冰豆网上搜索。
基于DS1302写的12864LCD时钟程序word文档良心出品
以下是我写的12864LCD并行口时钟显示程序,时钟用按键可调
/***************12864.h头文件******************************/
#ifndef_12864_h
#define_12864_h
/*****包含头文件**************/
#include
#include"string.h"
#include"DS1302.h"
/********定义I/0口**********/
#defineLCD12864_DATAP0
sbitLCD12864_E=P2^7;
sbitLCD12864_RW=P2^5;
sbitLCD12864_RS=P2^6;
sbitLCD12864_RET=P2^0;
sbitLCD12864_PSB=P2^2;
/******声明全局函数*********/
voidDelay1ms(unsignedint);//声明延时函数
voidBusyChk_12864(void);//声明忙检测函数
voidWrCom(unsignedchar);//声明写入命令函数
//unsignedcharReDat(void);//声明读数据函数
voidWrDat(unsignedchar);//声明写数据函数
voidLcdInit(void);//12864初始化函数
voidSetAddress(unsignedchar,unsignedchar);//设置地址转换
voidDisplayString(unsignedchar,unsignedchar,unsignedchar*p);//行显示字符
voidDisplayTime();
voidDisplayDay();
voidDisplayWeek();
#endif
/*****************************12864.c***********************************/
#include"12864.h"
/*******************************************************************************
*函数名:
Delay1ms
*函数功能:
延时函数,延时1ms
*输入:
c
*输出e:
无
*说名:
该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
voidDelay1ms(unsignedinti)//误差0us
{
unsignedchara;
for(i;i>0;i--)
{
for(a=199;a>0;a--)
;
}
}
/****************************************************************************
函数名字:
voidBusyChk()
函数功能:
12864LCD忙检测
*输入:
无
*输出:
无
*******************************************************************************/
voidBusyChk(void)
{
unsignedinttimeout=0;
LCD12864_E=0;//E=0使能关闭
LCD12864_RS=0;//0指令;1数据
LCD12864_RW=1;//1读数据;0写数据
Delay1ms(50);//延时100ms
LCD12864_E=1;//1开使能,读数据
while(((LCD12864_DATA&0x80)&&++timeout));//判断1表示内部在工作;0表示正常
LCD12864_E=0;//E=0使能关闭
}
/****************************************************************************
函数名字:
voidWrDat(usnignedchardata)
函数功能:
写入数据
*输入:
data
*输出:
无
*******************************************************************************/
voidWrDat(unsignedcharbTemp)
{
BusyChk();//忙检测
LCD12864_E=0;//E=0使能关闭
LCD12864_RS=1;//0指令;1数据
LCD12864_RW=0;//1读数据;0写数据
LCD12864_E=1;//E=1使能打开
LCD12864_DATA=bTemp;//写入数据
Delay1ms(10);//延时100ms
LCD12864_E=0;//E=0使能关闭
}
/****************************************************************************
函数名字:
voidWrCom(usnignedcharcom)
函数功能:
写入命令
*输入:
com
*输出:
无
*******************************************************************************/
voidWrCom(unsignedcharcom)
{
BusyChk();
LCD12864_E=0;//E=0使能关闭
LCD12864_RS=0;//0指令;1数据
LCD12864_RW=0;//1读数据;0写数据
LCD12864_E=1;//E=0使能打开
LCD12864_DATA=com;//写入数据
Delay1ms(10);//延时100ms
LCD12864_E=0;//E=0使能关闭
}
/****************************************************************************
函数名字:
unsignedcharReData(void)
函数功能:
读数据
*输入:
无
*输出:
data
*******************************************************************************/
//unsignedcharReData(void)
//{
//unsignedcharbTempt;
//BusyChk();
//LCD12864_DATA=0xFF;
//LCD12864_E=0;//E=0使能关闭
//LCD12864_RS=1;//0指令;1数据
//LCD12864_RW=1;//1读数据;0写数据
//LCD12864_E=1;//E=0使能打开
//bTempt=LCD12864_DATA;//读出数据
//Delay1ms(100);//延时100ms
//LCD12864_E=0;//E=0使能关闭
//returnbTempt;
//}
/****************************************************************************
函数名字:
voidLcdInit(void)
函数功能:
初始化
*输入:
无
*输出:
无
*******************************************************************************/
voidLcdInit()
{
LCD12864_RS=0;//0指令;1数据
LCD12864_RW=0;//1读数据;0写数据
LCD12864_E=1;//E=1使能打开
LCD12864_PSB=1;//1为并行模式,0为串行模式
LCD12864_RET=1;
Delay1ms(50);
LCD12864_RET=0;//低电平复位
Delay1ms(300);
LCD12864_RET=1;//恢复高电平
WrCom(0x30);//基本指令用0x30,扩展指令用0x34
Delay1ms(20);
WrCom(0x30);
WrCom(0x0C);//显示开,光标关
//WrCom(0x14);//光标位置右移一个位置
WrCom(0x01);//清屏
WrCom(0x06);//进入模式指针加1,屏幕不移动
}
/****************************************************************************
函数名字:
voidSetAddress(unsignedcharx,unsignedchary)
函数功能:
初始化
*输入:
行、数据
*输出:
无
*******************************************************************************/
voidSetAddress(unsignedcharx,unsignedchary)
{
unsignedcharbAddress;
switch(y)
{
case1:
bAddress=0x80+x;break;
case2:
bAddress=0x90+x;break;
case3:
bAddress=0x88+x;break;
case4:
bAddress=0x98+x;break;
default:
break;
}
WrCom(bAddress);
}
/****************************************************************************
函数名字:
voidDisplayString(unsignedcharx,unsignedchary,unsigned)
函数功能:
初始化
*输入:
行、数据
*输出:
无
*******************************************************************************/
voidDisplayString(unsignedcharx,unsignedchary,unsignedchar*add)
{
unsignedchari;
i=strlen(add);
SetAddress(x,y);
while(i--)
{
WrDat(*(add++));
}
}
/****************************************************************************
函数名字:
voidDisplayTime()
函数功能:
显示时间
*输入:
行、数据
*输出:
无
*******************************************************************************/
voidDisplayTime()
{
WrCom(0x88);
WrDat('0'+(TIME[2]/10));
WrDat('0'+(TIME[2]%10));
DisplayString(1,3,":
");
WrDat('0'+(TIME[1]/10));
WrDat('0'+(TIME[1]%10));
WrDat(':
');
WrDat('0'+(TIME[0]/10));
WrDat('0'+(TIME[0]%10));
}
/****************************************************************************
函数名字:
voidDisplayDay()
函数功能:
显示时间
*输入:
行、数据
*输出:
无
*******************************************************************************/
voidDisplayDay()
{
WrCom(0x80);
WrDat('0'+2);
WrDat('0'+0);
WrDat('0'+(TIME[6]/10));
WrDat('0'+(TIME[6]%10));
DisplayString(2,1,"年");
WrDat('0'+(TIME[4]/10));
WrDat('0'+(TIME[4]%10));
DisplayString(4,1,"月");
WrDat('0'+(TIME[3]/10));
WrDat('0'+(TIME[3]%10));
DisplayString(6,1,"日");
}
/****************************************************************************
函数名字:
voidDisplayWeek()
函数功能:
显示时间
*输入:
行、数据
*输出:
无
*******************************************************************************/
voidDisplayWeek()
{
switch(TIME[5])
{
case1:
DisplayString(0,2,"星期:
Mo");break;
case2:
DisplayString(0,2,"星期:
Tu");break;
case3:
DisplayString(0,2,"星期:
We");break;
case4:
DisplayString(0,2,"星期:
Th");break;
case5:
DisplayString(0,2,"星期:
Fr");break;
case6:
DisplayString(0,2,"星期:
Sa");break;
case7:
DisplayString(0,2,"星期:
Su");break;
}
}
/*****************************DS1302.h***********************************/
#ifndef_DS1302_h
#define_DS1302_h
/*****包含头文件*******/
#include
#include
/***********定义I/O口********************/
sbitDSIO=P3^4;
sbitRST=P3^5;
sbitSCLK=P3^6;
///***********声明全局变量**********************/
externunsignedcharTIME[7];
//---声明全局函数---//
voidDs1302Write(unsignedcharaddr,unsignedchardat);
unsignedcharDs1302Read(unsignedcharaddr);
voidDs1302Init();
voidDs1302ReadTime();
unsignedcharchangeBCD_Variable(unsignedchar);
unsignedcharchangeVariable_BCD(unsignedchar);
#endif
/*****************************DS1302.c***********************************/
#include"DS1302.h"
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年最低位读写位;-------//
unsignedcharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsignedcharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
/*******************************************************************************
*函数名:
Ds1302Write
*函数功能:
向DS1302命令(地址+数据)
*输入:
addr,dat
*输出:
无
*******************************************************************************/
voidDs1302Write(unsignedcharaddr,unsignedchardat)
{
unsignedcharn;
RST=0;
_nop_();
SCLK=0;//先将SCLK置低电平。
_nop_();
RST=1;//然后将RST(CE)置高电平。
_nop_();
for(n=0;n<8;n++)//开始传送八位地址命令
{
DSIO=addr&0x01;//数据从低位开始传送
addr>>=1;
SCLK=1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK=0;
_nop_();
}
for(n=0;n<8;n++)//写入8位数据
{
DSIO=dat&0x01;
dat>>=1;
SCLK=1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK=0;
_nop_();
}
RST=0;//传送数据结束
_nop_();
}
/*******************************************************************************
*函数名:
Ds1302Read
*函数功能:
读取一个地址的数据
*输入:
addr
*输出:
dat
*******************************************************************************/
unsignedcharDs1302Read(unsignedcharaddr)
{
unsignedcharn,dat,dat1;
RST=0;
_nop_();
SCLK=0;//先将SCLK置低电平。
_nop_();
RST=1;//然后将RST(CE)置高电平。
_nop_();
for(n=0;n<8;n++)//开始传送八位地址命令
{
DSIO=addr&0x01;//数据从低位开始传送
addr>>=1;
SCLK=1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK=0;
_nop_();
}
_nop_();
for(n=0;n<8;n++)//读取8位数据
{
dat1=DSIO;//从最低位开始接收
dat=(dat>>1)|(dat1<<7);
SCLK=1;
_nop_();
SCLK=0;//
_nop_();
}
RST=0;
_nop_();//以下为DS1302复位的稳定时间,必须的。
SCLK=1;
_nop_();
DSIO=0;
_nop_();
DSIO=1;
_nop_();
returndat;
}
/*******************************************************************************
*函数名:
Ds1302Init
*函数功能:
初始化DS1302.
*输入:
无
*输出:
无
*******************************************************************************/
voidDs1302Init()
{
unsignedcharn;
Ds1302Write(0x8E,0X00);//关闭写保护功能
for(n=0;n<7;n++)//写入7个字节的时钟信号:
分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80);//打开写保护功能
}
/*******************************************************************************
*函数名:
Ds1302ReadTime
*函数功能:
ReadTime
*输入:
无
*输出:
无
*******************************************************************************/
voidDs1302ReadTime()
{
unsignedcharn;
for(n=0;n<7;n++)//写入7个字节的时钟信号:
分秒时日月周年
{
TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DS1302 12864 LCD 时钟 程序 word 文档 良心 出品
![提示](https://static.bdocx.com/images/bang_tan.gif)