📄 main.c
字号:
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define rst RC4
#define clk RC6
#define data RC5
#define dataI TRISC5=1
#define dataO TRISC5=0
#define rs RB0
#define rw RB1
#define en RB2
#define busy RC7
#define DATA PORTC
#define sec 0x80
#define min 0x82
#define hour 0x84
#define date 0x86
#define mon 0x88
#define day 0x8a
#define year 0x8c
uchar tab[8],t1,flag;
uchar dd[21]="sunmontuewenthufrisat";
const uchar tab1[]={0x59,0x05,0x21,0x27,0x11,0x05,0x08,0x00};
void delay(uchar i)
{
uchar j;
for(;i>0;i--)
for(j=10;j>0;j++);
}
void write_com(uchar com)
{
delay(1);
DATA=com;
rs=0;
rw=0;
en=1;
delay(1);
en=0;
}
void write_dat(uchar dat)
{
delay(1);
DATA=dat;
rs=1;
rw=0;
en=1;
delay(1);
en=0;
}
void lcd_init()
{
uchar n;
TRISC=0x00;
PORTC=0x00;
TRISB&=0xf8;
ANSELH=0x00;
en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void io_init()
{
TRISC=0x00;
PORTC=0xff;
}
void write_byte(uchar x)
{
uchar i; //写一个字节
for(i=0;i<8;i++)
{
if(x&0x01==1)
{
data=1;
}
else
{
data=0;
}
clk=1;
clk=0;
x=x>>1;
}
}
uchar read_byte()
{
uchar y=0x00,j; //读一个字节
dataI;
for(j=0;j<8;j++)
{
y=y>>1;
if(data==1)
{
y|=0x80;
}
else
{
y=y;
}
clk=1;
clk=0;
}
dataO;
return y;
}
unsigned char read1302(uchar add)
{ //读1302某地址数据
unsigned char dat;
rst=0;
clk=0;
rst=1;
write_byte(add|1);
dat=read_byte();
rst=0;
clk=1;
return dat;
}
unsigned char write1302(uchar add,uchar dat)
{ //写1302某地址数据
rst=0;
clk=0;
rst=1;
write_byte(add);
write_byte(dat);
clk=1;
rst=0;
}
void read_time()//单次读取1302
{
tab[0]=read1302(sec);
tab[1]=read1302(min);
tab[2]=read1302(hour);
tab[3]=read1302(date );
tab[4]=read1302(mon);
tab[5]=read1302(day);
tab[6]=read1302(year);
}
void num_change()//BCD转10进制
{
uchar i,x;
for(i=0;i<7;i++)
{
x=tab[i]/16;
tab[i]=tab[i]-6*x;
}
}
void show_time()//在1602上显示时间
{
uchar y2,y1,m2,m1,d2,d1,i,h2,h1,mm2,mm1,s2,s1;
write_com(0x80);
y2=tab[6]/10;
y1=tab[6]%10;
write_dat(0x32);
write_dat(0x30);
write_dat(y2+0x30);
write_dat(y1+0x30);
write_dat(0x2e);
m2=tab[4]/10;
m1=tab[4]%10;
write_dat(m2+0x30);
write_dat(m1+0x30);
write_dat(0x2e);
d2=tab[3]/10;
d1=tab[3]%10;
write_dat(d2+0x30);
write_dat(d1+0x30);
write_com(0x8d);
switch(tab[5])
{
case 0x01: for(i=0;i<3;i++)
{
write_dat(dd[i]);
}
break;
case 0x02: for(i=0;i<3;i++)
{
write_dat(dd[i+3]);
}
break;
case 0x03: for(i=0;i<3;i++)
{
write_dat(dd[i+6]);
}
break;
case 0x04: for(i=0;i<3;i++)
{
write_dat(dd[i+9]);
}
break;
case 0x05: for(i=0;i<3;i++)
{
write_dat(dd[i+12]);
}
break;
case 0x06: for(i=0;i<3;i++)
{
write_dat(dd[i+15]);
}
break;
case 0x07: for(i=0;i<3;i++)
{
write_dat(dd[i+18]);
}
break;
}
write_com(0xc0);
h2=tab[2]/10;
h1=tab[2]%10;
write_dat(h2+0x30);
write_dat(h1+0x30);
write_dat(0x3a);
mm2=tab[1]/10;
mm1=tab[1]%10;
write_dat(mm2+0x30);
write_dat(mm1+0x30);
write_dat(0x3a);
s2=tab[0]/10;
s1=tab[0]%10;
write_dat(s2+0x30);
write_dat(s1+0x30);
}
void show_realtime()//一次读取一个字节读取7个字节
{
read_time();
num_change();
show_time();
}
void tmr1_init()//定时器1初始化
{
GIE=1;
PEIE=1;
TMR1IE=1;
TMR1IF=0;
T1CON=0x30;
TMR1L=0xd5;//定时0.5s
TMR1H=0x0b;
TMR1ON=1;
}
void interrupt tmr1()//定时器中断函数
{
if(TMR1IF==1)
{
TMR1L=0xd5;
TMR1H=0x0b;
TMR1IF=0;
t1++;
if(t1==2)
{
t1=0;
flag=1;
}
}
}
void protect_change()//读取开启定时器和写使能
{
uchar xx,yy;
xx=read1302(0x80);
yy=read1302(0x8e);
if(xx&0x80==1)
{
write1302(0x80,0x00);
}
if(yy&0x80==1)
{
write1302(0x8e,0x00);
}
}
void time_init()//给1302赋初值
{
uchar i;
rst=0;
clk=0;
rst=1;
write_byte(0xbe);
for(i=0;i<8;i++)
{
write_byte(tab1[i]);
}
clk=1;
rst=0;
}
void read_times()//一次读取8个字节
{
uchar i;
rst=0;
clk=0;
rst=1;
write_byte(0xbf);
for(i=0;i<8;i++)
{
tab[i]=read_byte();
}
clk=1;
rst=0;
}
void show_realtimes()//一次读取8个字节显示
{
read_times();
num_change();
show_time();
}
void main()
{
tmr1_init();
io_init();
// time_init();
protect_change();
lcd_init();
show_realtime();
while(1)
{
if(flag==1)
{
NOP();
flag=0;
show_realtimes();
NOP();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -