wr_com_12((0x90|x)+8); }
/************************************** 12864 显示字符串
***************************************/ void print_string(uchar *s) { while(*s!='\\0') { wr_dat_12(*s); s++; } }
/**************************************** 12864 清屏
****************************************/ void clear_12( ) { wr_com_12(0x01); //清楚显示 将DDRAM填满―20H‖(空格), //并设定CGRAM位址到位址计数器AC为0 }
/****************************************** 12864 液晶初始化
******************************************/ void init_12( ) { // psb_12 = 1; wr_com_12(0x06); //光标的移动方向 游标右移,DDRAM地址计数器(AC)加1 wr_com_12(0x0c); // 开显示,关游标,正常显示 wr_com_12(0x30); //功能设定:8位接口 clear_12(); }
/********************************************* 18B20程序部分
***********************************************/ uchar temp_buf[5]={1,0,'.',0,'\\0'}; uchar flag; sbit dp = P0^1;
/********************************* 延迟 大约8us
************************************/ void delay_us(uint y) { while (y--)
41
{
_nop_(); _nop_(); } }
/****************************************** DS18B20 初始化
********************************************/ void init_1820() { dp = 1; delay_us(1); //拉高一段时间 dp = 0; delay_us(260); //拉低大约480us dp = 1; while(dp); // 检测是否复位成功或DS18B20是否存在 delay_us(70); dp = 1; }
/*************************************** 写操作,每次写入一个dat
****************************************/ void wr_1820(uchar dat) { uchar i; for(i=0;i<8;i++) { dp = 0; delay_us(1); dp = dat&0x01; delay_us(70); dp = 1; dat = dat>>1; } }
/**************************************** 读操作,每次返回16位数据
******************************************/ uint re_1820() { uchar i; uint dat; for(i=0;i<16;i++) {
42
dp = 0; delay_us(1); dp = 1; if(dp) { dat = (dat>>1)|0x8000; } else dat = dat>>1; dp=1; delay_us(60); } return(dat); }
/***********************************************************
读取温度函数,返回温度的绝对值,并标注flag,flag=1表示负,flag=0表示正 **********************************************************/ uint readtemp() { uint temp; float m; init_1820(); wr_1820(0xcc); wr_1820(0x44); init_1820(); wr_1820(0xcc); wr_1820(0xbe); temp = re_1820(); if(temp > 0xfff) { flag = 1; temp = (~temp)+1; } else { flag = 0; } m = temp*0.0625; temp = m*10+0.5; return(temp); }
/******************************************* 温度读取及处理函数
******************************************/
43
void gettemp() { uint tem; tem = readtemp(); temp_buf[0] = tem/100 + '0'; temp_buf[1] = tem0/10 + '0'; temp_buf[2] = '.'; temp_buf[3] = tem + '0'; temp_buf[4] = '\\0'; }
/******************************************************************** 显示温度函数
********************************************************************/ void print_tem(uchar x,uchar y) { goto_xy_12(x,y); print_string(temp_buf); goto_xy_12(x+2,y); print_string(\℃\}
/******************************************************* DS1302 程序部分
****************************************************/ sbit ds_1302 = P1^0; // 定义数据线 sbit clk_1302 = P4^2; // 定义时钟线 sbit rst_1302 = P1^1; // 定义复位线-
uchar second,minute,hour,year,month,day,week; //定义 秒,分,时,年,月,日 ,星期
uchar date_buf[13] = {'2','0',0,0,'-',0,0,'-',0,0,'\\0' }; // 2011/10/12 为什么后面括号不能缩进呢 uchar time_buf[9] = {0,0,':',0,0,':',0,0,'\\0' }; //24:12:12 uchar week_buf[2] = {'0','\\0'}; //星期
/******************************************************************** 延时x个us
********************************************************************/ void delayus_1302( ) { _nop_(); _nop_(); }
/************************************************ 向DS1302 写数据
**********************************************/ void write_byte1302(uchar dat) { uchar i;
44
clk_1302 = 0; for(i=0;i<8;i++) { ds_1302 = dat&0x01; delayus_1302( ); clk_1302 = 1; delayus_1302( ); clk_1302 = 0; dat = dat>>1; } }
/******************************************************************** 从DS1302 读数据
********************************************************************/ uchar read_byte1302( ) { uchar i,dat; delayus_1302( ); for(i=0;i<8;i++) { dat = dat>>1; if(ds_1302==1) dat = dat|0x80; clk_1302 = 1; delayus_1302( ); clk_1302 = 0; delayus_1302( ); } return dat; }
/*************************************** 向地址DS1302中写数据
入口参数: com命令字, dat 数据
*******************************************/ void write1302(uchar com,uchar dat) { rst_1302= 0; clk_1302 = 0; rst_1302 = 1; delayus_1302( ); write_byte1302(com); write_byte1302(dat); clk_1302 = 1; rst_1302 = 0;
45