voidlcd12864_init(void);
voidclr_lcd12864(void);
voidsend12864_com(unsignedcharcmd);
voidsend12864_data(unsignedchardat);
voidchek12864_busy(void);
voidset12864_xy(unsignedcharxpos,unsignedcharypos);
voidprint12864(unsignedcharx,unsignedchary,char*str);
voidprint12864str(unsignedcharxpos,unsignedcharypos,unsignedcharstr[],unsignedchark);
unsignedcharcodebuf[4]={0xbb,0xb6,0xd3,0xad};//欢迎
/********************测忙碌**********************/
//测忙碌子程序
//RS=0,RW=1,E=H,D0-D7=状态字
/************************************************/
voidchek12864_busy(void)
{unsignedchartemp1;//状态信息(判断是否忙)
CLRB(CONTROL,RS12864); //RS=0;
SETB(CONTROL,RW12864); //RW=1;
SETB(CONTROL,E12864); //E=1;
do{temp1=DATA;DATA=0xFF;}while(temp1&0x80);
SETB(CONTROL,E12864); //E=1;
DATA=0xFF;
}
/********************写命令**********************/
//写命令子程序
//
/************************************************/
voidsend12864_com(unsignedcharcmd)/*写命令*/
{
chek12864_busy();
CLRB(CONTROL,RS12864);//RS=0;
CLRB(CONTROL,RW12864);//RW=0;
DATA=cmd;
SETB(CONTROL,E12864);//E=1;
CLRB(CONTROL,E12864);//E=0;
}
/********************写数据**********************/
//写数据子程序
//
/************************************************/
voidsend12864_data(unsignedchardat)
{
chek12864_busy();
SETB(CONTROL,RS12864);//RS=1;
CLRB(CONTROL,RW12864);//RW=0;
DATA=dat;
SETB(CONTROL,E12864);//E=1;
CLRB(CONTROL,E12864);//E=0;
}
/********************初始化**********************/
//复位、通讯方式选择
/************************************************/
voidlcd12864_init(void)
{
SETB(CONTROL,RST12864); //复位RST=1
SETB(CONTROL,PSB12864); //通讯方式为并口PSB=1
//send12864_com(0x34);//34H--扩充指令操作
send12864_com(0x30);//功能设置,一次送8位数据,基本指令集
send12864_com(0x0C);//0000,1100整体显示,游标off,游标位置off
send12864_com(0x01);//0000,0001清DDRAM
send12864_com(0x02);//0000,0010DDRAM地址归位
send12864_com(0x80);//1000,0000设定DDRAM7位地址000,0000到地址计数器AC
}
/*******************************************************************/
// 设置显示位置 xpos(1~16),tpos(1~4)
/*******************************************************************/
voidset12864_xy(unsignedcharxpos,unsignedcharypos)
{
switch(ypos)
{
case1:
send12864_com(0X80|xpos);break;
case2:
send12864_com(0X90|xpos);break;
case3:
send12864_com(0X88|xpos);break;
case4:
send12864_com(0X98|xpos);break;
default:
break;
}
}
/*******************************************************************/
// 在指定位置显示字符串
/*******************************************************************/
voidprint12864(unsignedcharx,unsignedchary,char*str)
{
unsignedcharlcd_temp;
set12864_xy(x,y);
lcd_temp=*str;
while(lcd_temp!
=0x00)
{
send12864_data(lcd_temp);
lcd_temp=*(++str);
}
}
/********************写字符串******************/
//写字符串子程序
//xpos1取0~7共八列,ypos1取0~3共四行。
/**********************************************/
voidprint12864str(unsignedcharxpos,unsignedcharypos,unsignedcharstr[],unsignedchark)
{
unsignedcharn;
switch(ypos)
{case1:
xpos|=0x80;break; //第一行
case2:
xpos|=0x90;break; //第二行
case3:
xpos|=0x88;break; //第三行
case4:
xpos|=0x98;break; //第四行
default:
break;
}
send12864_com(xpos); //此处的Xpos已转换为LCM的显示寄存器实际地址
for(n=0;n {
send12864_data(str[n]);//显示汉字时注意码值,连续两个码表示一个汉字
}
}
/********************清屏************************/
//清屏
/************************************************/
voidclr_lcd1286412864(void)
{
send12864_com(0x01);
}
/********以下为液晶1602子程序*********************/
voidinit1602_lcd()
{
write1602_comd(0x01);
write1602_comd(0x0c);
write1602_comd(0x06);
write1602_comd(0X3C);//功能设置:
2行显示模式,数据为8位。
还有字体的设置。
write1602_comd(0x80); //设置第一行地址指针
for(i=0;i<10;i++) //初始化显示,用于显示格式符
{
write1602_data(table1[i]);
delay(20);
}
write1602_comd(0Xc0);//设置第二行地址指针
for(j=0;j<8;j++)
{
write1602_data(table2[j]);
delay(20);
}
i=0;j=0;
}
voiddelay(ucharz)
{
uchari,j;
for(j=z;j>0;j--)
for(i=125;i>0;i--);
}
voidwrite1602_comd(ucharcom)
{
RS1602=0;
DATA=com;
RW1602=0;
delay(5);
E1602=1;
delay(5);
E1602=0;
}
voidwrite1602_data(uchardate)
{
RS1602=1;
DATA=date;
RW1602=0;
delay(5);
E1602=1;
delay(5);
E1602=0;
}
/********以上为液晶子程序******************/
/********以下为DS1302子程序*******************************/
voidwriteds1602_byte(uchardat)
{
uchari,dat_w;
dat_w=dat; //数据送给变量dat_w
for(i=0;i<8;i++)
{
clk_io=0; //数据线先拉低
if(dat_w&0x01) //如果是1
{clk_io=1;}
else //如果是0
{clk_io=0;}
dat_w=dat_w>>1;//右移一位
sclk=0; //先拉低时钟信号
sclk=1; //拉高时钟信号
}
sclk=0; //写一字节完毕,拉低时钟信号
}
//-------------------------------
//----从DS1302读一字节(下降沿有效)--------
//----读出数据时从低位0位到高位7-----------
//-------------------------------
ucharreadds1602_byte()
{
uchari,k;
k=0;
for(i=0;i<8;i++)
{
k=k>>1;
if(clk_io)
{k=k|0x80;}
sclk=1; //先拉低时钟信号
sclk=0;
}
sclk=0;
return(k);
}
//-------------------------------
//----指定地址写一数据--------
//-------------------------------
voidWrite1602(ucharadd,uchardat)//dat为十进制数
{
clk_rst=0;
sclk=0;
clk_rst=1; //拉高RST
writeds1602_byte(add); //写地址
writeds1602_byte((dat/10<<4)|(dat%10));//DS1302中的时间数据是BCD码形式
sclk=0;
clk_rst=0;
}
//-------------------------------
//----指定地址读出一数据------
//-------------------------------
ucharRead1302(ucharadd)
{
uchartemp,dat1,dat2;
clk_rst=0;
sclk=0;
clk_rst=1;
writeds1602_byte(add);
temp=readds1602_byte();//读取的数据为16进制
sclk=0; //读取完毕,拉低SCLK
clk_rst=0; //拉低SCLK
dat1=temp/16; //16进制转成BCD
dat2=temp%16;
temp=dat1*10+dat2;//转换成10进制数字
return(temp);
}
//初始化DS1302
voidInit_DS1302(void)
{ //设置初始化时间
Write1602(WRITE_PROTECT,0X00);delay
(1);//禁止写保护
Write1602(WRITE_SECOND,0x00);delay
(1); //秒位初始化
Write1602(WRITE_MINUTE,0x00);delay
(1);//分钟初始化
Write1602(WRITE_HOUR,0x0C);delay
(1);//小时初始化
Write1602(WRITE_DAY,0x01);delay
(1); //星期初始化
Write1602(WRITE_DATE,0x12);delay
(1);//日初始化
Write1602(WRITE_MONTH,0x05);delay
(1);//月初始化
Write1602(WRITE_YEAR,0x09);delay
(1);//年初始化
Write1602(WRITE_PROTECT,0x80);delay
(1);//允许写保护
}
/***************以下为:
读写年、月、日、时、分、秒的子程序*******************/
/*不包括星期在内
功能:
从DS1302中读出时间和日期,并在1602液晶上显示出来
三个参数分别为:
1.读时间日期存储器地址2.写入的十位光标地址3.个位光标地址*/
voidread_write_date_time(ucharcom_addr,cusr_addr)
{
ucharhour_wei,ge_wei,call_data;
Write1602(WRITE_PROTECT,0x00);delay
(1);//禁止写保护
call_data=Read1302(com_addr);//秒
hour_wei=call_data/10;
ge_wei=call_data%10;
write1602_comd(cusr_addr);//设置第二行地址指针
write1602_data(hour_wei+0X30);
write1602_data(ge_wei+0X30);
Write1602(WRITE_PROTECT,0x80);delay
(1);//允许写保护
}
voidwrite_lcd(ucharcusr_addr,time_data)
{
ucharhour_wei,ge_wei;
hour_wei=time_data/10;
ge_wei=time_data%10;
write1602_comd(cusr_addr);//设置第二行地址指针
write1602_data(hour_wei+0X30);
write1602_data(ge_wei+0X30);
}
voidread_real_time()
{
ucharxq;
read_write_date_time(READ_HOUR,L2);//小时
read_write_date_time(READ_MINUTE,L2+3);
read_write_date_time(READ_SECOND,L2+6);
read_write_date_time(READ_YEAR,L1);
read_write_date_time(READ_MONTH,L1+3);
read_write_date_time(READ_DATE,L1+6);//日期
xq=Read130