您的位置 首页 模拟

MSP430与DS18B20之1602显现

includemsp430x14xh>typedefunsignedcharuchar;typedefunsignedintuint;**************宏定义*************

#include

typedef unsigned char uchar;
typedef unsigned int uint;
/**************宏界说***************/
#define DataDir P4DIR
#define DataPort P4OUT
#define Busy 0x80
#define CtrlDir P3DIR
#define CLR_RS P3OUT&=~BIT0; //RS = P3.0
#define SET_RS P3OUT|=BIT0;
#define CLR_RW P3OUT&=~BIT1; //RW = P3.1
#define SET_RW P3OUT|=BIT1;
#define CLR_EN P3OUT&=~BIT2; //EN = P3.2
#define SET_EN P3OUT|=BIT2;

#define DQ1 P1OUT |= BIT6
#define DQ0 P1OUT &= ~BIT6
#define DQ_in P1DIR &= ~BIT6
#define DQ_out P1DIR |= BIT6
#define DQ_val (P1IN & BIT6)
uint tvalue;
uchar tflag;
uchar disdata[4];

/*******************************************
函数称号:Delay5ms
功 能:延时约5ms
参 数:无
返回值 :无
********************************************/
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i–;
}
}
/*******************************************
函数称号:DelayNus
功 能:完结N个微秒的延时
参 数:n–延时长度
返回值 :无
阐明 :定时器A的计数时钟是1MHz,CPU主频8MHz
所以经过定时器延时可以得到极为准确的
us级延时
********************************************/
void DelayNus(uint n)
{
CCR0 = n;
TACTL |= MC_1; //增计数到CCR0
while(!(TACTL & BIT0)); //等候
TACTL &= ~MC_1; //中止计数
TACTL &= ~BIT0; //铲除中止标志
}
/*******************************************
函数称号:WaitForEnable
功 能:等候1602液晶完结内部操作
参 数:无
返回值 :无
********************************************/
void WaitForEnable(void)
{
P4DIR &= 0x00; //将P4口切换为输入状况
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();

while((P4IN & Busy)!=0); //检测忙标志
CLR_EN;
P4DIR |= 0xFF; //将P4口切换为输出状况
}
/*******************************************
函数称号:write_com
功 能:向液晶模块写入指令
参 数:cmd–指令,
chk–是否判忙的标志,1:判忙,0:不判
返回值 :无
********************************************/
void write_com(uchar cmd)
{
WaitForEnable(); // 检测忙信号?

CLR_RS;
CLR_RW;
_NOP();
DataPort = cmd; //将指令字写入数据端口
_NOP();

SET_EN; //发生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}

/*******************************************
函数称号:write_data
功 能:向液晶显现的当时地址写入显现数据
参 数:data–显现字符数据
返回值 :无
********************************************/
void write_data( uchar data )
{
WaitForEnable(); //等候液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort = data; //将显现数据写入数据端口
_NOP();
SET_EN; //发生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}

void zifuchuan(uchar *ch)
{
while(*ch!=0)
write_data(*ch++);
Delay5ms();
}

/*******************************************
函数称号:LcdReset
功 能:对1602液晶模块进行复位操作
参 数:无
返回值 :无
********************************************/
void LcdReset(void)
{
CtrlDir |= 0x07; //控制线端口设为输出状况
DataDir = 0xFF; //数据端口设为输出状况

write_com(0x38); //规则的复位操作
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38); //显现形式设置
write_com(0x08); //显现封闭
write_com(0x01); //显现清屏
write_com(0x06); //写字符时全体不移动
write_com(0x0c); //显现开,不开游标,不闪耀
}

/*******************************************
函数称号:Init_18B20
功 能:对DS18B20进行复位操作
参 数:无
返回值 :初始化状况标志:1–失利,0–成功
********************************************/
uchar Init_18B20(void)
{
uchar Error;

DQ_out;
_DINT();
DQ0;
DelayNus(500);
DQ1;
DelayNus(55);
DQ_in;
_NOP();
if(DQ_val)
{
Error = 1; //初始化失利
}
else
{
Error = 0; //初始化成功
}
DQ_out;
DQ1;
_EINT();

DelayNus(400);

return Error;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/254050.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部