#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uint tmp;//tmp电压值
//STC12C5A60S2 特殊功能寄存器 关于AD部分的寄存器定义
sfr ADC_CONTR = 0xBC; //ADC控制寄存器 通道配置
sfr ADC_RES = 0xBD; //ADC高8位数据寄存器(存AD转换的结果,共10位)
sfr ADC_LOW2 = 0xBE; //ADC低2位数据寄存器(存AD转换的结果,共10位)
sfr P1ASF = 0x9D; //P1第二功能选择寄存器
unsigned char ch=0 ; //ADC通道选择,本例程选择P1.0为AD转换,其他P1口做普通IO用 01234567
unsigned int ad_out;//ADC_CONTR寄存器的位变量定义
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks
/***************************功能定义***************************/
#define LCD12864_W_COM 0xF8 //写指令
#define LCD12864_R_COM 0xFC //读指令
#define LCD12864_W_DAT 0xFA //写数据
#define LCD12864_R_DAT 0xFE //读数据
#ifndef __LCD12864_H__
#define __LCD12864_H__
#define LCD12864_COM 0 //输入指令
#define LCD12864_DAT 1 //输入数据
#define LCD12864_CLEAR 0x01 //清除显示
#define LCD12864_CURSOR 0x02 //位址归位,游标回原点
#define LCD12864_CURSOR_RLF 0x04 //光标左移,整体显示不移动
#define LCD12864_CURSOR_RRF 0x06 //光标右移,整体显示不移动
#define LCD12864_CURSOR_RLN 0x05 //光标左移,整体显示移动
#define LCD12864_CURSOR_RRN 0x07 //光标右移,整体显示移动
#define LCD12864_DIS_OFF 0x08 //显示状态全关
#define LCD12864_DIS_ON 0x0E //显示状态开
#define LCD12864_DIS_CUR_ON 0x0E //游标显示开
#define LCD12864_DIS_CURS_ON 0x0F //游标位置显示开
#define LCD12864_CURSOR_RL 0x10 //游标左移
#define LCD12864_CURSOR_RR 0x14 //游标右移
#define LCD12864_CURDIS_RL 0x18 //整体显示左移,光标跟随
#define LCD12864_CURDIS_RR 0x1C //整体显示又移,光标跟随
#define LCD12864_COM_BASIC 0x30 //基本指令集动作
#define LCD12864_COM_PLOT_ON 0x36 //扩展指令集动作,绘图显示ON
#define LCD12864_COM_PLOT_OFF 0x34 //扩展指令集动作,绘图显示OFF
#define LCD12864_STAND_TO 0x31 //进入待命模式
#define LCD12864_PLACE_ROLL 0x03 //允许输入卷动位址
#define LCD12864_PLACE_IRAM 0x02 //允许输入IRAM位址
#define LCD12864_REVERES_13 0x04 //选择一、三行同时作反白显示
#define LCD12864_REVERES_24 0x05 //选择二、四行同时作反白显示
#define LCD12864_REST_ON 0x08 //进入睡眠模式
#define LCD12864_REST_OFF 0x0C //脱离睡眠模式
#define LCD12864_W_COM 0xF8 //写指令
#define LCD12864_R_COM 0xFC //读指令
#define LCD12864_W_DAT 0xFA //写数据
#define LCD12864_R_DAT 0xFE //读数据
//======串口模式=======
sbit LCD12864_CS = P2^7; //片选信号输入
sbit LCD12864_STD = P2^6; //串行数据输入
sbit LCD12864_SCLK = P2^5; //串行移位脉冲输入
sbit LCD12864_PSB = P2^4; //串并模式选择 0:串口,1:并口
sbit LCDRST = P2^3;
unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9数字
//定义温度1数据变量
float wdd = 0;//单精度浮点型变量眼3.4*10^38----(-3.4*10^38) 占4个字节小数点后7-8位
//double wdd = 0;//双精度浮点型变量 小数点后15-16位
ulong x = 0;
uint wd;//定义一个温度用于显示
sbit SO=P1^1; //P1.0口与SO相连
sbit CS=P1^2; //P1.1口与CS相连
sbit SCK=P1^3; //P1.2口与SCK相连
//定义温度2数据变量
float wdd2 = 0;//单精度浮点型变量眼3.4*10^38----(-3.4*10^38) 占4个字节小数点后7-8位
//double wdd = 0;//双精度浮点型变量 小数点后15-16位
ulong x2 = 0;
uint wd2;//定义一个温度用于显示
sbit SO2=P1^4; //P3.2口与SO相连
sbit CS2=P1^5; //P3.3口与CS相连
sbit SCK2=P1^6; //P3.4口与SCK相连
sbit sclk = P2^0;//1302
sbit io= P2^1;//1302
sbit rst= P2^2;//1302
uchar S1num,flag,second,minute,hour,week,day,month,year,fsec;//秒、分、时、星期、日、月、年
bit keyflag=0;//按键标志位
sbit F1=P3^2; //降温风扇1
sbit F2=P3^3; //降温风扇2
/*******************************延时函数**********************************************/
void Delay1Ms(uint t)
{
uchar i;
for (;t>0;t--)
{
for (i=0;i<138;i++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
}
void Delay1s(uchar t)
{
for (;t>0;t--)
{
Delay1Ms(250);
Delay1Ms(250);
Delay1Ms(250);
Delay1Ms(250);
}
}
void delayus()//us微秒延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(unsigned int n)
{
unsigned int x;
while (n--)
{
x = 5000;
while (x--);
}
}
void InitADC() //10位AD数据缓存
{
P1ASF = 0x01;//设置P1.0为AD脚,P1ASF = 0x01 其他P1口为普通IO功能
ADC_RES = 0; //清空AD输出高8位
//if(++ch>7)ch=0; //循环显示8个通道AD采样
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
delay(8); //ADC power-on delay and Start A/D conversion
}
/********************写一个字节**************/
void write_1302byte(uchar com)
{
uchar i;
sclk=0;
delayus();
for(i=8;i>0;i--)
{
io=com&0x01;//只要是从低位取数,向高位一定要和0X01与
delayus();
sclk=1;//为写数据制造上升沿。
delayus();
sclk=0;//为下一次上升沿写下一个字节做准备
com>>=1;//将数据向右移一位,准备写入下一个数据
}
}
/********************读一个字节***************/
uchar read_1302byte()
{
uchar i,dat;
delayus();
for(i=8;i>0;i--)
{
dat>>=1;
if(io==1)
{
dat|=0x80;//将1取出,写在dat的最高位。
}
sclk=1;//把sclk拉高,为读一个字节的下降沿做准备
delayus();//稍等制造一个高电平
sclk=0;//为读一个字节制造下降沿
delayus();
}
return dat;
}
/*************写入一个时间位*****************/
void write_1302(uchar add,uchar dat)
{
rst=0;
delayus();
sclk=0;
delayus();
rst=1;
write_1302byte(add);
delayus();
write_1302byte(dat);
delayus();
rst=0;
}
/****************读1302的地址******************/
uchar read_1302add(uchar add)
{
uchar timedat;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
write_1302byte(add);//写入要读的地址
timedat=read_1302byte();//将上面地址中的数据赋给timedat
sclk=1;
_nop_();
rst=0;
io=0;//字节读操作完后,将ds1302的IO端口置零就可以消除85、45和??闪现等问题
return timedat;
}
/****************初始化1302*********************/
void init_1302()
{
flag=read_1302add(0x81);//读秒寄存器的最高位,读出时钟状态
if(flag&0x80)//判断时钟是否关闭,若内部关闭,则初始,若没关闭,不初始化,还在走
{
write_1302(0x8e,0x00);//去除写保护
write_1302(0x80,((10/10)<<4|(10%10)));//写秒寄存器,并写入初值55
write_1302(0x82,((22/10)<<4|(22%10)));//写分寄存器,并写入初值59
write_1302(0x84,((11/10)<<4|(11%10)));//写小时寄存器,并写入初值23
write_1302(0x86,((16/10)<<4|(16%10)));//写日寄存器,并写入初值18
write_1302(0x88,((6/10)<<4|(6%10)));//写月寄存器,并写入初值2
write_1302(0x8a,((6/10)<<4|(6%10)));//写周寄存器,并写入初值5
write_1302(0x8c,((18/10)<<4|(18%10)));//写年寄存器,并写入初值12,不能写2012年
write_1302(0x90,0xa5);//写充电方式
write_1302(0x8e,0x80);//加上写保护
}
}
/*****************读出秒的十进制数***************************/
uchar readsecond()
{
uchar dat;
dat=read_1302add(0x81);
second=((dat&0x70)>>4)*10+(dat&0x0f);
return second;
}
/*****************读出分的十进制数***************************/
uchar readminute()
{
uchar dat;
dat=read_1302add(0x83);
minute=((dat&0x70)>>4)*10+(dat&0x0f);
return minute;
}
/*****************读出小时的十进制数***************************/
uchar readhour()
{
uchar dat;
dat=read_1302add(0x85);
hour=((dat&0x70)>>4)*10+(dat&0x0f);
return hour;
}
/*****************读出天的十进制数***************************/
uchar readday()
{
uchar dat;
dat=read_1302add(0x87);
day=((dat&0x70)>>4)*10+(dat&0x0f);
return day;
}
/*****************读出月的十进制数***************************/
uchar readmonth()
{
uchar dat;
dat=read_1302add(0x89);
month=((dat&0x70)>>4)*10+(dat&0x0f);
return month;
}
/*****************读出周的十进制数***************************/
uchar readweek()
{
uchar dat;
dat=read_1302add(0x8b);
week=((dat&0x70)>>4)*10+(dat&0x0f);
return week;
}
/*****************读出年的十进制数***************************/
uchar readyear()
{
uchar dat;
dat=read_1302add(0x8d);
year=((dat&0xf0)>>4)*10+(dat&0x0f);
return year;
}
/************************读出所有时间**********************/
readtime()
{
readsecond();
readminute();
readhour();
readday();
readmonth();
readweek();
readyear();
}
//********************************热电偶1************************************************//
unsigned long Re_Convert() //热电偶数据--读取温度
{ uchar i;
unsigned long Temp_2;
Temp_2=0;
_nop_();_nop_(); _nop_();_nop_();
CS=1;
_nop_();_nop_(); _nop_();_nop_();
SCK=0;
//Delay1s(1); //不低于(52机)100MS不然数据无法刷新 STC12不低于(52机)1 S
Delay1Ms(1200); //不低于(52机)100MS不然数据无法刷新 STC12不低于(52机)1 & (1200MS)
SCK=0;
SCK=0;
CS=0;
for(i=0;i<16;i++)//16位数据读取
{
Temp_2<<=1;//向右移一位
_nop_();_nop_();_nop_(); _nop_();_nop_();
SCK=1;//上升
if(SO==1)
{Temp_2=Temp_2|0x01;}
else
Temp_2=Temp_2|0x00;
_nop_(); _nop_();_nop_(); _nop_();_nop_();
SCK=0;
_nop_();_nop_();_nop_(); _nop_();_nop_();
}
Temp_2=Temp_2<<1; //向左移一位,取0-14位
Temp_2=Temp_2>>3; //向右移4位,取3-14位
//Temp_2=1024.123456;//测试正常运行不要
return(Temp_2); //返回温度
}
//********************************热电偶2*************************************************//
unsigned long Re_Convert2() //热电偶数据--读取温度
{ uchar i;
unsigned long Temp_2;
Temp_2=0;
_nop_();_nop_(); _nop_();_nop_();
CS2=1;
_nop_();_nop_(); _nop_();_nop_();
SCK2=0;
//Delay1s(1); //不低于(52机)100MS不然数据无法刷新 STC12不低于(52机)1 S
Delay1Ms(1200); //不低于(52机)100MS不然数据无法刷新 STC12不低于(52机)1 & (1200MS)
SCK2=0;
SCK2=0;
CS2=0;
for(i=0;i<16;i++)//16位数据读取
{
Temp_2<<=1;//向右移一位
_nop_();_nop_();_nop_(); _nop_();_nop_();
SCK2=1;//上升
if(SO2==1)
{Temp_2=Temp_2|0x01;}
else
Temp_2=Temp_2|0x00;
_nop_(); _nop_();_nop_(); _nop_();_nop_();
SCK2=0;
_nop_();_nop_();_nop_(); _nop_();_nop_();
}
Temp_2=Temp_2<<1; //向左移一位,取0-14位
Temp_2=Temp_2>>3; //向右移4位,取3-14位
//Temp_2=1024.123456;//测试正常运行不要
return(Temp_2); //返回温度
}
/*****************************向12864写入8位数据*************************************/
void LCD12864_Wbyte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
LCD12864_SCLK = 0;
byte <<= 1; //左移待写入数据,使最高位移至CY
LCD12864_STD = CY; //写入一位数据
LCD12864_SCLK = 1;
LCD12864_SCLK = 0;
}
}
/***************************从12864读出8位数据***返回:sdat************************************/
uchar LCD12864_Rbyte(void)
{
uchar i,sdat,temp1,temp2;
temp1 = 0;
temp2 = 0;
//==========12864的串行数据输出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度两个八位整合==============
for(i=0;i<8;i++)
{
temp1=temp1 << 1;
LCD12864_SCLK = 0;
LCD12864_SCLK = 1;
LCD12864_SCLK = 0;
if( LCD12864_STD ) temp1|=0x01; //tempe1:D7-D6-D5-D4-0-0-0-0
}
for(i=0;i<8;i++)
{
temp2=temp2 << 1;
LCD12864_SCLK = 0;
LCD12864_SCLK = 1;
LCD12864_SCLK = 0;
if( LCD12864_STD ) temp2|=0x01; //tempe2:D3-D2-D1-D0-0-0-0-0
}
sdat = ((temp1 & 0xf0)|(temp2 >> 4)); //取出D7\D6\D5\D4\D3\D2\D1\D0
return sdat; //返回一个值(sdat)
}
/****************************读忙状态**************************************/
void LCD12864_busy( void )
{
do LCD12864_Wbyte( LCD12864_R_COM ); //LCD12864_RW=11111,RW(1),RS(0),0
while( LCD12864_Rbyte() & 0x80 ); //读BF,直到BF == 0
}
/*************************dat_com=0写指令,dat_com=1写数据*****************************************/
void LCD12864_W (bit dat_com,uchar byte)
{
uchar temp;
if(dat_com == 0) //为零,写入指令
temp = LCD12864_W_COM; //11111,RS(0),RW(0),0
else //否则,写入数据
temp = LCD12864_W_DAT; //11111,RS(1),RW(0),0
LCD12864_CS = 1; //片选使能
LCD12864_busy(); //LCD忙检测
LCD12864_Wbyte(temp); //写入模式选择,指令还是数据
LCD12864_Wbyte(byte&0xf0); //写入字节
LCD12864_Wbyte((byte<<4)&0xf0); //写入字节
LCD12864_CS = 0; //片选关闭
}
/****************************LCD12864初始化**************************************/
void LCD12864_Init(void)
{
LCDRST=1;
LCD12864_PSB = 0; //选择串口模式
LCD12864_W(LCD12864_COM,0x30); //基本指令功能.
LCD12864_W(LCD12864_COM,0x03); //允许输入卷动位址
LCD12864_W(LCD12864_COM,0x0c); //脱离随眠状态,显示打开,关光标,反白关.
LCD12864_W(LCD12864_COM,0x01); //清屏指令.
LCD12864_W(LCD12864_COM,0x06); //AC自动加一,光标右移,整体显示不移动
}
/**************************LCD12864字符位置自定义显示****************************************/
void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
{
uchar addr,i=0;
switch (x)
{
case 0:addr=0x80;break;
case 1:addr=0x90;break;
case 2:addr=0x88;break;
case 3:addr=0x98;break;
}
addr=addr+y;
LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC); //8BitMCU,基本指令集合
LCD12864_W(LCD12864_COM,addr); //显示在自定义位置
while(buff[i]!='\0')
{
LCD12864_W(LCD12864_DAT,buff[i++]);
if(++y==16)
{
y=0;
if(++x==4) x=0;
switch (x)
{
case 0:addr=0x80;break;
case 1:addr=0x90;break;
case 2:addr=0x88;break;
case 3:addr=0x98;break;
}
addr=addr+y;
LCD12864_W(LCD12864_COM,addr);
}
}
}
void Disp_img(unsigned char *img) //图形方式12864显示字模221 横向取膜
{
unsigned char i,j;
unsigned int k = 0;
LCD12864_W(0,0x36); //图形方式
for(i=0;i<32;i++)
{
LCD12864_W(0,0x80+i);
LCD12864_W(0,0x80);
for(j=0;j<16;j++)
{
LCD12864_W(1,img[k++]);
}
}
for(i=0;i<32;i++)
{
LCD12864_W(0,0x80+i);
LCD12864_W(0,0x88);
for(j=0;j<16;j++)
{
LCD12864_W(1,img[k++]);
}
}
}
/************************显示1 *********************************/
void display1(long temp)
{
uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
//temp=12345678;
x=Re_Convert(); //读取温度//X=读到的值
wdd=25*x;//温度量化 X 0.25//取后两位就X25
wd =(uint)wdd;//浮点型变量转换成uint型变量16位
//wd=wd-48;//计算
wd=wd/2;//计算
dt1 = temp%10;//1位
dt2 = temp%100/10;//2位
dt3 = temp%1000/100;//3位
dt4 = temp%10000/1000;//4位
dt5 = temp%100000/10000;//5位
dt6 = temp%1000000/100000;//6位
dt7 = temp%10000000/1000000;//7位
dt8 = temp/10000000;//8位 最高位
if(wd>9999)
{
LCD12864_WPoss(2,0,"水温:");//第1行显示表1
// LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
//LCD12864_W(1,tabe[dt8]);//6位
//LCD12864_W(1,tabe[dt7]);//5位
//LCD12864_W(1,tabe[dt6]);//4位
LCD12864_W(1,tabe[dt5]);//3位
LCD12864_W(1,tabe[dt4]);//4位
LCD12864_W(1,tabe[dt3]);//3位
// LCD12864_W(1,0x2e);
//LCD12864_W(1,tabe[dt2]);//4位
//LCD12864_W(1,tabe[dt1]);//3位
//LCD12864_WPoss(1,6,"℃");//第1行显示表1
}
else
{
LCD12864_WPoss(2,0,"水温:");//第1行显示表1
// LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
//LCD12864_W(1,tabe[dt8]);//6位
//LCD12864_W(1,tabe[dt7]);//5位
//LCD12864_W(1,tabe[dt6]);//4位
//LCD12864_W(1,tabe[dt5]);//3位
LCD12864_W(1,tabe[dt4]);//4位
LCD12864_W(1,tabe[dt3]);//3位
//LCD12864_W(1,0x2e);
//LCD12864_W(1,tabe[dt2]);//4位
//LCD12864_W(1,tabe[dt1]);//3位
// LCD12864_WPoss(1,6,"℃");//第1行显示表1
}
}
/************************显示2 *********************************/
void display2(long temp)
{
uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
//temp=12345678;
x2=Re_Convert2(); //读取温度//X=读到的值
wdd2=25*x2;//温度量化 X 0.25//取后两位就X25
wd2 =(uint)wdd2;//浮点型变量转换成uint型变量16位
//wd=wd-48;//计算
wd2=wd2/2;//计算
dt1 = temp%10;//1位
dt2 = temp%100/10;//2位
dt3 = temp%1000/100;//3位
dt4 = temp%10000/1000;//4位
dt5 = temp%100000/10000;//5位
dt6 = temp%1000000/100000;//6位
dt7 = temp%10000000/1000000;//7位
dt8 = temp/10000000;//8位 最高位
if(wd2>9999)
{
LCD12864_WPoss(2,4,"空调:");//第1行显示表1
// LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
//LCD12864_W(1,tabe[dt8]);//6位
//LCD12864_W(1,tabe[dt7]);//5位
//LCD12864_W(1,tabe[dt6]);//4位
LCD12864_W(1,tabe[dt5]);//3位
LCD12864_W(1,tabe[dt4]);//4位
LCD12864_W(1,tabe[dt3]);//3位
// LCD12864_W(1,0x2e);
//LCD12864_W(1,tabe[dt2]);//4位
//LCD12864_W(1,tabe[dt1]);//3位
//LCD12864_WPoss(2,6,"℃");//第1行显示表1
}
else
{
LCD12864_WPoss(2,4,"空调:");//第1行显示表1
// LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
//LCD12864_W(1,tabe[dt8]);//6位
//LCD12864_W(1,tabe[dt7]);//5位
//LCD12864_W(1,tabe[dt6]);//4位
//LCD12864_W(1,tabe[dt5]);//3位
LCD12864_W(1,tabe[dt4]);//4位
LCD12864_W(1,tabe[dt3]);//3位
//LCD12864_W(1,0x2e);
//LCD12864_W(1,tabe[dt2]);//4位
//LCD12864_W(1,tabe[dt1]);//3位
//LCD12864_WPoss(2,6,"℃");//第1行显示表1
}
}
/************************显示3 *********************************/
void display3(uint dat1,dat2,dat3,dat4 )
{
uint ge1,ge2,ge3,ge4,shi1,shi2,shi3,shi4;
dat1=second;
dat2=minute;
dat3=hour;
dat4=week;
ge1= dat1%10;//1位
shi1= dat1%100/10;//2位
ge2= dat2%10;//3位
shi2= dat2%100/10;//4位
ge3= dat3%10;//5位
shi3 = dat3%100/10;//6位
ge4= dat4%10;//7位
shi4 = dat4%100/10;//8位
LCD12864_WPoss(0,0," ");//第1行显示表1
// LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
readtime();//读出所有时间
LCD12864_W(1,tabe[shi3]);
LCD12864_W(1,tabe[ge3]);
LCD12864_W(1,0x3a);
LCD12864_W(1,tabe[shi2]);
LCD12864_W(1,tabe[ge2]);
LCD12864_W(1,0x3a);
LCD12864_W(1,tabe[shi1]);
LCD12864_W(1,tabe[ge1]);
LCD12864_WPoss(0,5,"星期");//第1行显示表1
//LCD12864_W(1,tabe[shi4]);
LCD12864_W(1,tabe[ge4]);
}
/************************显示4************************************/
void display4(long temp1)
{
uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
tmp = ((ad_out * 50) / 1024)+5; //10位AD读取的数值是0-1024,
//将这个值转换成对应的0-5V电压(放大了10倍) +5为二极管0.5V压降修正
if(tmp<6){tmp=0;}//去二极管0.5V压降修正
temp1 = tmp;
dt1 = temp1%10;//1位
dt2 = temp1%100/10;//2位
dt3 = temp1%1000/100;//3位
dt4 = temp1%10000/1000;//4位
dt5 = temp1%100000/10000;//5位
dt6 = temp1%1000000/100000;//6位
dt7 = temp1%10000000/1000000;//7位
dt8 = temp1/10000000;//8位 最高位
LCD12864_WPoss(1,0,"电压:");//第2行显示表1
// LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
//LCD12864_W(1,tabe[dt8]);//8位
//LCD12864_W(1,tabe[dt7]);//7位
// LCD12864_W(1,tabe[dt6]);//6位
//LCD12864_W(1,tabe[dt5]);//5位
//LCD12864_W(1,tabe[dt4]);//4位
LCD12864_W(1,tabe[dt3]);//3位
LCD12864_W(1,tabe[dt2]);//2位
LCD12864_W(1,0x2e);// 显示点
LCD12864_W(1,tabe[dt1]);//1位
//LCD12864_WPoss(2,5,"V ");//第1行显示表1
}
/************************显示4************************************/
void display5(long temp1)
{
if(F1==0)
{
LCD12864_WPoss(3,0,"1 启动");//第2行显示表1
}
else
{
LCD12864_WPoss(3,0,"1 停止");//第2行显示表1
}
if(F2==0)
{
LCD12864_WPoss(3,5,"2 启动");//第2行显示表1
}
else
{
LCD12864_WPoss(3,5,"2 停止");//第2行显示表1
}
LCD12864_WPoss(3,3,"(FS)");//第2行显示表1
}
/************************显示3 *********************************/
void display6(uint dat1,dat2,dat3,dat4 )
{
uint ge1,ge2,ge3,ge4,shi1,shi2,shi3,shi4;
dat1=month;
dat2=day;
ge1= dat1%10;//1位
shi1= dat1%100/10;//2位
ge2= dat2%10;//3位
shi2= dat2%100/10;//4位
LCD12864_WPoss(1,5,"");//第1行显示表1
// LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
readtime();//读出所有时间
LCD12864_W(1,tabe[shi1]);
LCD12864_W(1,tabe[ge1]);
LCD12864_W(1,0x2f);
LCD12864_W(1,tabe[shi2]);
LCD12864_W(1,tabe[ge2]);
}
/*****************************main**********************************************/
void main()
{
LCD12864_Init();
init_1302();
InitADC(); //AD初始化
IE = 0xa0; //允许AD中断
EA = 1;// 打开AD中断
F1= 1;
F2= 1;
while(1)
{
display1(wd);//显示//温度显示
display2(wd2);//显示//温度显示
display3();//显示//温度显示
display4();//显示电压 //Ok
display5();//显示风扇
display6();//显示
}
}
void adc_isr() interrupt 5 using 1 //通道电压整合
{
ADC_CONTR &= !ADC_FLAG; //Clear ADC interrupt flag
ad_out = (ADC_RES << 2) + ADC_LOW2; //高8位+低两位
//if(++ch>7)ch=0;//循环显示8个通道AD采样
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
} |