1602液晶显示DS1302时钟.docx
- 文档编号:3850281
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:17
- 大小:17.77KB
1602液晶显示DS1302时钟.docx
《1602液晶显示DS1302时钟.docx》由会员分享,可在线阅读,更多相关《1602液晶显示DS1302时钟.docx(17页珍藏版)》请在冰点文库上搜索。
1602液晶显示DS1302时钟
/*-----------------------------------------------
名称:
DS1302时钟数码管显示串口更新
内容:
液晶显示时间
通过dofly自带的串口调试软件,打开串口,波特率默认9600,点击更新时间即可,如果不行,按下开发板复位重新更新
------------------------------------------------*/
#include
#include
#include"ds1302.h"
#include"delay.h"
#include"1602.h"
bitReadTimeFlag;//定义读时间标志
bitSetFlag;//更新时间标志位
unsignedchartime_buf2[16];
voidInit_Timer0(void);//定时器初始化
voidUART_Init(void);
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
unsignedchari;
unsignedchartemp[16];//定义显示区域临时存储数组
LCD_Init();//初始化液晶
DelayMs(20);//延时有助于稳定
LCD_Clear();//清屏
Init_Timer0();//定时器0初始化
Ds1302_Init();//ds1302初始化
UART_Init();//串口初始化
Ds1302_Read_Time();//首次读取时间
if((time_buf1[2]+time_buf1[7])==0)//如果所有参数都为0,写入一个初始值
Ds1302_Write_Time();
while
(1)//主循环
{
if(SetFlag)//如果接收到串口信息则更新时钟
{
for(i=0;i<8;i++)
{
time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数1和5整合成15
}
Ds1302_Write_Time();//接收更新的时间然后写入ds1302
SetFlag=0;//时钟信息更新后标志位清零
}
if(ReadTimeFlag==1)//定时读取ds1302定时时间到则标志位置1,处理过时间参数标志位清零
{
ReadTimeFlag=0;//标志位清零
Ds1302_Read_Time();//读取时间参数
sprintf(temp,"DATE%02d-%02d-%02d%d",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[7]);//年月日周
LCD_Write_String(0,0,temp);//显示第一行
sprintf(temp,"TIME%02d:
%02d:
%02d",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);//时分秒
LCD_Write_String(0,1,temp);//显示第二行
}
}
}
/*------------------------------------------------
串口通讯初始化
------------------------------------------------*/
voidUART_Init(void)
{
SCON=0x50;//SCON:
模式1,8-bitUART,使能接收
TMOD|=0x20;//TMOD:
timer1,mode2,8-bit重装
TH1=0xFD;//TH1:
重装值9600波特率晶振11.0592MHz
TR1=1;//TR1:
timer1打开
EA=1;//打开总中断
ES=1;//打开串口中断
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer0(void)
{
TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00;//给定初值
//TL0=0x00;
EA=1;//总中断打开
ET0=1;//定时器中断打开
TR0=1;//定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
voidTimer0_isr(void)interrupt1
{
staticunsignedintnum;
TH0=(65536-2000)/256;//重新赋值2ms
TL0=(65536-2000)%256;
num++;
if(num==50)//大致100ms
{
num=0;
ReadTimeFlag=1;//读标志位置1
}
}
/*------------------------------------------------
串口中断程序
------------------------------------------------*/
voidUART_SER(void)interrupt4//串行中断服务程序
{
unsignedcharTemp;//定义临时变量
unsignedchari;
if(RI)//判断是接收中断产生
{
RI=0;//标志位清零
Temp=SBUF;//读入缓冲区的值
time_buf2[i]=Temp&0x0F;
i++;
if(i==16)//连续接收16个字符信息
{
i=0;
SetFlag=1;//接收完成标志位置1
}
SBUF=Temp;//把接收到的值再发回电脑端
}
if(TI)//如果是发送标志位,清零
TI=0;
}
/*-----------------------------------------------
名称:
LCD1602
内容:
引脚定义如下:
1-VSS2-VDD3-V04-RS5-R/W6-E7-14DB0-DB715-BLA16-BLK
------------------------------------------------*/
#include"1602.h"
#include"delay.h"
sbitRS=P2^4;//定义端口
sbitRW=P2^5;
sbitEN=P2^6;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
while(LCD_Check_Busy());//忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
while(LCD_Check_Busy());//忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//表示第一行
}
else
{
LCD_Write_Com(0xC0+x);//表示第二行
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
/*voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}*/
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
#include"delay.h"
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
#include"ds1302.h"
unsignedchartime_buf1[8]={20,10,6,5,12,55,00,6};//空年月日时分秒周
unsignedchartime_buf[8];//空年月日时分秒周
/*------------------------------------------------
向DS1302写入一字节数据
------------------------------------------------*/
voidDs1302_Write_Byte(unsignedcharaddr,unsignedchard)
{
unsignedchari;
RST_SET;
//写入目标地址:
addr
addr=addr&0xFE;//最低位置零
for(i=0;i<8;i++)
{
if(addr&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr=addr>>1;
}
//写入数据:
d
for(i=0;i<8;i++)
{
if(d&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
d=d>>1;
}
RST_CLR;//停止DS1302总线
}
/*------------------------------------------------
从DS1302读出一字节数据
------------------------------------------------*/
unsignedcharDs1302_Read_Byte(unsignedcharaddr)
{
unsignedchari;
unsignedchartemp;
RST_SET;
//写入目标地址:
addr
addr=addr|0x01;//最低位置高
for(i=0;i<8;i++)
{
if(addr&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr=addr>>1;
}
//输出数据:
temp
for(i=0;i<8;i++)
{
temp=temp>>1;
if(IO_R)
{
temp|=0x80;
}
else
{
temp&=0x7F;
}
SCK_SET;
SCK_CLR;
}
RST_CLR;//停止DS1302总线
returntemp;
}
/*------------------------------------------------
向DS1302写入时钟数据
------------------------------------------------*/
voidDs1302_Write_Time(void)
{
unsignedchari,tmp;
for(i=0;i<8;i++)
{//BCD处理
tmp=time_buf1[i]/10;
time_buf[i]=time_buf1[i]%10;
time_buf[i]=time_buf[i]+tmp*16;
}
Ds1302_Write_Byte(ds1302_control_add,0x00);//关闭写保护
Ds1302_Write_Byte(ds1302_sec_add,0x80);//暂停
//Ds1302_Write_Byte(ds1302_charger_add,0xa9);//涓流充电
Ds1302_Write_Byte(ds1302_year_add,time_buf[1]);//年
Ds1302_Write_Byte(ds1302_month_add,time_buf[2]);//月
Ds1302_Write_Byte(ds1302_date_add,time_buf[3]);//日
Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);//周
Ds1302_Write_Byte(ds1302_hr_add,time_buf[4]);//时
Ds1302_Write_Byte(ds1302_min_add,time_buf[5]);//分
Ds1302_Write_Byte(ds1302_sec_add,time_buf[6]);//秒
Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);//周
Ds1302_Write_Byte(ds1302_control_add,0x80);//打开写保护
}
/*------------------------------------------------
从DS1302读出时钟数据
------------------------------------------------*/
voidDs1302_Read_Time(void)
{
unsignedchari,tmp;
time_buf[1]=Ds1302_Read_Byte(ds1302_year_add);//年
time_buf[2]=Ds1302_Read_Byte(ds1302_month_add);//月
time_buf[3]=Ds1302_Read_Byte(ds1302_date_add);//日
time_buf[4]=Ds1302_Read_Byte(ds1302_hr_add);//时
time_buf[5]=Ds1302_Read_Byte(ds1302_min_add);//分
time_buf[6]=(Ds1302_Read_Byte(ds1302_sec_add))&0x7F;//秒
time_buf[7]=Ds1302_Read_Byte(ds1302_day_add);//周
for(i=0;i<8;i++)
{//BCD处理
tmp=time_buf[i]/16;
time_buf1[i]=time_buf[i]%16;
time_buf1[i]=time_buf1[i]+tmp*10;
}
}
/*------------------------------------------------
DS1302初始化
------------------------------------------------*/
voidDs1302_Init(void)
{
RST_CLR;//RST脚置低
SCK_CLR;//SCK脚置低
Ds1302_Write_Byte(ds1302_sec_add,0x00);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1602 液晶显示 DS1302 时钟