1602液晶显示DS1302时钟Word文件下载.docx
- 文档编号:6282134
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:17
- 大小:17.77KB
1602液晶显示DS1302时钟Word文件下载.docx
《1602液晶显示DS1302时钟Word文件下载.docx》由会员分享,可在线阅读,更多相关《1602液晶显示DS1302时钟Word文件下载.docx(17页珍藏版)》请在冰点文库上搜索。
//定义显示区域临时存储数组
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);
//显示第一行
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
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());
//忙则等待
RW_CLR;
DataPort=com;
写入数据函数
voidLCD_Write_Data(unsignedcharData)
RS_SET;
DataPort=Data;
清屏函数
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)
LCD_Write_Com(0x80+x);
LCD_Write_Data(Data);
}*/
初始化函数
voidLCD_Init(void)
LCD_Write_Com(0x38);
/*显示模式设置*/
LCD_Write_Com(0x08);
/*显示关闭*/
/*显示清屏*/
LCD_Write_Com(0x06);
/*显示光标移动设置*/
LCD_Write_Com(0x0C);
/*显示开及光标设置*/
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
voidDelayUs2x(unsignedchart)
{
while(--t);
mS延时函数,含有输入参数unsignedchart,无返回值
0~255这里使用晶振12M,精确延时请使用汇编
voidDelayMs(unsignedchart)
while(t--)
//大致延时1mS
DelayUs2x(245);
unsignedchartime_buf1[8]={20,10,6,5,12,55,00,6};
//空年月日时分秒周
unsignedchartime_buf[8];
//空年月日时分秒周
向DS1302写入一字节数据
voidDs1302_Write_Byte(unsignedcharaddr,unsignedchard)
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
if(d&
d=d>
RST_CLR;
//停止DS1302总线
从DS1302读出一字节数据
unsignedcharDs1302_Read_Byte(unsignedcharaddr)
unsignedchartemp;
addr=addr|0x01;
//最低位置高
//输出数据:
temp
temp=temp>
if(IO_R)
temp|=0x80;
temp&
=0x7F;
//停止DS1302总线
returntemp;
向DS1302写入时钟数据
voidDs1302_Write_Time(void)
unsignedchari,tmp;
{//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_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);
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脚置低
SCK_CLR;
//SCK脚置低
Ds1302_Write_Byte(ds1302_sec_add,0x00);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1602 液晶显示 DS1302 时钟
![提示](https://static.bingdoc.com/images/bang_tan.gif)