"); //-->
/*******************************************
工 程 名:430采集外界温度12864显示
工程包含:12864.c 12864.h 12864液晶显示
ds18b20.c ds18b20.h AD采集
delay.h 延时函数头文件
main.c
接 口: 12864液晶
RS P3^0 ; RW P3^1 ; EN P3^2;数据口 P4
Ds18b20接口
DQ P1^1
功能描述:采集外界温度,液晶显示。
工程内部的 .c .h 文件可任意移植。
作 者: Capture
修改时间:2013 .8.3
*******************************************/
18B20头文件
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include "MSP430x14x.h"
#include "12864.h"
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
#define DQ1 P1OUT |= BIT1
#define DQ0 P1OUT &= ~BIT1
#define DQ_in P1DIR &= ~BIT1
#define DQ_out P1DIR |= BIT1
#define DQ_val (P1IN & BIT1)
uchar Init_18B20(void);
void Write_18B20(uchar wdata);
uchar Read_18B20(void);
void Skip(void) ;
void Convert(void);
void Read_SP(void);
uint ReadTemp(void);
uint Do1Convert(void);
void display(int dat) ;
#endif
18b20函数
#include "ds18b20.h"
float tvalue;
uchar tflag;
uchar disdata[4];
/*******************************************
函数名称Init_18B20
功 能对DS18B20进行复位操作
参 数无
返回值 初始化状态标志1--失败0--成功
********************************************/
uchar Init_18B20(void)
{
uchar Error;
DQ_out;
_DINT();
DQ0;
DelayUs(500);
DQ1;
DelayUs(50);
DQ_in;
_NOP();
if(DQ_val)
{
Error = 1; //初始化失败
}
else
{
Error = 0; //初始化成功
}
DQ_out;
DQ1;
_EINT();
DelayUs(400);
return Error;
}
/*******************************************
函数名称Write_18B20
功 能向DS18B20写入一个字节的数据
参 数wdata--写入的数据
返回值 无
********************************************/
void Write_18B20(uchar wdata)
{
uchar i;
_DINT();
for(i = 0; i < 8;i++)
{
DQ0;
DelayUs(6); //延时6us
if(wdata & 0X01)
DQ1;
else
DQ0;
wdata >>= 1;
DelayUs(50); //延时50us
DQ1;
DelayUs(10); //延时10us
}
_EINT();
}
/*******************************************
函数名称Read_18B20
功 能从DS18B20读取一个字节的数据
参 数无
返回值 读出的一个字节数据
********************************************/
uchar Read_18B20(void)
{
uchar i;
uchar temp = 0;
_DINT();
for(i = 0;i < 8;i++)
{
temp >>= 1;
DQ0;
DelayUs(6); //延时6us
DQ1;
DelayUs(8); //延时9us
DQ_in;
_NOP();
if(DQ_val)
{
temp |= 0x80;
}
DelayUs(45); //延时45us
DQ_out;
DQ1;
DelayUs(10); //延时10us
}
_EINT();
return temp;
}
/*******************************************
函数名称Skip
功 能发送跳过读取产品ID号命令
参 数无
返回值 无
********************************************/
void Skip(void)
{
Write_18B20(0xcc);
}
/*******************************************
函数名称Convert
功 能发送温度转换命令
参 数无
返回值 无
********************************************/
void Convert(void)
{
Write_18B20(0x44);
}
/*******************************************
函数名称Read_SP
功 能发送读ScratchPad命令
参 数无
返回值 无
********************************************/
void Read_SP(void)
{
Write_18B20(0xbe);
}
/*******************************************
函数名称ReadTemp
功 能从DS18B20的ScratchPad读取温度转换结果
参 数无
返回值 读取的温度数值
********************************************/
uint ReadTemp(void)
{
uchar temp_low;
uint temp;
temp_low = Read_18B20(); //读低位
temp = Read_18B20(); //读高位
temp = (temp<<8) | temp_low;
return temp;
}
uint Do1Convert(void)
{
uchar i;
uchar temp_low;
uint temp;
do
{
i = Init_18B20();
}
while(i); //此处的i就是等于前面的Error,Error = 1,就会出现死循环,表示18B20可能坏了
Write_18B20(0xcc);//送跳过读取产品ID号命令
Write_18B20(0x44);//发送温度转换命令
for(i = 20;i > 0;i--)
{
DelayUs(60000); //延时800ms以上
}
do
{
i = Init_18B20();
}
while(i); //此处的i就是等于前面的Error,Error = 1,就会出现死循环,表示18B20可能坏了
Write_18B20(0xcc);//送跳过读取产品ID号命令
Write_18B20(0xbe);//发送读ROM命令
temp_low = Read_18B20(); //读低位
temp = Read_18B20(); //读高位
temp = (temp<<8) | temp_low;
if(temp<0x0fff)
tflag=0;
else
{
temp=~temp+1;
tflag=1;
}
tvalue = temp*(0.625);//温度值扩大10倍精确到1位小数
return tvalue;
}
void display(int dat)
{
disdata[0]=dat/1000;
disdata[1]=dat%1000/100;
disdata[2]=dat%100/10;
disdata[3]=dat%10;
Write_com(0x92);
Write_dat(disdata[0]+0x30);
Write_dat(disdata[1]+0x30);
Write_dat(disdata[2]+0x30);
Write_dat(0x2e);
Write_dat(disdata[3]+0x30);
Write_dat('C');
}
————————————————————————————
12864显示头文件
#ifndef __12864_H__
#define __12864_H__
#include "MSP430x14x.h"
#include "delay.h"
#define RS_1 (P3DIR |= BIT0,P3OUT |= BIT0)
#define RS_0 (P3DIR |= BIT0,P3OUT &= ~BIT0)
#define RW_1 (P3DIR |= BIT1,P3OUT |= BIT1)
#define RW_0 (P3DIR |= BIT1,P3OUT &= ~BIT1)
#define EN_1 (P3DIR |= BIT2,P3OUT |= BIT2)
#define EN_0 (P3DIR |= BIT2,P3OUT &= ~BIT2)
#define Dat_dir_out P4DIR |= 0xFF
#define Dat_out P4OUT
#define Dat_dir_in P4DIR &= 0x00
#define Dat_in P4IN
#define uchar unsigned char
#define uint unsigned int
void Read_busy(void);
void Write_com(uchar com);
void Write_dat(uchar dat);
void Lcd_init(void);
void Clear_DDRAM(void);
void set_position(uchar x,uchar y);
void lcd_st(uchar *st);
void LCD_WR_Num(uchar num);
void Draw_PM(const uchar *ptr);
void Clear_GDRAM(void);
void LCDStartInterface1();
#endif
12864显示函数
#include "12864.h"
/*************************************************
函数名称:void Read_busy(void)
函数功能:检测液晶是否忙碌,如果忙碌
就不让MSC进行操作,直到液晶
将内部处理完,才允许MSC进行
操作
入口参数:无
出口参数:无
**************************************************/
void Read_busy(void)
{
Dat_dir_out;
RS_0;
RW_1;
EN_1;
DelayUs(100);
Dat_dir_in;
while((Dat_in & 0X80) != 0);
}
/**************************************************
函数名称:void Write_com(uchar com)
函数功能:向液晶中写命令
入口参数:com 命令
出口参数:无
***************************************************/
void Write_com(uchar com)
{
Read_busy();
Dat_dir_out;
RS_0;
RW_0;
EN_1;
DelayUs(100);
Dat_out = com;
DelayUs(100);
EN_0;
}
/*************************************************
函数名称:void Write_dat(uchar dat)
函数功能:向液晶写数据
入口参数:dat 数据
出口参数:无
**************************************************/
void Write_dat(uchar dat)
{
Read_busy();
Dat_dir_out;
RS_1;
RW_0;
EN_1;
DelayUs(100);
Dat_out = dat;
// _NOP();_NOP();_NOP();
DelayUs(100);
EN_0;
}
/**************************************************
函数名称:void Lcd_init(void)
函数功能:液晶初始化
入口参数:无
出口参数:无
***************************************************/
void Lcd_init(void)
{
Write_com(0X30);
Delay_ms(50);
Write_com(0X01);
Delay_ms(50);
Write_com(0X02);
Write_com(0X0C);
Delay_ms(50);
}
/**************************************************
函数名称:void Clear_DDRAM(void)
函数功能:清除液晶屏幕上的字符和汉字(字符和汉字
是液晶库里自带的,不是自定义的)
入口参数:无
出口参数:无
***************************************************/
void Clear_DDRAM(void)
{
Write_com(0x01);
}
/**************************************************
函数名称:set_position(uchar x,uchar y)
函数功能:汉字显示坐标位置
入口参数:X选择行;Y所在行的位置
出口参数:无
***************************************************/
void set_position(uchar x,uchar y)
{
uchar postion;
switch(x)
{
case 0 : x = 0x80;break;//第一行
case 1 : x = 0x90;break;//第二行
case 2 : x = 0x88;break;//第三行
case 3 : x = 0x98;break;//第四行
default:break; //如果传来的值不在以上范围之内则退出循环
}
postion = x + y;//显示位置
Write_com(postion);//写入液晶
}
/**************************************************
函数名称: lcd_st(uchar *st)
函数功能: 显示字符串和汉字
入口参数: st
出口参数:无
***************************************************/
/*********显示字符串和汉字*******/
void lcd_st(uchar *st)
{
while(*st != '\0')//如果判断一个汉字没结束时,则执行while语句
{
Write_dat(*st);
st++;//每显示一个汉字,地址指针+1,以便显示下一个汉字
}
}
/**************************************************
* 函 数 名:LCD_WR_Num
* 功能描述:液晶写入一个十进制数;
* 输入参数:num:要写入的数
* 返 回 值:无
***************************************************/
void LCD_WR_Num(uchar num)
{
Write_dat(0x30 + num);
}
/*******************************************
函数名称:Draw_PM
功 能:在整个液晶屏幕上画图
参 数:无
返回值 :无
********************************************/
void Draw_PM(const uchar *ptr)
{
uchar i,j,k;
Write_com(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_com(i++);
Write_com(0x80);
for(k = 0;k < 16;k++)
{
Write_dat(*ptr++);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_com(i++);
Write_com(0x88);
for(k = 0;k < 16;k++)
{
Write_dat(*ptr++);
}
}
Write_com(0x36); //打开绘图显示
Write_com(0x30); //回到基本指令集
}
/**********************************************
函数名称:void Clear_GDRAM(void)
函数功能:清除因液晶产生的随机数而产生的乱点
入口参数:无
出口参数:无
***********************************************/
void Clear_GDRAM(void)
{
uchar i,j,k;
Write_com(0X36);
i = 0X80;
for(j=0;j<32;j++)
{
Write_com(i++);
Write_com(0X80);
for(k=0;k<16;k++)
{
Write_dat(0X00);
}
DelayUs(10);
}
i = 0X80;
for(j=0;j<32;j++)
{
Write_com(i++);
Write_com(0X88);
for(k=0;k<16;k++)
{
Write_dat(0X00);
}
DelayUs(10);
}
Write_com(0X30);
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。