标题:
基于stc89c51的万年历lcd1602不显示内容 求帮助
[打印本页]
作者:
fxx1369
时间:
2021-2-19 10:38
标题:
基于stc89c51的万年历lcd1602不显示内容 求帮助
该设计的时间和星期可以正常显示,但是年份没有具体的平年闰年月份算法,所以并没有真正实现万年历,仅供参考,也欢迎大家完善该代码。
#include<reg51.h>
#include<lcd1602.h>
#include<aj.h>
//#include<ds18b20.h>
#include<temp.h>
//#include<sound.h>
#include<stdlib.h>
unsigned char datas[] = { 0, 0}; //定义数组
uchar code digit[]={"0123456789"};
uchar count;
void LcdDisplay(int);
void clock();
void main()
{
P1=0xf0;
lcdinitiata();
TMOD=0X10; //使用T1的方式1定时
TH1=(65536-50000)/256; //
TL1=(65536-50000)%256;
EA=1; //开总中断
ET1=1; //允许定时器T1中断
TR1=1; //启动定时器T1
count=0;
s=50;
m=10;
h=10;
d=24;
w=1;
n=6;
y=2019;
z=12;
x=12;
writeaddress(0x04) ;
writedata('-');
writeaddress(0x07) ;
writedata('-');
writeaddress(0x42) ;
writedata(':');
writeaddress(0x45) ;
writedata(':');
writeaddress(0x4c) ;
writedata(':');
beep=0;
writeinrtuction(0x80+0x0f); //写地址 80表示初始地址
writedata(0xdf);
while(1)
{
displayyear(); //年
delay_ms(5);
displaymonth(); //月
delay_ms(5);
displaydata(); //日
delay_ms(5);
displayweek(); //周
delay_ms(5);
displayhour(); //时
delay_ms(5);
displaymin(); //分
delay_ms(5);
displaysec(); //秒
delay_ms(5);
displayzhour(); //闹钟时
delay_ms(5);
displayzmin(); //闹钟分
key_detect();
LcdDisplay(Ds18b20ReadTemp);
if(h==z&&m==x)
{
clock();
}
}
}
void displayyear() //显示年
{
uchar i,j,o,p;
i=y/1000;
j=y%1000/100;
o=y%100/10;
p=y%10;
writeaddress(0x00) ;
writedata(digit[i]);
writedata(digit[j]);
writedata(digit[o]);
writedata(digit[p]);
}
void displaymonth() //显示月
{
uchar i,j;
i=n/10;
j=n%10;
writeaddress(0x05) ;
writedata(digit[i]);
writedata(digit[j]);
}
void displayweek() //显示周
{
uchar i;
i=w/1;
writeaddress(0x0b) ;
writedata(digit[i]);
}
void displaydata() //显示日
{
uchar i,j;
i=d/10;
j=d%10;
writeaddress(0x08) ;
writedata(digit[i]);
writedata(digit[j]);
}
void displayhour() //显示时
{
uchar i,j;
i=h/10;
j=h%10;
writeaddress(0x40) ;
writedata(digit[i]);
writedata(digit[j]);
}
void displaymin() // 显示分
{
uchar i,j;
i=m/10;
j=m%10;
writeaddress(0x43) ;
writedata(digit[i]);
writedata(digit[j]);
}
void displaysec() // 显示秒
{
uchar i,j;
i=s/10;
j=s%10;
writeaddress(0x46) ;
writedata(digit[i]);
writedata(digit[j]);
}
void LcdDisplay(int temp) //lcd显示
{
float tp;
/* temp=temp-1;
temp=~temp; */
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算由?.5,还是在小数点后面。
datas[0] = temp % 10000 / 1000;
datas[1] = temp % 1000 / 100;
writeinrtuction(0x80+0x0d); //写地址 80表示初始地址
writedata('0'+datas[0]); //十位
writeinrtuction(0x80+0x0e); //写地址 80表示初始地址
writedata('0'+datas[1]); //个位
}
void displayzhour() //显示闹钟时
{
uchar i,j;
i=z/10;
j=z%10;
writeaddress(0x4a) ;
writedata(digit[i]);
writedata(digit[j]);
}
void displayzmin() // 显示闹钟分
{
uchar i,j;
i=x/10;
j=x%10;
writeaddress(0x4d) ;
writedata(digit[i]);
writedata(digit[j]);
}
void clock()
{
if((h == z) || (m == x))
{
beep = ~beep;
}
else
{
beep=1;
}
}
void t1_int() interrupt 3 //T1中断方式
{
count++;
if(count==20)
{
count=0;
s++;
}
if(s==60)
{
s=0;
m++;
}
if(m==60)
{
m=0;
h++;
}
if(h==24)
{
h=0;
w++;
}
if(w==8)
{
w=1;
d++;
}
if(d > 31)
{
d = 1;
n++;
}
if(n > 13)
{
n = 1;
y++;
}
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
复制代码
电子表.zip
2021-2-19 10:34 上传
点击文件名下载附件
95.71 KB, 下载次数: 17
作者:
leezll
时间:
2021-2-21 00:53
请问有原理图发一张可以吗
作者:
cn_zhx
时间:
2021-2-21 08:08
用内部定时器走的准吗?
作者:
2596226218
时间:
2021-6-4 13:26
为什么不显示呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1