ds1302的12864液晶按键可调显示实时时钟程序.docx
- 文档编号:18550162
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:21
- 大小:93.21KB
ds1302的12864液晶按键可调显示实时时钟程序.docx
《ds1302的12864液晶按键可调显示实时时钟程序.docx》由会员分享,可在线阅读,更多相关《ds1302的12864液晶按键可调显示实时时钟程序.docx(21页珍藏版)》请在冰点文库上搜索。
ds1302的12864液晶按键可调显示实时时钟程序
一.绪言
1.在信息显示技术中,人们发现了信息数字化的重要作用和意义。
数字化的信息更加准确,同一性,更易传输和识别。
很多信息可以直接由数字表示,从而数字化信息显示又成为信息显示的又一个重要内容。
又从数字化显示发展到字符显示,它把人类特有的语言文字用于显示,这种显示与数字显示合在一起用途更广用量更大。
在这同时,人们还希望用图形和图像进行显示,且显示的内容为五彩缤纷,并且可以实时活动和具有三维立体效果。
这些在二十世纪尾声时都已经陆续实现。
LCD的计算机器,半导体发光数码管显示(LED)的汽车计价器,商场的大屏幕广告。
这零零总总的各类显示正为你做着各种各样的服务,相信在不久的将来显示技术的发展将会为人类做出更大的贡献。
Ds1302时钟芯片现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。
这些电路的接口简单、价格低廉、使用方便,被广泛地采用。
本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
采用普通32.768kHz晶振。
(一)设计任务
本课题采用ds1302的时钟芯片为主要的的设计来源,采用显示是1cd1602的图形点阵液晶显示。
,
(二)提出方案及方案论证
在设计中,我主要是考虑ds1302的时间显示问题,因为网上也有ds1302的读写和显示程序,但是至于怎样才能显示详细信息,我提出了两个方案,一个是LCD1602来显示,一个是LCD12864,其中1602是个字符型的点阵,而1CD12864是个图形的点阵,相比之下12864能够更好显示数据,而CPU都采用89C52的单片机
(三)原理说明:
原理其实很简单,LCD12864的各种指令先进行宏定义和ds1302的读写指令也进行宏定义,从ds1302的读出数据显示在lcd上
(二)程序流程图
(三)C51程序设计,重要的代码要有注释。
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/********各种指令的宏定义********/
#defineLLCD_CMD_WRPBYTE[0x10]//LCD左半部写的命令rs=0,wr=0
#defineLLCD_CMD_RDPBYTE[0x11]//读命令rs=0,wr=0
#defineLLCD_DATA_WRPBYTE[0x12]//写数据rs=1,wr=0
#defineLLCD_DATA_RDPBYTE[0x13]//读数据rs=1,wr=1
#defineRLCD_CMD_WRPBYTE[0x20]//LCD右半部部分
#defineRLCD_CMD_RDPBYTE[0x21]//
#defineRLCD_DATA_WRPBYTE[0x22]//
#defineRLCD_DATA_RDPBYTE[0x23]//
#defineWRITE_SECOND0x80
#defineWRITE_MINUTE0x82
#defineWRITE_HOUR0x84
#defineWRITE_DAY0x86
#defineWRITE_MOUTH0x88
#defineWRITE_YEAR0x8c
#defineREAD_SECOND0x81
#defineREAD_MINUTE0x83
#defineREAD_HOUR0x85
#defineREAD_DAY0x87
#defineREAD_MOUTH0x89
#defineREAD_YEAR0x8d
#defineWRITE_PROTECT0x8E
/*************************/
sbitSCK=P1^1;
sbitDIO=P1^0;
sbitCE=P1^2;
sbitK1=P1^5;
sbitK2=P1^6;
sbitK3=P1^7;
sbitbusy=P0^7;
ucharsec,min,hour,day,mouth,year,print;
ucharbuffer[16];
codeucharshuzi1[]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//.
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空
};
codeucharhanzi1[]={
0x00,0x50,0x4F,0x4A,0x48,0xFF,0x48,0x48,0x48,0x00,0xFC,0x00,0x00,0xFF,0x00,0x00,
0x00,0x00,0x3F,0x01,0x01,0xFF,0x21,0x61,0x3F,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,
0x80,0x40,0x20,0xF8,0x07,0x22,0x18,0x0C,0xFB,0x48,0x48,0x48,0x68,0x48,0x08,0x00,
0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x04,0x04,0x04,0x04,0x06,0x04,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x01,0x06,0x0C,0x18,0x30,0x60,0x20,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x28,0x49,0x8A,0x0C,0xC8,0x38,0x08,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,
0x40,0x20,0x10,0x08,0x04,0x03,0x06,0x38,0x10,0x00,0x07,0x20,0x40,0x3F,0x00,0x00,
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x60,0x90,0x08,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x21,0x40,0x78,0x00,
/*******姓名:
刘飞***********/
};
codeucharshijian1[]={
0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00,
};
codeucharriqi1[]={
0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
};
codeucharhanzi2[]={
0x00,0x02,0x02,0xF2,0x12,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x02,0x02,0x00,
0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x07,0x10,0x20,0x40,0x3F,0x00,0x00,0x00,
0x20,0x21,0xEE,0x04,0x00,0x00,0xFF,0x29,0xA9,0xBF,0xA9,0xA9,0x01,0xFF,0x00,0x00,
0x00,0x00,0x1F,0x88,0x44,0x30,0x0F,0x00,0x0F,0x04,0x04,0x4F,0x80,0x7F,0x00,0x00,
0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,
0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00,
0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
0x40,0x30,0x2C,0xEB,0x28,0x28,0x00,0xF8,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0x00,
0x01,0x01,0x01,0xFF,0x41,0x21,0x00,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x00,0x00,
};
/******检测LCD忙函数*********/
voidlcd_busy_rd(ucharright)
{
if(right==1)
RLCD_CMD_RD;
else
LLCD_CMD_RD;
while(busy);
}
/**********写指令***********/
voidlcd_comd_wr(ucharcmdcode,ucharright)//写指令
{
lcd_busy_rd(right);
if(right==1)
RLCD_CMD_WR=cmdcode;
else
LLCD_CMD_WR=cmdcode;
}
/********对LCD进行读写***********/
voidlcd_data_wr(ucharldata,ucharright)//
{
lcd_busy_rd(right);
if(right==1)
RLCD_DATA_WR=ldata;
else
LLCD_DATA_WR=ldata;
}
/********延时函数*******/
voiddelay(uintnms)
{
uinti;
while(nms--)
for(i=0;i<500;i++);
}
/****lcd初始化*******/
voidlcd_init(void)
{
uintk;
lcd_comd_wr(0x3e+1,0);//左半部显示开
lcd_comd_wr(0xc0+0,0);//左半部顶行为第0行
lcd_comd_wr(0xb0+0,0);//设置左半部页的地址
lcd_comd_wr(0x40+0,0);//设置左列得地址
lcd_comd_wr(0x3e+1,1);
lcd_comd_wr(0xc0+0,1);
lcd_comd_wr(0x40+0,1);
lcd_comd_wr(0xb0+0,1);
for(k=0;k<256;k++)
{
lcd_data_wr(0x00,0);
lcd_data_wr(0x00,1);
}
lcd_comd_wr(0xb8+4,0);
lcd_comd_wr(0x40+0,0);
lcd_comd_wr(0xb8+4,1);
lcd_comd_wr(0x40+0,1);
for(k=0;k<256;k++)//这个for循环是为清楚不显示字的地方
{
lcd_data_wr(0x00,0);
lcd_data_wr(0x00,1);
}
}
/**********显示汉字****************/
/*********置入单个数字*********/
voidlcd_shuzi_wr(ucharposx,ucharposy,uchar*shuzi)
{
uchari1;
if(posy<8)
{
lcd_comd_wr(0xb8+2*posx,0);//左半部页的地址,相当于行扫描上半部分
lcd_comd_wr(0x40+8*posy,0);//左半部列的地址
for(i1=0;i1<8;i1++)
{
lcd_data_wr(shuzi[i1],0);
}
lcd_comd_wr(0xb8+2*posx+1,0);//同上下部分的汉字
lcd_comd_wr(0x40+8*posy,0);
for(i1=8;i1<16;i1++)
{
lcd_data_wr(shuzi[i1],0);
}
}
else//否则右半部写
{
lcd_comd_wr(0xb8+2*posx,1);
lcd_comd_wr(0x40+8*(posy-8),1);
for(i1=0;i1<8;i1++)
{
lcd_data_wr(shuzi[i1],1);
}
lcd_comd_wr(0xb8+2*posx+1,1);
lcd_comd_wr(0x40+8*(posy-8),1);
for(i1=8;i1<16;i1++)
{
lcd_data_wr(shuzi[i1],1);
}
}
}
/**********输出方式**************/
/****row=写入的行,col=写入的字,*/
/****n=空几格的数************/
voidlcd_num_wr(ucharrow,ucharcol,ucharn,uchar*str)
{
uchari2;
for(i2=print;i2 { if(col>15) { row++; col=col-16; } lcd_shuzi_wr(row,col,str+buffer[i2]*16);//i2=写入的数字 col++; } } /**********显示汉字****************/ /*********置入单个汉字**********/ voidlcd_hanzi_wr(ucharposx,ucharposy,uchar*hanzi) { uchari1; if(posy<4) { lcd_comd_wr(0xb8+2*posx,0);//左半部页的地址,相当于行扫描上半部分 lcd_comd_wr(0x40+16*posy,0);//左半部列的地址 for(i1=0;i1<16;i1++) { lcd_data_wr(hanzi[i1],0); } lcd_comd_wr(0xb8+2*posx+1,0);//同上下部分的汉字 lcd_comd_wr(0x40+16*posy,0); for(i1=16;i1<32;i1++) { lcd_data_wr(hanzi[i1],0); } } else//否则右半部写 { lcd_comd_wr(0xb8+2*posx,1); lcd_comd_wr(0x40+16*(posy-4),1); for(i1=0;i1<16;i1++) { lcd_data_wr(hanzi[i1],1); } lcd_comd_wr(0xb8+2*posx+1,1); lcd_comd_wr(0x40+16*(posy-4),1); for(i1=16;i1<32;i1++) { lcd_data_wr(hanzi[i1],1); } } } /**********输出方式**************/ /****row=写入的行,col=写入的字,*/ /****n=空几格的数************/ voidlcd_str_wr(ucharrow,ucharcol,ucharn,uchar*str) { uchari2; for(i2=0;i2 { if(col>7) { row++; col=col-8; } lcd_hanzi_wr(row,col,str+i2*32); col++; } } /***读出一个字节**********/ ucharRead1302_byte(ucharaddr) { uchari3,dat1,dat2; CE=0; _nop_(); SCK=0; _nop_(); CE=1; _nop_(); for(i3=0;i3<8;i3++)//写入要读的字节的地址 { SCK=0; DIO=addr&0x01; addr=addr>>1; SCK=1; } for(i3=0;i3<8;i3++)//读数据 { dat1=dat1>>1; SCK=0; if(DIO) dat1=dat1|0x80; SCK=1; } CE=0; _nop_(); SCK=0; _nop_(); SCK=1; DIO=1; dat2=dat1/16;//将16进制转化为10进制 dat1=dat1%16; dat1=dat2*10+dat1; return(dat1); } /***x写入一个字节**********/ voidwrite_ds1302(ucharaddr,uchardat) { uchari2; CE=0; _nop_(); SCK=0;_nop_(); CE=1; _nop_(); for(i2=0;i2<8;i2++)//写入要写的字节的地址 { SCK=0; DIO=addr&0x01; addr=addr>>1; SCK=1; } for(i2=0;i2<8;i2++)//写数据 { SCK=0; DIO=dat&0x01; dat=dat>>1; SCK=1; } CE=0; _nop_(); DIO=1; SCK=1; } /*****将ds1302的数据分离**********/ voidzh() { buffer[0]=year/10; buffer[1]=year%10; buffer[2]=11; buffer[3]=mouth/10; buffer[4]=mout
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ds1302 12864 液晶 按键 可调 显示 实时 时钟 程序