搜档网
当前位置:搜档网 › 12864液晶屏显示温度日期时间程序

12864液晶屏显示温度日期时间程序


#include
#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define comm 0 //comm要先定义为0
#define dat 1
#define x1 0x80
#define x2 0x88
#define y 0x80
//--------------------------------------------------------------
unsigned char code DSP01[]={"you are the"};
unsigned char code DSP02[]={" sunshine "};
unsigned char code DSP03[]={" in my life "};
unsigned char code DSP04[]={" smallshuo"};

unsigned char code DSP06[]={"八百标兵奔北坡 "};
unsigned char code DSP07[]={"炮兵并排北边跑 "};
unsigned char code DSP08[]={"炮兵怕把标兵碰 "};
unsigned char code DSP09[]={"标兵怕碰炮兵炮 "};

unsigned char code DSP1[]={" 时钟 "};
unsigned char code DSP2[]={"日期: . . "};
unsigned char code DSP3[]={"时间: : : "};
unsigned char code DSP05[]={"温度: 摄氏度"};//位置不对就显示奇怪的字 所以必须在合适的位置
unsigned char DSPH[]={"00"};
unsigned char DSPM[]={"00"};
unsigned char DSPS[]={"00"};
unsigned char DSPN[]={"00"};
unsigned char DSPY[]={"00"};
unsigned char DSPR[]={"00"};
unsigned char DSPWD[]={"00"};
//------------------------------------------------------------------
// LCD定义
//------------------------------------------------------------------
sbit cs=P2^2;
sbit std=P2^1;
sbit sclk=P2^0;
sbit rst=P2^4;
sbit key1=P3^7;
sbit key2=P3^3;
sbit key3=P3^6;
sbit beep=P0^5;
//------------------------------------------------------------------
// ds1302定义
//-----------------------------------------------------------------
sbit ds1302_clk=P2^7;
sbit ds1302_io =P2^6;
sbit ds1302_rst=P2^5;
uchar time[21]={0X00,0x54,0x10,0X08,0x12,0X01,0X08};
//------------------------------------------------------------------
// DS18B20
//------------------------------------------------------------------
sbit DQ=P0^7;//ds18b20 端口
uchar temp;
uchar str[2]={0};
//------------------------------------------------------------------
void wr_lcd (uchar dat_comm,uchar content);
unsigned char AJ=0;
//------------------------------------------------------------------
char BJ1=0,JS1=0;
unsigned char SOU232[21]={0};
//------------------------------------------------------------------
//------------------------------------------------------------------
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
//-----------------------------------------------------------------
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
//-----------------------------------------------------------------
//
//-----------------------------------------------------------------
void delay(unsigned in

t i)//延时函数
{
while(i--);
}
//-----------------------------------------------------------------
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
}
//----------------------------------------
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat1 = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat1>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat1|=0x80;
delay(5);
}
return(dat1);
}
//----------------------------------------
//写一个字节
void WriteOneChar(unsigned char dat2)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat2&0x01;
delay(5);
DQ = 1;
dat2>>=1;
}
delay(5);
}
//----------------------------------------
//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;


//float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();

b<<=4;
b+=(a&0xf0)>>4;
t=b;
//tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
//-----------------------------------------------------------------

//set time--second,munite,hour,day,month,week,year
//-----------------------------------------------------------------
//*****************************************************************
//往DS31302中写入一字节
//*****************************************************************
void writebyte_ds1302(uchar ds1302_data)
{
uchar i;
uchar temp_data=ds1302_data;
for(i=8;i>0;i--)
{
ds1302_io=temp_data&0x01;
temp_data>>=1; //一个字节一个字节的发 发完了还要向右移一位 for循环一共8次
ds1302_clk=1;
ds1302_clk=0;
}
}
//*****************************************************************
//往DS1302的地址ds1302_add处写入ds1302_cmd数据或命令
//*****************************************************************
void writetime_ds1302(uchar ds1302_add,uchar ds1302_cmd)
{
ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
writebyte_ds1302(ds1302_add);
writebyte_ds1302(ds1302_cmd);
ds1302_clk=1;
ds1302_rst=0;
}
//*****************************************************************
//从DS1302中读出一字节并返回
//*****************************************************************
uchar readbyte_ds1302()
{
uchar i

;
uchar temp_data;
for(i=0; i<8;i++)
{
/* if(ds1302_io) //这个延时有没有也是一样的
temp_data=(temp_data>>1)|0x80;
else
temp_data>>=1;
*/
//***********以上被注释部分的代码也可以用,实际测试过****************
if(ds1302_io)
temp_data|=(1<else
temp_data&=(~(1<ds1302_clk=1;
ds1302_clk=0;
}
return temp_data;
}
//-------------------------------------------------------------
//从DS1302的地址DS1302_ADD处读出时间值
//-------------------------------------------------------------
uchar readtime_ds1302(uchar ds1302_add)
{
uchar temp_data;
//ds1302_rst=0;
//ds1302_clk=0;
ds1302_rst=1;
writebyte_ds1302(ds1302_add);
temp_data=readbyte_ds1302();
//ds1302_clk=1;
ds1302_rst=0;
return temp_data;
}
//-------------------------------------------------------------
//设置预置时间到DS1302当中
//-------------------------------------------------------------
void settime_ds1302()
{
uchar i;
writetime_ds1302(0x8e,0x00); //write enable
for(i=0;i<7;i++) //set time--second,munite,hour,day,month,week,year
{
writetime_ds1302(0x80+i*2,time[i]);
}
writetime_ds1302(0x8e,0x80); //write protect
}
//-------------------------------------------------------------
//从DS1302中一次读出所有的数据并存在数组time[7]当中
//-------------------------------------------------------------
void gettime_ds1302()
{
uchar i;
for(i=0;i<7;i++) //get time--second,munite,hour,day,month,week,year
{
time[i]=readtime_ds1302(0x81+i*2);
}
}
//----------------------------------------------------
void DelayUs(unsigned char us) //DelayUs us
{
while(us--)
{
_nop_();
}
}
//----------------------------------------------------
void DelayMs(unsigned int ms) //DelayMs Ms
{
while(ms--)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
//=================================================================
void init_lcd (void)
{
rst=0;
DelayUs(100);
rst=1;
DelayUs(10);
wr_lcd (comm,0x30); //写指令
wr_lcd (comm,0x01); //清屏

DelayUs (100);
wr_lcd (comm,0x06);
wr_lcd (comm,0x0c); //0x0c正常,
}
//=================================================
void set_position(unsigned int xx,unsigned int yy)
{
unsigned int line;
wr_lcd (comm,0x30);
switch(xx)
{
case 0:line=0x00;break;
case 1:line=0x10;break;
case 2:line=0x08;break;
case 3:line=0x18;break;
default:break;
}
wr_lcd(comm,0x80+line+yy);
}
//================================================
void send_str(uchar n,uchar *cc)
{
unsigned int i;
wr_lcd (comm,0x30);
for(i=0;(iwr_lcd(da

t,*(cc+i));
}
//================================================
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
DelayUs (5);
a=content;
cs=1;
sclk=0;
std=1;
DelayUs(3);
for(i=0;i<5;i++)
{
sclk=1;
DelayUs(3);
sclk=0;
}
std=0;
DelayUs(3);
sclk=1;
DelayUs(3);
sclk=0;
if(dat_comm)
std=1;
else
std=0;
DelayUs(3);
sclk=1;
DelayUs(3);
sclk=0;
std=0;
DelayUs(3);
sclk=1;
DelayUs(3);
sclk=0;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
a=a<<1;
std=CY;
DelayUs(3);
sclk=1;
DelayUs(3);
sclk=0;
}
std=0;
DelayUs(3);
for(i=0;i<4;i++)
{
sclk=1;
DelayUs(3);
sclk=0;
}
}
}
//-------------------------------------------
//-------------------------------------------
void KEY(void)
{
if(key1==0)
{
DelayMs(20);
key2=1;
AJ++;
if(AJ%2==0)
{
wr_lcd (comm,0x01);
set_position(0,0);
send_str(16,DSP01);
DelayMs(100);
set_position(1,0);
send_str(16,DSP02);
DelayMs(100);
set_position(2,0);
send_str(16,DSP03);
DelayMs(100);
set_position(3,0);
send_str(16,DSP04);
DelayMs(100);
}

if(AJ%2!=0)
{
wr_lcd (comm,0x01);


set_position(0,0);
send_str(16,DSP06);
DelayMs(200);
set_position(1,0);
send_str(16,DSP07);
DelayMs(200);
set_position(2,0);
send_str(16,DSP08);
DelayMs(200);
set_position(3,0);
send_str(16,DSP09);
DelayMs(200);
}
while(key1==0)
{
;
}
wr_lcd (comm,0x01);

set_position(0,0);
send_str(16,DSP1);
set_position(1,0);
send_str(16,DSP2);
set_position(2,0);
send_str(16,DSP3);
set_position(3,0);
send_str(16,DSP05);
}
}
//--------------------------------------------
// 计算出温度
//-------------------------------------------
void Show_Temperature(void)
{
temp=ReadTemperature();

str[0]=temp/10;
//DSPWD[0]=str[0];
//SendOneByte(str[0]);
//DelayMs(50);
str[1]=temp%10;
//DSPWD[1]=str[1];
//SendOneByte(str[1]);
}
//--------------------------------------------
// 显示时间函数
//--------------------------------------------
void display_time()
{
Show_Temperature();
//--------------------------------------------
// 温度
//--------------------------------------------
DSPWD[0]=str[0]+0x30;
DSPWD[1]=str[1]+0x30;
set_position(3,3);
send_str(16,DSPWD);
//--------------------------------------------
// 天月


//--------------------------------------------
DSPR[1]=(time[3]&0x0f)+0X30;
DSPR[0]=((time[3]&0xf0)>>4)+0X30;
set_position(1,7);
send_str(16,DSPR);

DSPY[1]=(time[4]&0x0f)+0X30;
DSPY[0]=((time[4]&0xf0)>>4)+0X30;
set_position(1,5);
send_str(16,DSPY);

DSPN[1]=(time[6]&0x0f)+0X30;
DSPN[0]=((time[6]&0xf0)>>4)+0X30;
set_position(1,3);
send_str(16,DSPN);
//-------------------------------------------
// 秒分时
//-------------------------------------------

DSPS[1]=(time[0]&0x0f)+0X30;
DSPS[0]=((time[0]&0xf0)>>4)+0X30;
set_position(2,7);
send_str(2,DSPS) ;

DSPM[1]=(time[1]&0x0f)+0X30;
DSPM[0]=((time[1]&0xf0)>>4)+0X30;
set_position(2,5);
send_str(2,DSPM) ;

DSPH[1]=(time[2]&0x0f)+0X30;
DSPH[0]=((time[2]&0xf0)>>4)+0X30;
set_position(2,3);
send_str(2,DSPH) ;
}
//-------------------------------------------

//-------------------------------------------
void main(void)
{
DelayMs(100);
init_lcd ();
InitUART();
//wr_lcd (comm,0x0f); //打开光标
//wr_lcd (comm,0x0c); //关闭光标
wr_lcd (comm,0x01);//清屏
//-------------------------------------------
//SendOneByte(0xcc); //串口测试
set_position(0,0); //行,列 从0开始
send_str(16,DSP1); //个数 内容
set_position(1,0);
send_str(16,DSP2);
set_position(2,0);
send_str(16,DSP3);

set_position(3,0);
send_str(16,DSP05);
//settime_ds1302();//预设时间
BJ1=0;
while(1)
{

gettime_ds1302();

if(BJ1==1)
{
DelayMs(20);
BJ1=0;
JS1=0;
time[0]=SOU232[0];
time[1]=SOU232[1];
time[2]=SOU232[2];
time[3]=SOU232[3];
time[4]=SOU232[4];
time[6]=SOU232[5];
settime_ds1302();
DelayMs(50);
}
//-----------------------------------------
// 显示时间
//-----------------------------------------
display_time();
//-----------------------------------------
// 按键翻屏
//-----------------------------------------
KEY();
//-----------------------------------------
}
}
//-----------------------------------------
//-----------------------------------------
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
BJ1=1;
if(1==BJ1)
{
SOU232[JS1]=SBUF;
JS1++;
}
}
else
TI = 0;
}
//----------------------------------------

相关主题