DS1302时钟+LCD1602显示+键盘调时+蜂鸣器.docx
- 文档编号:2868609
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:26
- 大小:19.24KB
DS1302时钟+LCD1602显示+键盘调时+蜂鸣器.docx
《DS1302时钟+LCD1602显示+键盘调时+蜂鸣器.docx》由会员分享,可在线阅读,更多相关《DS1302时钟+LCD1602显示+键盘调时+蜂鸣器.docx(26页珍藏版)》请在冰点文库上搜索。
DS1302时钟+LCD1602显示+键盘调时+蜂鸣器
/***************************************************************************
*标题:
可调的DS1302时钟在LCD1602上显示*
********************************************************************************
*接线:
JP8接JP4、蜂鸣器短路帽的左端接到P3^2(用一根杜邦线)*
*说明:
本实验是在普中科技单片机开发板HC6800EM3上实现的******************************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitSCK=P3^6;//时钟
sbitSDA=P3^4;//数据
sbitRST=P3^5;//DS1302复位
sbitlcdrs=P2^6;
sbitlcdrw=P2^5;
sbitlcden=P2^7;
sbitkey1=P1^4;
sbitkey2=P1^5;
sbitkey3=P1^6;
sbitkey4=P1^7;
sbitH=P1^1;//矩阵键盘第一行四个键
sbitbeep=P3^2;
bitReadRTC_Flag;//定义读DS1302标志
ucharmiao,fen,shi,ri,yue,week,nian,a,T,n=0;
charl_tmpdate[7]={50,8,1,7,10,1,12};//设置初始时间,秒分时日月周年12-10-0701:
08:
50
ucharcodewrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//秒分时日月周年最低位写位
ucharcoderead_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//秒分时日月周年最低位读位
ucharcodetable1[]="SUN";//星期字表
ucharcodetable2[]="MON";
ucharcodetable3[]="TUE";
ucharcodetable4[]="WED";
ucharcodetable5[]="THU";
ucharcodetable6[]="FRI";
ucharcodetable7[]="SAT";
ucharcodetab1[]="20--";
ucharcodetab2[]=":
:
";
/******************************************************************/
/*函数声明*/
/******************************************************************/
voidWrite_Ds1302_byte(uchartemp);
voidWrite_Ds1302(ucharaddress,uchardat);
ucharRead_Ds1302(ucharaddress);
voidRead_RTC(void);
voidSet_RTC(void);
voiddelay(uchara);
voidini_Timer();
voiddi();
voidlcd_mang();
voidwrite_lcd1602(ucharcmd,uchari);
voidini_lcd1602();
voidwrite_week(ucharxq);
voidwrite_nyr(ucharadd,uchardat);
voidwrite_sfm(ucharadd,uchardat);
voiddisplay();
voidkeyscan();
/******************************************************************/
/*主函数*/
/******************************************************************/
voidmain(void)
{
ini_Timer();
ini_lcd1602();
//Set_RTC();//写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽
while
(1)
{
keyscan();
if(ReadRTC_Flag==0)
{
Read_RTC();
display();
}
}
}
/******************************************************************/
/*BCD转换成LCD1602能显示的16进制数,秒、分、时*/
/******************************************************************/
voidwrite_sfm(ucharadd,uchardat)
{
uchargw,sw;
gw=dat%16;
sw=dat/16;
write_lcd1602(0x80+0x40+add,0);
write_lcd1602(sw+0x30,1);
write_lcd1602(gw+0x30,1);
}
/******************************************************************/
/*BCD转换成LCD1602能显示的16进制数,日、月、年*/
/******************************************************************/
voidwrite_nyr(ucharadd,uchardat)
{
uchargw,sw;
gw=dat%16;
sw=dat/16;
write_lcd1602(0x80+add,0);
write_lcd1602(sw+0x30,1);
write_lcd1602(gw+0x30,1);
}
/******************************************************************/
/*显示星期*/
/******************************************************************/
voidwrite_week(ucharxq)
{
ucharx;
write_lcd1602(0x80+12,0);
switch(xq)
{
case1:
for(x=0;x<3;x++)
{
write_lcd1602(table1[x],1);
}
break;
case2:
for(x=0;x<3;x++)
{
write_lcd1602(table2[x],1);
}
break;
case3:
for(x=0;x<3;x++)
{
write_lcd1602(table3[x],1);
}
break;
case4:
for(x=0;x<3;x++)
{
write_lcd1602(table4[x],1);
}
break;
case5:
for(x=0;x<3;x++)
{
write_lcd1602(table5[x],1);
}
break;
case6:
for(x=0;x<3;x++)
{
write_lcd1602(table6[x],1);
}
break;
case7:
for(x=0;x<3;x++)
{
write_lcd1602(table7[x],1);
}
break;
}
write_lcd1602(0x80+12,0);
}
/******************************************************************/
/*显示函数*/
/******************************************************************/
voiddisplay()
{
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
write_nyr(3,nian);
write_nyr(6,yue);
write_nyr(9,ri);
write_week(week);
}
/******************************************************************/
/*毫秒级延时函数*/
/******************************************************************/
voiddelay(uchara)
{
uchari;
while(a--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/******************************************************************/
/*定时器0使蜂鸣器发声函数*/
/******************************************************************/
voidini_Timer()
{
a=0;
TMOD=0X01;
TH0=(65536-250)/256;
TL0=(65536-250)%256;
EA=1;
ET0=1;
TR0=1;
}
voidtimer0()interrupt1
{
TH0=(65536-250)/256;
TL0=(65536-250)%256;
a++;
}
voiddi()
{
while(key1==0||key2==0||key3==0)
{
if(a==2)
{
a=0;
beep=~beep;
}
}
}
/******************************************************************/
/*LCD1602判忙函数*/
/******************************************************************/
voidlcd_mang()
{
lcdrs=0;
lcdrw=1;
lcden=1;
_nop_();
_nop_();
_nop_();
_nop_();
while(P0&0x80);
lcden=0;
}
/******************************************************************/
/*LCD1602写指令(i=0)、数据(i=1)函数*/
/******************************************************************/
voidwrite_lcd1602(ucharcmd,uchari)
{
lcd_mang();
lcdrs=i;
lcdrw=0;
lcden=0;
_nop_();
_nop_();
lcden=1;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
lcden=0;
}
/******************************************************************/
/*LCD1602初始化函数*/
/******************************************************************/
voidini_lcd1602()
{
uchari;
write_lcd1602(0x38,0);
delay
(1);
write_lcd1602(0x0c,0);
delay
(1);
write_lcd1602(0x06,0);
delay
(1);
write_lcd1602(0x01,0);
delay
(1);
write_lcd1602(0x80+1,0);
for(i=0;i<8;i++)
{
write_lcd1602(tab1[i],1);
}
write_lcd1602(0x80+0x40+4,0);
for(i=0;i<6;i++)
{
write_lcd1602(tab2[i],1);
}
}
/******************************************************************/
/*DS1302写一个字节*/
/******************************************************************/
voidWrite_Ds1302_Byte(uchartemp)
{
uchari;
for(i=0;i<8;i++)//循环8次写入数据
{
SCK=0;
SDA=temp&0x01;//每次传输低字节
temp>>=1;//右移一位
SCK=1;
}
}
/******************************************************************/
/*写入DS1302*/
/******************************************************************/
voidWrite_Ds1302(ucharaddress,uchardat)
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();//启动
Write_Ds1302_Byte(address);//发送地址
Write_Ds1302_Byte(dat);//发送数据
RST=0;//恢复
}
/******************************************************************/
/*读出DS1302数据*/
/******************************************************************/
ucharRead_Ds1302(ucharaddress)
{
uchari,temp=0x00;
RST=0;
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
RST=1;
_nop_();
_nop_();
Write_Ds1302_Byte(address);
for(i=0;i<8;i++)//循环8次读取数据
{
if(SDA)
temp|=0x80;//每次传输低字节
SCK=0;
temp>>=1;//右移一位
_nop_();
_nop_();
_nop_();
SCK=1;
}
RST=0;
_nop_();//以下为DS1302复位的稳定时间
_nop_();
RST=0;
SCK=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
return(temp);//返回
}
/******************************************************************/
/*读时钟数据*/
/******************************************************************/
voidRead_RTC(void)//读取日历
{
uchari,*p;
p=read_rtc_address;//地址传递
for(i=0;i<7;i++)//分7次读取秒分时日月周年
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
miao=l_tmpdate[0];
fen=l_tmpdate[1];
shi=l_tmpdate[2];
ri=l_tmpdate[3];
yue=l_tmpdate[4];
week=l_tmpdate[5];
nian=l_tmpdate[6];
}
}
/******************************************************************/
/*设定时钟数据*/
/******************************************************************/
voidSet_RTC(void)//设定日历
{
uchari,*p,tmp;
for(i=0;i<7;i++)
{//BCD处理
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
}
Write_Ds1302(0x8E,0X00);//允许写,禁止写保护
p=write_rtc_address;//传地址
for(i=0;i<7;i++)//7次写入秒分时日月周年
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);//打开写保护
}
/******************************************************************/
/*键盘扫描函数*/
/******************************************************************/
voidkeyscan()
{
H=0;//矩阵键盘第一排公共端拉低用于矩阵键盘的扫描检测
if(key1==0)//功能键
{
delay
(1);
if(key1==0)
{
di();
while(!
key1);//松手检测
++n;
ReadRTC_Flag=1;//停止走时
switch(n)
{
case1:
write_lcd1602(0x80+0x40+11,0);//按一次功能键秒闪烁
write_lcd1602(0x0f,0);
Write_Ds1302(0x8e,0x00);//允许写,禁止写保护
Write_Ds1302(0x80,0x80|miao);//写入DS1302秒位
Write_Ds1302(0x8e,0x80);//打开写保护
break;
case2:
write_lcd1602(0x80+0x40+8,0);//按两次功能键分闪烁
break;
case3:
write_lcd1602(0x80+0x40+5,0);//按三次功能键时闪烁
break;
case4:
write_lcd1602(0x80+10,0);//按四次功能键日闪烁
break;
case5:
write_lcd1602(0x80+7,0);//按五次功能键月闪烁
break;
case6:
write_lcd1602(0x80+4,0);//按六次功能键年闪烁
break;
case7:
write_lcd1602(0x80+12,0);//按七次功能键周闪烁
break;
case8:
n=0;//按八次功能键开始走时,停止闪烁
ReadRTC_Flag=0;
write_lcd1602(0x0c,0);
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x80,0x00|miao);
Write_Ds1302(0x8e,0x80);
break;
}
}
}
if(n!
=0)//功能加键
{
if(key2==0)
{
delay
(1);
if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS1302 时钟 LCD1602 显示 键盘 蜂鸣器