求17岁学霸旷课求婚帮忙

查看: 280|回复: 3
求学霸帮忙,液晶显示器有显示时间、但是时间不正确
0.png (20.04 KB, 下载次数: 44)
多功能电子钟
15:45 上传
&&/************************************************
下面是一个多功能的电子万年历的程序。
主要功能:
& && && && && & 1、显示当前的日期及标准北京时间
& && && && && & 2、实时检测当前温度并通过1602显示出来
& && && && && & 3、具有可调的闹钟功能,通过按键调整闹钟的起
& && && && && && & 闹时间
& && && && && & 4、通过按键实现画面的切换
************************************************/
#include&reg51.h&
#include&intrins.h&
#define uchar unsigned char
#define uint unsigned int
uchar code digit[]={&&};& &&&//定义字符数组显示数字
uchar code Error[]=&Error!Check!&;& &&&//说明没有检测到DS18B20
uchar code table[]=&Alarm Clock&;
uchar code table1[]=&&;
uchar code table2[]=&WEEK&;
uchar code table3[]=&Today is fine!&;
uchar code table4[]=&HELLO!&;
uchar code table5[]=&Made by lanxiaoling&;
uchar code table6[]=&Happy new year!&;//1.1
uchar code table7[]=&Valentine's Day&; //2.14
/*uchar code table8[]=&Qing Ming jie!&;//4.5
uchar code table9[]=&Happy Labor Day!&;//5.1
uchar code table10[]=&Duan Wu jie!&;//6.15
uchar code table11[]=&Army day!&;//8.1
uchar code table12[]=&Teacher's Day!&;//9.10
uchar code table13[]=&National Day!&;//10.1& && &&&
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
sbit RS=P2^0;& && && &&&//寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1;& && && &&&//读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2;& && && && &//使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7;& && && &&&//忙碌标志位,,将BF位定义为P0.7引脚
sbit DQ=P2^6;
sbit T_RST=P1^5;
sbit T_CLK=P1^3;& && && && && &
sbit T_IO=P1^4;
sbit beep=P2^4;
sbit key1=P3^0;& && && & //调闹钟的小时即x
sbit key2=P3^1;& && && & //调闹钟的分钟即y
sbit key3=P3^2;& && && & //显示切换
sbit key4=P3^3;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
& &//设置全局变量,专门用于严格延时
static uchar x=0x08,y=30;
uchar t_sec,sec1,sec2;
uchar t_min,min1,min2;
uchar t_hour,hour1,hour2;
uchar t_mon,mon1,mon2;
uchar t_day,day1,day2;
uchar t_year,year1,year2;
uchar week,week1;
uchar com,
void tixing(unsigned char mm,unsigned dd);
void show();
void delay1(uchar t)
{
& && &&&uchar a,b;
& && &&&for(a=t;a&0;a--)
& && &&&for(b=110;b&0;b--);
}
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
& && &&&uchar i,j;& && &&&
& && &&&for(i=0;i&10;i++)
& && && &for(j=0;j&33;j++)
& && && &&&;& && && && && &&&
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delaynms(uchar n)
{
& &
& && &&&for(i=0;i&n;i++)
& && && &&&delay1ms();
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
&&{
& &
& && &&&RS=0;& && & //根据规定,RS为低电平,RW为高电平时,可以读状态
& & RW=1;
& & E=1;& && &&&//E=1,才允许读写
& & _nop_();& &//空操作
& & _nop_();
& & _nop_();
& & _nop_();& &//空操作四个机器周期,给硬件反应时间& && &&&
& & result=BF;&&//将忙碌标志电平赋给result
& &E=0;& && && &//将E恢复低电平
& &
&&}
&&/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (uchar dictate)
{& &
& & while(BusyTest()==1);& &//如果忙就等待
& && && &RS=0;& && && && && && &//根据规定,RS和R/W同时为低电平时,可以写入指令
& && && &RW=0;& &
& && && &E=0;& && && && && && & //E置低电平(根据表8-6,写指令时,E为高脉冲,
& && && && && && && && && &// 就是让E从0到1发生正跳变,所以应先置&0&
& && && &_nop_();
& && && &_nop_();& && && && && &//空操作两个机器周期,给硬件反应时间
& && && &P0=& && && && &//将数据送入P0口,即写入指令或地址
& && && &_nop_();
& && && &_nop_();
& && && &_nop_();
& && && &_nop_();& && && && && &//空操作四个机器周期,给硬件反应时间
& && && &E=1;& && && && && && & //E置高电平
& && && &_nop_();
& && && &_nop_();
& && && &_nop_();
& && && &_nop_();& && && && && &//空操作四个机器周期,给硬件反应时间
& && && & E=0;& && && && && && &//当E由高电平跳变成低电平时,液晶模块开始执行命令
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
& &&&WriteInstruction(x|0x80); //显示位置的确定方法规定为&80H+地址码x&
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(uchar y)
{
& & while(BusyTest()==1);&&
& && && & RS=1;& && && &&&//RS为高电平,RW为低电平时,可以写入数据
& && && & RW=0;
& && && & E=0;& && && && &//E置低电平(根据表8-6,写指令时,E为高脉冲,
& && && && && && && &// 就是让E从0到1发生正跳变,所以应先置&0&
& && && & P0=y;& && && &&&//将数据送入P0口,即将数据写入液晶模块
& && && & _nop_();
& && && & _nop_();
& && && &&&_nop_();
& &&&_nop_();& && & //空操作四个机器周期,给硬件反应时间
& && && & E=1;& && && &&&//E置高电平
& && && & _nop_();
& && && & _nop_();
& && && & _nop_();
& && && &_nop_();& && &&&//空操作四个机器周期,给硬件反应时间
& && && &E=0;& && && && &//当E由高电平跳变成低电平时,液晶模块开始执行命令
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
& & delaynms(15);& && && && && &//延时15ms,首次写指令时应给LCD一段较长的反应时间
& & WriteInstruction(0x38);& &&&//显示模式设置:16×2显示,5×7点阵,8位数据接口
& && &&&delaynms(5);& && && && && & //延时5ms ,给硬件一点反应时间
& & WriteInstruction(0x38);
& && &&&delaynms(5);& && && && && &//延时5ms ,给硬件一点反应时间
& && &&&WriteInstruction(0x38);& &&&//连续三次,确保初始化成功
& && &&&delaynms(5);& && && && && &//延时5ms ,给硬件一点反应时间
& && &&&WriteInstruction(0x0c);& &&&//显示模式设置:显示开,无光标,光标不闪烁
& && &&&delaynms(5);& && && && && &//延时5ms ,给硬件一点反应时间
& && &&&WriteInstruction(0x06);& &&&//显示模式设置:光标右移,字符不移
& && &&&delaynms(5);& && && && && & //延时5ms ,给硬件一点反应时间
& && &&&WriteInstruction(0x01);& &&&//清屏幕指令,将以前的显示内容清除
& && &&&delaynms(5);& && && && & //延时5ms ,给硬件一点反应时间
}
void write_com(uchar com)//向1602写指令
{
& && && &RS=0;
& && && &RW=0;
& && && &P0=
& && && &delaynms(10);
& && && &E=1;
& && && &delaynms(10);
& && && &E=0;
}
/*****************************************************
函数功能:将DS18B20传感器初始化,读取应答信号
出口参数:flag
***************************************************/
bit Init_DS18B20(void)& && &&&
{
& && && && && && &//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
& && && &DQ = 1;& && && &&&//先将数据线拉高
& && && &for(time=0;time&2;time++) //略微延时约6微秒
& && && && & ;
& && && &DQ = 0;& && && &&&//再将数据线从高拉低,要求保持480~960us
& && && &for(time=0;time&200;time++)&&//略微延时约600微秒
& && && && & ;& && && &//以向DS18B20发出一持续480~960us的低电平复位脉冲
& && && &DQ = 1;& && && &&&//释放数据线(将数据线拉高)
& && && &for(time=0;time&10;time++)
& && && && & ;&&//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
& && && &flag=DQ;& && && & //让单片机检测是否输出了存在脉冲(DQ=0表示存在)& && &
& && && &for(time=0;time&200;time++)&&//延时足够长时间,等待存在脉冲输出完毕
& && && && &&&;
& && && &return (flag);& & //返回检测成功标志
}
/*****************************************************
函数功能:从DS18B20读取一个字节数据
出口参数:dat
***************************************************/
uchar ReadOneChar(void)
{
& && &&&uchar i=0;& && &&&
& && &&&&&//储存读出的一个字节数据
& && &&&for (i=0;i&8;i++)
& && && &{
& && && &&&
& && && &&&DQ =1;& && & // 先将数据线拉高
& && && &&&_nop_();& && && && &//等待一个机器周期& && && &
& && && &&&DQ = 0;& && &//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
& && && && && & dat&&=1;
& && && &&&_nop_();& &&&//等待一个机器周期& && && && && && &
& && && &&&DQ = 1;& &&&//将数据线&人为&拉高,为单片机检测DS18B20的输出电平作准备
& && && &&&for(time=0;time&2;time++)
& && && &;& && &//延时约6us,使主机在15us内采样
& && && &&&if(DQ==1)
& && && && && && && && &dat|=0x80;&&//如果读到的数据是1,则将1存入dat
& && && && && & else
& && && && && && && && &dat|=0x00;//如果读到的数据是0,则将0存入dat
& && && && & //将单片机检测到的电平信号DQ存入r[i]& && &&&
& && && &&&for(time=0;time&8;time++)
& && && && && && && & ;& && && && &&&//延时3us,两个读时序之间必须有大于1us的恢复期& && &&&
& & }& && && && && && && && && &
return(dat);& & //返回读出的十进制数据
}
/*****************************************************
函数功能:向DS18B20写入一个字节数据
入口参数:dat
***************************************************/&&
void WriteOneChar(uchar dat)
{
& && &&&uchar i=0;
& && &&&for (i=0; i&8; i++)
& && &&&{
& && && & DQ =1;& && && &// 先将数据线拉高
& && && & _nop_();& && && && & //等待一个机器周期& && && &
& && && & DQ=0;& && && & //将数据线从高拉低时即启动写时序& && &
& && && & DQ=dat&0x01;& &//利用与运算取出要写的某位二进制数据,
& && && && && && && &&&//并将其送到数据线上等待DS18B20采样& && &&&
& && && & for(time=0;time&10;time++)& && &&&
& && && && & ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
& && && & DQ=1;& && && & //释放数据线& && && && && && &&&
& && && & for(time=0;time&1;time++)
& && && && && && &;//延时3us,两个写时序间至少需要1us的恢复期
& && && & dat&&=1;& && & //将dat中的各二进制位数据右移1位
& && &&&}
& && && && && && &for(time=0;time&4;time++)
& && && && && && && && && && &; //稍作延时,给硬件一点反应时间
}
/*****************************************************
函数功能:显示没有检测到DS18B20
***************************************************/& &
void display_error(void)
{
& && &&&
& & WriteAddress(0x00);& & //写显示地址,将在第1行第1列开始显示
& && &&&i = 0;& && && && && & //从第一个字符开始显示
& && &&&while(Error[i] != '\0')&&//只要没有写到结束标志,就继续写
& && &&&{& && && && && && && && && && && && && && && && &
& && && && && & WriteData(Error[i]);& &//将字符常量写入LCD
& && && && && & i++;& && && && && &&&//指向下一个字符
& && && && && & delaynms(100);& && &&&//延时100ms较长时间,以看清关于显示的说明
& && &&&}& && &&&
& && &&&while(1)& && && && &&&//进入死循环,等待查明原因
& && && && && && &;
}
/*****************************************************
函数功能:显示温度的小数点
***************************************************/& &
void display_dot(void)
{& && && &
& && && &WriteAddress(0x80+0x40+0x03);& && && & //写显示地址,将在第2行第10列开始显示& && && && && && &
& && && &WriteData('.');& && &//将小数点的字符常量写入LCD
& && && &delaynms(50);& && && &//延时1ms给硬件一点反应时间& && && && && &
}
/*****************************************************
函数功能:显示温度的单位(Cent)
***************************************************/& &
void display_cent(void)
{&&
& & WriteAddress(0x80+0x40+0x05);& && &&&//写显示地址,将在第2行第13列开始显示& && &&&
& && &&&WriteData(0xdf);
& && &&&WriteAddress(0x80+0x40+0x06);
& && &&&WriteData('C');& && &&&
}
/*****************************************************
函数功能:显示温度的整数部分
入口参数:x
***************************************************/
void display_temp1(unsigned char x)
{
& && &&&uchar j,k,l;& &&&//j,k,l分别储存温度的百位、十位和个位
& && &&&j=x/100;& && && && &&&//取百位
& && &&&k=(x%100)/10;& & //取十位
& && &&&l=x%10;& && && && & //取个位&&
& && &&&WriteAddress(0x80+0x40);& & //写显示地址,将在第2行第7列开始显示
& && &&&WriteData(digit[j]);& & //将百位数字的字符常量写入LCD
& && &&&WriteData(digit[k]);& & //将十位数字的字符常量写入LCD
& && &&&WriteData(digit[l]);& & //将个位数字的字符常量写入LCD
& && &&&delaynms(50);& && && &//延时1ms给硬件一点反应时间& &&&
}
/*****************************************************
函数功能:显示温度的小数数部分
入口参数:x
***************************************************/
void display_temp2(uchar x)
{
& && && &WriteAddress(0x80+0x40+0x04);& && &//写显示地址,将在第2行第11列开始显示
& && &&&WriteData(digit[x]);& &&&//将小数部分的第一位数字字符常量写入LCD
& && &&&delaynms(50);& && && & //延时1ms给硬件一点反应时间
}
/*****************************************************
函数功能:做好读温度的准备
***************************************************/
void ReadyReadTemp(void)
{
& && &&&Init_DS18B20();& &&&//将DS18B20初始化
& && &&&WriteOneChar(0xCC); // 跳过读序号列号的操作
& && &&&WriteOneChar(0x44); // 启动温度转换& && && &
& & for(time=0;time&100;time++)
& && && && &;& && && &//温度转换需要一点时间
& && &&&Init_DS18B20();& &&&//将DS18B20初始化
& && &&&WriteOneChar(0xCC); //跳过读序号列号的操作
& && &&&WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位& && &&&
}
/*******************************************
向1302写一个字节
*******************************************/
void input_BYTE(uchar dat)
{
& && &&&
& && &&&ACC=
& && &&&for(i=8;i&0;i--)
& && &&&{
& && && && && &
& && && && && & T_IO=ACC0;
& && && && && & T_CLK=1;
& && && && && & T_CLK=0;
& && && && && & ACC=(ACC&&1);
& && &&&}
}
/*******************************************
1302读出一个字节
*******************************************/
uchar output_BYTE()
{
& && &&&
& && &&&for(i=8;i&0;i--)
& && &&&{
& && && &&&ACC=(ACC&&1);
& && && &&&ACC7=T_IO;
& && && &&&T_CLK=1;
& && && &&&T_CLK=0;
& && &&&}
& && &&&return (ACC);
}
/*******************************************
写数据
*******************************************/
void write_1302(uchar add,uchar dat)
{
& && &&&T_RST=0;
& && &&&T_CLK=0;
& && &&&T_RST=1;
& && &&&input_BYTE(add);
& && &&&input_BYTE(dat);
& && &&&T_CLK=1;
& && &&&T_RST=0;
}
/*******************************************
读数据
*******************************************/
uchar read_1302(uchar add)
{
& && &&&& && &&&
& && &&&T_RST=0;
& & T_CLK=0;
& && &&&T_RST=1;
& && &&&input_BYTE(add);
& && &&&inf=output_BYTE();
& && &&&T_CLK=1;
& && &&&T_RST=0;
& && &&&return (inf);
}
void init_1302()
{
& && &&&write_e,0x00);//关闭写保护;
//& && &&&write_,0xaa);//设置充电方式;
& && &&&write_,0x00);//秒寄存器初始化;
& && &&&write_,0x29);//分.......
& && &&&write_,0x08);//时.......
& && &&&write_,0x03);//日........
& && &&&write_,0x06);//月.......
& && &&&write_a,0x05);//星期...
& && &&&write_c,0x11);//年......& && && && && &&&
& && &&&write_e,0x80);//打开写保护;& && && && && &
}
/**********************************
闹钟显示子程序
**********************************/
void show_naozhong(uchar x,uchar y)
{
& && &&&uchar i,x1,x2,y1,y2;
& && &&&x1=x/10; //十位
& && &&&x2=x%10;//个位& && &&&
& && &&&WriteAddress(0x80+0x0b);& &//显示闹钟的小时部分
& && &&&WriteData(table1[x1]);
& && &&&WriteAddress(0x80+0x0c);
& && &&&WriteData(table1[x2]);
& && &&&
& && &&&y1=y/10; //十位
& && &&&y2=y%10;//个位& && &&&
& && &&&WriteAddress(0x80+0x0e);& &//显示闹钟的分钟部分
& && &&&WriteData(table1[y1]);
& && &&&WriteAddress(0x80+0x0f);
& && &&&WriteData(table1[y2]);
& && &&&
& && &&&WriteAddress(0x80+0x0d);& &//显示小时与分钟之间的那个冒号
& && &&&WriteData(':');
& && &&&WriteAddress(0x80);& && && && && && & //显示字符串:Alarm Clock
& && &&&for(i=0;i&11;i++)
& && &&&{
& && && && && & WriteData(table[i]);& && &&&
& && &&&}
& && &&&WriteAddress(0x80+0x40);& &//显示字符串:Today is fine!
& && &&&for(i=0;i&14;i++)
& && &&&{
& && && && && & WriteData(table3[i]);& && &&&
& && &&&}& && && && && && && && &
}
void main(void)
{& && && &
& &
& && &&&uchar TL;& &&&//储存暂存器的温度低位
& && &&&uchar TH;& & //储存暂存器的温度高位
& && &&&uchar TN;& && &//储存温度的整数部分
& && &&&uchar TD;& && & //储存温度的小数部分
& && &&&LcdInitiate();& && && &//将液晶初始化
& & init_1302();
& & delaynms(5);& && &&&//延时5ms给硬件一点反应时间& && &&&
//& && &&&if(Init_DS18B20()==1)
//& &display_error();
& && &&&EA=1;//开总中断
& && &&&EX1=1;//开外部中断1
& && &&&IT1=0;//下降沿触发
& && &&&WriteAddress(0x80+0x10);
& && &&&for(i=0;i&6;i++)
& && &&&{
& && && && && & WriteData(table4[i]);& && && && && &
& && &&&}
& && &&&WriteAddress(0x80+0x50);
& && &&&for(i=0;i&16;i++)
& && &&&{
& && && && && & WriteData(table5[i]);& && &&&
& && &&&}
& && &&&for(i=0;i&16;i++)
& && &&&{
& && && && && & write_com(0x18);
& && && && && & delaynms(250);& && &&&
& && &&&}
& && &&&delaynms(250);
& && &&&delaynms(250);
& && &&&delaynms(250);
& && &&&write_com(0x01);
& && &&&while(1)
& && &&&{
& && && && && & t_sec=read_);//读秒 ;
& && && && && & sec1=t_sec&0x0f;
& && && && && & sec2=(t_sec&&4);
& && &&&
& && && && && & t_min=read_);//读分 ;
& && && && && & min1=t_min&0x0f;
& && && && && & min2=(t_min&&4);
& && &&&
& && && && && & t_hour=read_);//读小时 ;
& && && && && & hour1=t_hour&0x0f;
& && && && && & hour2=(t_hour&&4);
//& && && && && & WriteAddress(0x80+0x40+0x08); //显示小时
//& && && && && & WriteData(table1[hour2]);& && && && && &&&
//& && && && && & WriteAddress(0x80+0x40+0x09);
//& && && && && & WriteData(table1[hour1]);
& && &&&
& && && && && & t_day=read_);//读日;
& && && && && & day1=t_day&0x0f;
& && && && && & day2=(t_day&&4);
& && &&&
& && && && && & t_mon=read_);//读月 ;
& && && && && & mon1=t_mon&0x0f;
& && && && && & mon2=(t_mon&&4);
& && &&&
& && && && && & week=read_b);//读星期 ;
& && && && && & week1=week&0x0f;
& && &&&
& && && && && & t_year=read_d);//读年 ;
& && && && && & year1=t_year&0x0f;
& && && && && & year2=(t_year&&4);
& && &&&
& && && && && & WriteAddress(0x80+0x06);& && && &
& && && && && & WriteData('2');
& && && && && & WriteAddress(0x80+0x07);& && && &
& && && && && & WriteData('0');& && &&&
& && && && && &
& && && && && &
& && && && && & WriteAddress(0x80);& && && & //显示星期(0x80~0x80+0x05)
& && && && && & for(i=0;i&4;i++)
& && && && && & {
& && && && && && && && &WriteData(table2[i]);& && &&&
& && && && && & }
& && && && && & WriteAddress(0x80+0x04);
& && && && && & WriteData(table1[week1]);
& && && && && && && && &
& && && && && & WriteAddress(0x80+0x08);//显示年& && && &
& && && && && & WriteData(table1[year2]);
& && && && && & WriteAddress(0x80+0x09);& && && &
& && && && && & WriteData(table1[year1]);
& && && && && && && && &
& && && && && & WriteAddress(0x80+0x0a);& && &&&//显示‘/’
& && && && && & WriteData('/');
& && &&&
& && && && && & WriteAddress(0x80+0x0b);//显示月
& && && && && & WriteData(table1[mon2]);& && && && && &&&
& && && && && & WriteAddress(0x80+0x0c);
& && && && && & WriteData(table1[mon1]);
& && && && && & WriteAddress(0x80+0x0d);& && &&&//显示‘/’
& && && && && & WriteData('/');
& && &&&
& && && && && & WriteAddress(0x80+0x0e);//显示日
& && && && && & WriteData(table1[day2]);& && && && && &&&
& && && && && & WriteAddress(0x80+0x0f);
& && && && && & WriteData(table1[day1]);
& && && && && & /*第一行在此显示完毕*/& && && && && &&&
& && && && &display_dot();& && & //显示温度的小数点
& && && && &display_cent();& && &//显示温度的单位
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x08); //显示小时
& && && && && & WriteData(table1[hour2]);& && && && && &&&
& && && && && & WriteAddress(0x80+0x40+0x09);
& && && && && & WriteData(table1[hour1]);& && && && && &
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x0a);&&//显示':'
& && && && && & WriteData(':');& && && && && && && && && && && &
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x0b);&&//显示分钟
& && && && && & WriteData(table1[min2]);& && && && && && && && &&&
& && && && && & WriteAddress(0x80+0x40+0x0c);
& && && && && & WriteData(table1[min1]);& && && && && &&&
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x0d); //显示':'
& && && && && & WriteData(':');& && && && && && && && && && &&&
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x0e); //显示秒
& && && && && & WriteData(table1[sec2]);& && && && && && && && &
& && && && && & WriteAddress(0x80+0x40+0x0f);
& && && && && & WriteData(table1[sec1]);
& && && && && & /*第二行在此显示完毕*/
& && && && && & ReadyReadTemp();& &&&//读温度准备
& && && && &TL=ReadOneChar();& & //先读的是温度值低位
& && && && && & TH=ReadOneChar();& & //接着读的是温度值高位
& && && && && & TN=TH*16+TL/16;& && &//实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
& && && && && && && && && && && && && && &//这样得出的是温度的整数部分,小数部分被丢弃了
& && && && &TD=(TL%16)*10/16;& & //计算温度的小数部分,将余数乘以10再除以16取整,
& && && && && && && && && && && && && && &//这样得到的是温度小数部分的第一位数字(保留1位小数)
& && && && &display_temp1(TN);& & //显示温度的整数部分
& && && && &display_temp2(TD);& & //显示温度的小数部分
& && && && && & //以下部分是闹钟键盘检测程序
& && && && && & if((x==hour2*10+hour1)&&(y==min2*10+min1))//若时间到了,则开启闹钟
& && && && && & {
& && && && && && && && &beep=0;& && &&&
& && && && && & }
& && && && && & else& && && && && &&&//否则,关闭闹钟
& && && && && & {
& && && && && && && && &beep=1;
& && && && && & }& && &&&
& && && && &delaynms(10);
& && && && && & tixing(t_mon,t_day);& && && && && && && && && && &&&
& && &&&}& && && && && && && && && && && && && && &
}
void exter1()interrupt 2
{& && &&&
& && &&&
& && &&&write_com(0x01);
& && &&&for(k=0;k&2000;k++)
& && &&&{
& && && && && & while(key1==0)& && && && && && & //键盘扫描.当key1按下时,
& && && && && & {& && && && && && && && && && && && && && & //闹钟的小时部分加一
& && && && && && && && &delaynms(10);
& && && && && && && && &if(key1==0)& && && && && && & //消抖
& && && && && && && && &{
& && && && && && && && && && &&&delaynms(10);
& && && && && && && && && && &&&while(key1==0);& && &&&//松手检测
& && && && && && && && && && &&&x++;
& && && && && && && && && && &&&if(x==24)& && && &&&//小时部分加到24后自动清零
& && && && && && && && && && &&&x=0;
& && && && && && && && &}& && &&&
& && && && && & }
& && && && && & while(key2==0)& && && && && & //键盘检测。当key2按下时,
& && && && && & {
& && && && && && && && &delaynms(10);& && &&&//闹钟的分钟部分加一
& && && && && && && && &if(key2==0)& && && && && & //消抖
& && && && && && && && &{
& && && && && && && && && && &&&delaynms(10);
& && && && && && && && && && &&&while(key2==0);//松手检测
& && && && && && && && && && &&&y++;
& && && && && && && && && && &&&if(y==60)& && && & //若分钟部分加到60,则自动清零
& && && && && && && && && && &&&y=0;
& && && && && && && && &}& && &&&
& && && && && & }& && && && && && && && &
& && && && && & show_naozhong(x,y);& && && & //调用闹钟显示程序
& && &&&}
& && &&&write_com(0x01);
}
void tixing(unsigned char mm,unsigned dd)
{
& && &&&
& && &&&if(mm==0x01&&dd==0x01)
& && &&&{
& && && && && & while(1)
& && && && && & {
& && && && && && && && &WriteAddress(0x80);
& && && && && && && && &for(i=0;i&16;i++)
& && && && && && && && &{
& && && && && && && && && && &&&WriteData(table6[i]);& && &&&
& && && && && && && && &}
& && && && && && && && &show();
& && && && && && && && &if(mm!=0x01||dd!=0x01)
& && && && && && && && && && && && && && && && &
& && && && && & }& && && && && && && && && && &&&
& && &&&}
& && &&&if(mm==0x02&&dd==0x14)
& && &&&{
& && && && && & while(1)
& && && && && & {
& && && && && && && && &WriteAddress(0x80);
& && && && && && && && &for(i=0;i&16;i++)
& && && && && && && && &{
& && && && && && && && && && &&&WriteData(table7[i]);& && &&&
& && && && && && && && &}
& && && && && && && && &show();
& && && && && && && && &if(mm!=0x02||dd!=0x14)
& && && && && && && && && && && && && && && && &
& && && && && & }& && && && && &
& && &&&}
/*& && && &if(mm==0x04&&dd==0x05)
& && &&&{
& && && && && & while(1)
& && && && && & {
& && && && && && && && &WriteAddress(0x80);
& && && && && && && && &for(i=0;i&16;i++)
& && && && && && && && &{
& && && && && && && && && && &&&WriteData(table8[i]);& && &&&
& && && && && && && && &}
& && && && && && && && &show();
& && && && && && && && &if(mm!=0x04||dd!=0x05)
& && && && && && && && && && && && && && && && &
& && && && && & }& && && && && &
& && &&&}
& && &&&if(mm==0x05&&dd==0x01)
& && &&&{
& && && && && & while(1)
& && && && && & {
& && && && && && && && &WriteAddress(0x80);
& && && && && && && && &for(i=0;i&16;i++)
& && && && && && && && &{
& && && && && && && && && && &&&WriteData(table9[i]);& && &&&
& && && && && && && && &}
& && && && && && && && &show();
& && && && && && && && &if(mm!=0x05||dd!=0x01)
& && && && && && && && && && && && && && && && &
& && && && && & }& && && && && &
& && &&&}
& && &&&if(mm==0x06&&dd==0x15)
& && &&&{
& && && && && & while(1)
& && && && && & {
& && && && && && && && &WriteAddress(0x80);
& && && && && && && && &for(i=0;i&16;i++)
& && && && && && && && &{
& && && && && && && && && && &&&WriteData(table10[i]);& && &&&
& && && && && && && && &}
& && && && && && && && &show();
& && && && && && && && &if(mm!=0x06||dd!=0x15)
& && && && && && && && && && && && && && && && &
& && && && && & }& && && && && &
& && &&&}
& && &&&if(mm==0x08&&dd==0x01)
& && &&&{
& && && && && & while(1)
& && && && && & {
& && && && && && && && &WriteAddress(0x80);
& && && && && && && && &for(i=0;i&16;i++)
& && && && && && && && &{
& && && && && && && && && && &&&WriteData(table11[i]);& && &&&
& && && && && && && && &}
& && && && && && && && &show();
& && && && && && && && &if(mm!=0x08||dd!=0x01)
& && && && && && && && && && && && && && && && &
& && && && && & }& && && && && &
& && &&&}
& && &&&if(mm==0x09&&dd==0x10)
& && &&&{
& && && && && & while(1)
& && && && && & {
& && && && && && && && &WriteAddress(0x80);
& && && && && && && && &for(i=0;i&16;i++)
& && && && && && && && &{
& && && && && && && && && && &&&WriteData(table12[i]);& && &&&
& && && && && && && && &}
& && && && && && && && &show();
& && && && && && && && &if(mm!=0x09||dd!=0x10)
& && && && && && && && && && && && && && && && &
& && && && && & }& && && && && &
& && &&&}
& && &&&if(mm==0x10&&dd==0x01)
& && &&&{
& && && && && & while(1)
& && && && && & {
& && && && && && && && &WriteAddress(0x80);
& && && && && && && && &for(i=0;i&16;i++)
& && && && && && && && &{
& && && && && && && && && && &&&WriteData(table13[i]);& && &&&
& && && && && && && && &}
& && && && && && && && &show();
& && && && && && && && &if(mm!=0x10||dd!=0x01)
& && && && && && && && && && && && && && && && &
& && && && && & }& && && && && &
& && &&&}& && && &&&*/
}
void show()
{
//& && &&&
& && &&&uchar TL;& &&&//储存暂存器的温度低位
& && &&&uchar TH;& & //储存暂存器的温度高位
& && &&&uchar TN;& && &//储存温度的整数部分
& && &&&uchar TD;& && & //储存温度的小数部分
& && && && && &
& && && && && &
& && && && && &
& && && && && & t_day=read_);//读日;
& && && && && & day1=t_day&0x0f;
& && && && && & day2=(t_day&&4);
& && &&&
& && && && && & t_mon=read_);//读月 ;
& && && && && & mon1=t_mon&0x0f;
& && && && && & mon2=(t_mon&&4);
& && &&&
& && && && && & week=read_b);//读星期 ;
& && && && && & week1=week&0x0f;
& && &&&
& && && && && & t_year=read_d);//读年 ;
& && && && && & year1=t_year&0x0f;
& && && && && & year2=(t_year&&4);
& && && && && & t_sec=read_);//读秒 ;
& && && && && & sec1=t_sec&0x0f;
& && && && && & sec2=(t_sec&&4);
& && &&&
& && && && && & t_min=read_);//读分 ;
& && && && && & min1=t_min&0x0f;
& && && && && & min2=(t_min&&4);
& && &&&
& && && && && & t_hour=read_);//读小时 ;
& && && && && & hour1=t_hour&0x0f;
& && && && && & hour2=(t_hour&&4);
//& && && && && & WriteAddress(0x80+0x40+0x08); //显示小时
//& && && && && & WriteData(table1[hour2]);& && && && && &&&
//& && && && && & WriteAddress(0x80+0x40+0x09);
//& && && && && & WriteData(table1[hour1]);
& && &&&
& && && && && & t_day=read_);//读日;
& && && && && & day1=t_day&0x0f;
& && && && && & day2=(t_day&&4);
& && &&&
& && && && && & t_mon=read_);//读月 ;
& && && && && & mon1=t_mon&0x0f;
& && && && && & mon2=(t_mon&&4);
& && &&&
& && && && && & week=read_b);//读星期 ;
& && && && && & week1=week&0x0f;
& && &&&
& && && && && & t_year=read_d);//读年 ;
& && && && && & year1=t_year&0x0f;
& && && && && & year2=(t_year&&4);
& && && && && &
& && && && && && && && &
& && && && &display_dot();& && & //显示温度的小数点
& && && && &display_cent();& && &//显示温度的单位
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x08); //显示小时
& && && && && & WriteData(table1[hour2]);& && && && && &&&
& && && && && & WriteAddress(0x80+0x40+0x09);
& && && && && & WriteData(table1[hour1]);& && && && && &
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x0a);&&//显示':'
& && && && && & WriteData(':');& && && && && && && && && && && &
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x0b);&&//显示分钟
& && && && && & WriteData(table1[min2]);& && && && && && && && &&&
& && && && && & WriteAddress(0x80+0x40+0x0c);
& && && && && & WriteData(table1[min1]);& && && && && &&&
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x0d); //显示':'
& && && && && & WriteData(':');& && && && && && && && && && &&&
& && &&&
& && && && && & WriteAddress(0x80+0x40+0x0e); //显示秒
& && && && && & WriteData(table1[sec2]);& && && && && && && && &
& && && && && & WriteAddress(0x80+0x40+0x0f);
& && && && && & WriteData(table1[sec1]);
& && && && && & /*第二行在此显示完毕*/
& && && && && & ReadyReadTemp();& &&&//读温度准备
& && && && &TL=ReadOneChar();& & //先读的是温度值低位
& && && && && & TH=ReadOneChar();& & //接着读的是温度值高位
& && && && && & TN=TH*16+TL/16;& && &//实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
& && && && && && && && && && && && && && &//这样得出的是温度的整数部分,小数部分被丢弃了
& && && && &TD=(TL%16)*10/16;& & //计算温度的小数部分,将余数乘以10再除以16取整,
& && && && && && && && && && && && && && &//这样得到的是温度小数部分的第一位数字(保留1位小数)
& && && && &display_temp1(TN);& & //显示温度的整数部分
& && && && &display_temp2(TD);& & //显示温度的小数部分
& && && && && & //以下部分是闹钟键盘检测程序
& && && && && & if((x==hour2*10+hour1)&&(y==min2*10+min1))//若时间到了,则开启闹钟
& && && && && & {
& && && && && && && && &beep=0;& && &&&
& && && && && & }
& && && && && & else& && && && && &&&//否则,关闭闹钟
& && && && && & {
& && && && && && && && &beep=1;
& && && && && & }& && &&&
& && && && &delaynms(10);& && && && && && && && && && &&&
}复制代码
 液晶显示器有显示时间、但是时间不正确、求学霸帮忙看看程序、哪有问题
 你这个程序目前有什么问题呢
你这个程序目前有什么问题呢
就是仿真图的显示器显示的时间不对,不是现在的时间。
Powered by

我要回帖

更多关于 综穿 学霸 求放过 的文章

 

随机推荐