📄 lcdw.c
字号:
/******************************************/
/************sunrise************/
#include<stc12c5a60s2.h>
#include<ds18b203.h>
#define uchar unsigned char
#define uint unsigned int
/********************************************************/
sbit rs=P1^0;
sbit rw=P1^1;
sbit ee=P1^2;
sbit psb=P1^6;
sbit res = P1^3;
sbit hwx=P3^3;
sbit sound=P1^5;
/********************************************************/
uint n1,n2,yy,dd,aa,mm,bb,tt,xq;
uint num,k;
uint kai,tin=0;
uint itt;
float txx;
uchar ly_disdate[4]={0,0,0,0};
uchar ly_dis[4]; //显示缓冲
uchar ly_lhj[4]; //保存NEC的四个字节数据
bit ly_flag=1;
/********************************************************/
code uchar table3[]={
/*-- 调入了一幅图像:E:\单片机\自定义图\22.bmp --*/
/*-- 宽度x高度=16x16 --*/
0x00,0xFF,0x00,0xFC,0x00,0xF0,0x00,0xE0,0x00,0xCC,0x00,0xDE,0x00,0xDE,0x00,0xCC,
0x00,0xE1,0x00,0xF1,0x00,0xF9,0x00,0xF0,0x00,0xF0,0x00,0xE5,0x00,0xFF,0x00,0xFF};
code uchar table4[]={
/*-- 调入了一幅图像:E:\单片机\自定义图\33.bmp --*/
/*-- 宽度x高度=16x16 --*/
0xFF,0x00,0x3F,0x00,0x0F,0x00,0x07,0x00,0x33,0x00,0x7B,0x00,0x7B,0x00,0x33,0x00,
0x87,0x00,0x8F,0x00,0x9F,0x00,0x0F,0x00,0x0F,0x00,0xA7,0x00,0xFF,0x00,0xFF,0x00};
code uchar table1[]={
/*-- 文字: 三 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00};
/********************************************************/
code uchar tab[]="sunrise♀";
code uchar tab2[]="*STUDIO*";
code uchar time0[]="0123456789-. :";
code uchar tab3[]="星期广东海洋大学";
code uchar tab4[]="℃";
code uchar tab5[]="一二人四五六日";
/********************************************************/
void delay(uint i) //
{
while(--i);
}
/********************************************************/
void suspend() //
{
IE=0x8E;
IT1=1;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
/********************************************************/
void clock() interrupt 1 using 2 //
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}
/********************************************************/
void nian()
{
dd=0;
yy++;
if(yy==13)
{
yy=0;
n1++;
if(n1==100)
{
n1=0;
n2++;
}
}
}
/********************************************************/
void fuzhi() //
{
if(tt==20)
{
tt=0;
bb++;
if(bb==60)
{
bb=0;
mm++;
if(mm==60)
{
mm=0;
aa++;
if(aa==24)
{
aa=0;
dd++;
if(yy<=7)
{
if(yy!=2)
{
if(yy%2==0&&dd==32)
{
nian();
}
if(yy%2!=2&&dd==31)
{
nian();
}
}
else
{
if(n1%4==0&&dd==30)
{
nian();
}
if(n1%4!=0&&dd==29)
{
nian();
}
}
}
else
{
if(yy%2==0&&dd==32)
{
nian();
}
if(yy%2!=0&&dd==31)
{
nian();
}
}
}
}
}
}
}
/********************************************************/
uint caiji(uchar da) //
{
da=da%10;
return(da);
}
/********************************************************/
uint caiji2(uchar da) //
{
da=da/10;
return(da);
}
/********************************************************/
void wendu()
{
int ltemp;
if(itt==0)
tmpchange(); //温度转换
if(itt==100)
{
txx=tmp()*0.0625; //得到真实十进制温度值,因为DS18B20
//可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。
ltemp=txx*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
if(ltemp<0)
{ //判断第一位显示整数还是负号
ly_dis[0]=10;
ltemp=0-ltemp;
}
else
ly_dis[0]=12;//显示百位值
ltemp=ltemp%1000;
ly_dis[1]=ltemp/100; //显示温度十位值
ltemp=ltemp%100;
ly_dis[2]=ltemp/10; //显示温度个位值
ly_dis[3]=ltemp%10; //显示小数点后一位
}
itt++;
if(itt==3000)
itt=0;
}
/********************************************************/
void hongwai() interrupt 2
{
uchar i,ia;
TL1=0;
TH1=0;
TR1=1;
while(!hwx);
TR1=0;
if(TH1<30||TH1>40)
return;
TH1=0;
TR1=1;
while(hwx)
{
delay(10);
if(TH1>22)
return;
}
TR1=0;
if(TH1<12)
return;
for(i=0;i<4;i++)
{
for(ia=0;ia<8;ia++)
{
sound=0 ;
while(!hwx); //
TH1=0;
TR1=1; //
while(hwx)
{
delay(10);
if(TH1>15)
return;
}
TR1=0;
ly_lhj[i]>>=1;
if(TH1>4)
ly_lhj[i]|=0x80;
}
}
sound=~sound;
ly_flag=1; //接收成功
TF1=0;
}
/********************************************************/
void choose()
{
if(ly_flag)
{ //接收成功处理显示缓冲,以16进制显示
ly_flag=0;
ly_disdate[2]=ly_lhj[2]/16;
ly_disdate[3]=ly_lhj[2]%16;
switch(ly_disdate[3])
{
case 4:
aa++;
if(aa==24)
{
aa=0;
dd++;
}
break;
case 0:
if(ly_disdate[2]==4)
{
mm++;
if(mm==60)
{
mm=0;
aa++;
}
}
break;
case 2:
kai=1;
break;
case 7:
yy++;
if(yy==13)
{
yy=0;
}
break;
case 5:
dd++;
if(dd==32)
{
dd=0;
}
break;
case 6:
n2++;
if(n2==100)
{
n2=0;
}
break;
case 9:
n1++;
if(n1==100)
{
n1=0;
n2++;
}
break;
default:
break;
}
}
}
/********************************************************/
void xingqi()
{
xq=n1+(n1/4)+(n2/4)-2*n2+(26*(yy+1)/10)+dd-1;
xq=xq%7;
switch(xq)
{
case 1:xq=0;break;
case 2:xq=2;break;
case 3:xq=4;break;
case 4:xq=6;break;
case 5:xq=8;break;
case 6:xq=10;break;
case 0:xq=12;break;
default:break;
}
}
/********************************************************/
void busy() //
{
rs=0;
rw=1;
ee=1;
while(P0&0x80);
ee=0;
}
/********************************************************/
void write_order(uchar order1) //
{
busy();
rs=0;
rw=0;
ee=1;
P0=order1;
delay(100);
ee=0;
}
/********************************************************/
void write_data(uchar data1) //
{
busy();
rs=1;
rw=0;
ee=1;
P0=data1;
delay(100);
ee=0;
}
/********************************************************/
void bingxing() //
{
delay(4000);
write_order(0x30);
delay(100);
write_order(0x30);
delay(37);
write_order(0x0c);
delay(100);
write_order(0x01);
delay(10000);
write_order(0x06);
}
/********************************************************/
void in_ram() //
{
uchar j;
write_order(0x30);
write_order(0x40);
for(j=0;j<16;j++)
{
write_data(table3[j*2]);
write_data(table3[j*2+1]);
}
write_order(0x50);
for(j=0;j<16;j++)
{
write_data(table4[j*2]);
write_data(table4[j*2+1]);
}
write_order(0x60);
for(j=0;j<16;j++)
{
write_data(table1[j*2]);
write_data(table1[j*2+1]);
}
/* write_order(0x70);
for(j=0;j<16;j++)
{
write_data(table2[j*2]);
write_data(table2[j*2+1]);
}*/
}
/********************************************************/
void shijian()
{
write_order(0x81);
for(num=0;num<11;num++)
{
switch(num)
{
case 0:
write_data(time0[12]);
break;
case 1:
write_data(time0[caiji2(n2)]);
break;
case 2:
write_data(time0[caiji(n2)]);
break;
case 3:
write_data(time0[caiji2(n1)]);
break;
case 4:
write_data(time0[caiji(n1)]);
break;
case 5:
write_data(time0[10]);
break;
case 6:
write_data(time0[caiji2(yy)]);
break;
case 7:
write_data(time0[caiji(yy)]);
break;
case 8:
write_data(time0[10]);
break;
case 9:
write_data(time0[caiji2(dd)]);
break;
case 10:
write_data(time0[caiji(dd)]);
break;
default:
break;
}
}
write_order(0x92);
for(num=0;num<8;num++)
{
switch(num)
{
case 0:
write_data(time0[caiji2(aa)]);
break;
case 1:
write_data(time0[caiji(aa)]);
break;
case 2:
write_data(time0[13]);
break;
case 3:
write_data(time0[caiji2(mm)]);
break;
case 4:
write_data(time0[caiji(mm)]);
break;
case 5:
write_data(time0[13]);
break;
case 6:
write_data(time0[caiji2(bb)]);
break;
case 7:
write_data(time0[caiji(bb)]);
break;
default:
break;
}
}
in_ram();
write_order(0x88);
for(num=0;num<16;num++)
{
if(num<4)
write_data(tab3[num]);
switch(num)
{
case 4:
if(xq==4)
{
write_data(0x00);
write_data(0x04);
}
else
write_data(tab5[xq]);
break;
case 5:
if(xq==4)break;
else
write_data(tab5[xq+1]);
break;
case 6:
write_data(time0[12]);
break;
case 7:
write_data(0x02);
break;
case 8:
write_data(0x02);
break;
case 9:
write_data(time0[ly_dis[0]]);
break;
case 10:
write_data(time0[ly_dis[1]]);
break;
case 11:
write_data(time0[ly_dis[2]]);
break;
case 12:
write_data(time0[11]);
break;
case 13:
write_data(time0[ly_dis[3]]);
break;
default:
break;
}
}
write_order(0x8f);
for(num=0;num<2;num++)
{
write_data(tab4[num]);
}
}
/********************************************************/
void caidan()
{
write_order(0x81);
for(k=0;k<12;k++)
{
write_data(tab3[k+4]);
}
write_order(0x92);
for(k=0;k<8;k++)
{
write_data(tab[k]);
}
write_order(0x8a);
for(k=0;k<8;k++)
{
write_data(tab2[k]);
}
}
/********************************************************/
void main()
{
bingxing();
suspend(); //
while(1)
{
choose();
caidan();
in_ram();
write_order(0x9b);
write_data(0x00);
write_data(0x00);
write_order(0x9c);
write_data(0x00);
write_data(0x02);
if(kai==1)
{
bingxing();
kai=0;
TR0=1;
while(1)
{
choose();
fuzhi();
xingqi();
wendu();
shijian();
if(kai==1)
{
TR0=0;
break;
}
}
bingxing();
kai=0;
}
//
/* write_order(0x9a);
write_data(0x00);
write_data(0x04);
//
write_order(0x9b);
write_data(0x00);
write_data(0x06); */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -