ds1302的12864液晶按键可调显示实时时钟程序Word格式.docx
《ds1302的12864液晶按键可调显示实时时钟程序Word格式.docx》由会员分享,可在线阅读,更多相关《ds1302的12864液晶按键可调显示实时时钟程序Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
reg52.h>
ABSACC.h>
intrins.h>
#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,
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);
RLCD_CMD_WR=cmdcode;
LLCD_CMD_WR=cmdcode;
/********对LCD进行读写***********/
voidlcd_data_wr(ucharldata,ucharright)//
RLCD_DATA_WR=ldata;
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(0xb8+4,1);
k++)//这个for循环是为清楚不显示字的地方
}
/**********显示汉字****************/
/*********置入单个数字*********/
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);
//同上下部分的汉字
for(i1=8;
16;
else//否则右半部写
lcd_comd_wr(0xb8+2*posx,1);
lcd_comd_wr(0x40+8*(posy-8),1);
lcd_data_wr(shuzi[i1],1);
lcd_comd_wr(0xb8+2*posx+1,1);
/**********输出方式**************/
/****row=写入的行,col=写入的字,*/
/****n=空几格的数************/
voidlcd_num_wr(ucharrow,ucharcol,ucharn,uchar*str)
uchari2;
for(i2=print;
i2<
n;
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)
4)
lcd_comd_wr(0x40+16*posy,0);
lcd_data_wr(hanzi[i1],0);
for(i1=16;
32;
lcd_comd_wr(0x40+16*(posy-4),1);
lcd_data_wr(hanzi[i1],1);
voidlcd_str_wr(ucharrow,ucharcol,ucharn,uchar*str)
for(i2=0;
7)
col=col-8;
lcd_hanzi_wr(row,col,str+i2*32);
/***读出一个字节**********/
ucharRead1302_byte(ucharaddr)
uchari3,dat1,dat2;
CE=0;
_nop_();
SCK=0;
CE=1;
for(i3=0;
i3<
i3++)//写入要读的字节的地址
DIO=addr&
0x01;
addr=addr>
>
1;
SCK=1;
for(i3=0;
i3++)//读数据
dat1=dat1>
if(DIO)
dat1=dat1|0x80;
DIO=1;
dat2=dat1/16;
//将16进制转化为10进制
dat1=dat1%16;
dat1=dat2*10+dat1;
return(dat1);
/***x写入一个字节**********/
voidwrite_ds1302(ucharaddr,uchardat)
i2++)//写入要写的字节的地址
i2++)//写数据
DIO=dat&
dat=dat>
/*****将ds1302的数据分离**********/
voidzh()
buffer[0]=year/10;
buffer[1]=year%10;
buffer[2]=11;
buffer[3]=mouth/10;
buffer[4]=mout