📄 1286lcd+clock.c
字号:
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar m=0;
uchar n=0;
unsigned char a,b,c,d,e,f,g,h,i,de,da,ia,ib;
uchar code shuzi[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar hanzi[]={ "年月日星期时分秒 "};
uchar code ii[]={ "只争 朝夕" };
uchar code weizhi[]=
{
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, /*第一行汉字位置*/
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, /*第二行汉字位置*/
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, /*第三行汉字位置*/
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, /*第四行汉字位置*/
};
/***********引脚定义****************/
//sbit WP=P2^1;
sbit RS=P2^4;
sbit RST=P1^4;
sbit E=P2^6;
sbit RW=P2^5;
//sbit WR=0;
///////////////////////1302引脚
sbit RST_=P1^2;
sbit IO=P1^1;
sbit SCLK=P1^0;
uchar bdata AB;
uchar bdata AD;
sbit AB0=AB^0;
sbit AB7=AB^7;
sbit AD0=AD^0;
sbit AD7=AD^7;
uchar data time[7]={0x00,0x41,0x18,0x28,0x06,0x04,0x07}; //秒,分,时,日,月,周,年
turnbcd(unsigned char bcd)
{
unsigned char n_n;
n_n=(bcd&0xf0)/16*10+(bcd&0x0f);
return(n_n);
}
/*********延时函数**************/
void delay(uint b)
{
while(b--);
}
/*---------------------------------------------液晶部分-------------------------------
------------------*/
/***********写命令***********/
void write_com(uchar com)
{
delay(150);
RST=1;
E=1;
RS=0;
RW=0;
P0=com;
E=0;
}
/****************写数据*****************/
void write_dat(uchar dat)
{
delay(15);
RST=1;
E=1;
RS=1;
RW=0;
P0=dat;
E=0;
}
/***************写汉字功能****************/
void write_chinese(uchar *str,uchar a,uchar b,uchar c)
{
write_com(0x30);
delay(100);
while(c!=0)
{
write_com(weizhi[a]);
write_dat(str[b]);
b++;
write_dat(str[b]);
b++;
a++;
c--;
}
}
/************写数据功能*****************/
void write_digital(uchar a,uchar b,uchar c)
{
write_com(weizhi[a]);
write_dat(shuzi[b]);
write_dat(shuzi[c]);
}
/**************初始化液晶**************/
void lcd_ready(void)
{
TMOD=0X20;
SCON=0X50;
TL1=0XFD;
TH1=0XFD;
ES=1;
TR1=1;
EA=1;
delay(100);
write_com(0x30);
write_com(0x03);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void end_xianshi(void)
{
//write_chinese(hanzi,0,0,32);
write_digital(0,m,n);
write_digital(4,7,7);
}
void chuakou(void) interrupt 4 using 1
{
RI=0;
EA=0;
n=SBUF;
EA=1;
}
/*----------------------------------------------------1302程序------------------------------------------------*/
/*********************
写数据 低位开始
**********************/
void inputbyte(unsigned char a_a)
{
unsigned char b_b;
AB=a_a;
for(b_b=8; b_b>0; b_b--)
{
IO = AB0;
SCLK = 1;
SCLK = 0;
AB = AB >> 1;
}
}
/********************
读取字节有返回值
*********************/
outputbyte()
{
unsigned char b_b;
for(b_b=7; b_b>0; b_b--)
{
AD7=IO;
SCLK = 1;
SCLK = 0;
AD = AD>>1;
}
return(AD);
}
/*********************
往1302里写数据参数分别为
地址 和 数据
**********************/
void w1302(unsigned char add,unsigned char dat)
{
RST_=0;
SCLK=0;
RST_=1;
inputbyte(add);
inputbyte(dat);
SCLK = 1;
RST_ = 0;
}
/**********************
读取1302某地址的数据
返回值为该地址的数据
**********************/
unsigned char r1302(unsigned char add)
{
unsigned char ucdata;
RST_=0;
SCLK=0;
RST_=1;
inputbyte(add);
ucdata = outputbyte();
SCLK = 1;
RST_ = 0;
return(ucdata);
}
/********************
设置初始时间 秒 分 时
日 月 星期 年
**********************/
void set1302(void)
{
unsigned char q_q_=0;
unsigned char b_b_;
unsigned char add_ = 0x80;
uchar ds1302st;
SCLK=0;
RST_=0; //ds1302的状态,0x55时不能进行初始化
ds1302st=r1302(0x0c1); //读取DS1302的RAM1单元中的标志数据
if(ds1302st!=0x55) //判断标志数据是否为0x55
{w1302(0x8e,0x00); w1302(0x0c1,0x55);
for(b_b_ =7; b_b_>0; b_b_--)
{
w1302(add_,time[q_q_]);
add_ +=2;
q_q_++;
} w1302(0x80,0x00); }
}
/********************
保存当前时间格式为:
秒 分 时 日 月 星期 年
********************/
void get1302(void)
{
unsigned char b_b;
unsigned char ducaddr = 0x81;//读数据 连续读数 放到数组里
for (b_b=0; b_b<7; b_b++)
{
time[b_b]=turnbcd(r1302(ducaddr)); //格式为: 秒 分 时 日 月 星期 年
ducaddr += 2;
}
}
void main(void)
{
//uchar a,b,c,d,e,f=0;
lcd_ready();
//write_com(0x0F);write_dat(0x00);
set1302();
write_chinese(hanzi,1,0,1);
write_chinese(hanzi,3,2,1);
write_chinese(hanzi,5,4,1);
write_chinese(hanzi,14,14,1);
write_chinese(hanzi,9,10,1);
write_chinese(hanzi,11,12,1);
write_chinese(hanzi,20,6,2);
write_chinese(ii,24,0,8);
while(1)
{
get1302();
de=time[0]/10;
da=time[0]%10;
a=time[2]/10;
b=time[2]%10;
c=time[1]/10;
d=time[1]%10;
e=time[4]/10;
f=time[4]%10;
g=time[3]/10;
h=time[3]%10;
i=time[5]%10;
ia=time[6]/10;
ib=time[6]%10;
write_digital(0,ia,ib);
write_digital(2,e,f);
write_digital(4,g,h);
write_digital(8,a,b);
write_digital(10,c,d);
write_digital(13,de,da);
write_digital(22,0,5);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -