小弟现在准备学习液晶显示技术,用的是51单片机,哪位大哥有液晶显示技术的初级教程吗?
多谢!!
1602液晶显示
全部回复(14)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
/*SMC1602A(16*2)模拟口线接线方式
连接线图:
---------------------------------------------------
|LCM-----51 | LCM-----51 | LCM------51 |
--------------------------------------------------|
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.1 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.0 |
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
|DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND|
---------------------------------------------------
=============================================================*/
#include
sbit LCM_RW=P2^1; //定义引脚
sbit LCM_RS=P2^0;
sbit LCM_E=P2^2;
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
//unsigned char code uctech[] = {"uctech"};
//unsigned char code net[] = {"uctech.icpcn.com"};
void main(void)
{
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
//DisplayListChar(0, 0, "9.63_8.24");
DisplayListChar(0, 1, "123.456");
DisplayOneChar(7,0,0x44);
DisplayOneChar(8,0,0x46);
//DisplayOneChar(8,0,0x20);
DisplayOneChar(9,0,0x43);
//ReadDataLCM();//测试用句无意义
while(1);
}
/*----------------------------------------------------------------*/
/* 写数据 */
/* 输入:RS=1,RW=0,E=1,D0~D7=数据,E=高脉冲 输出:无 */
/*----------------------------------------------------------------*/
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data=WDLCM;
LCM_RS=1;
LCM_RW=0;
LCM_E=0; //若晶振速度太高可以在这后加小的延时
LCM_E=0; //延时
LCM_E=1;
}
/*----------------------------------------------------------------*/
/* 写指令 */
/* 输入:RS=0,RW=0,E=1,D0~D7=指令码,E=高脉冲 输出:无 */
/*----------------------------------------------------------------*/
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*----------------------------------------------------------------*/
/* 读数据 */
/* 输入:RS=1,RW=1,E=1 输出:D0~D7=数据 */
/*----------------------------------------------------------------*/
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/*========================== */
/*读状态 :输入:RS=0,RW=1,E=1 输出:D0~D7 状态字 */
/* 状态字说明 */
/* D0~D6 当前数据地址指针的数值 */
/* D7 读写操作使能 1:禁止 0:允许 */
/*========================== */
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
连接线图:
---------------------------------------------------
|LCM-----51 | LCM-----51 | LCM------51 |
--------------------------------------------------|
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.1 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.0 |
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
|DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND|
---------------------------------------------------
=============================================================*/
#include
sbit LCM_RW=P2^1; //定义引脚
sbit LCM_RS=P2^0;
sbit LCM_E=P2^2;
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
//unsigned char code uctech[] = {"uctech"};
//unsigned char code net[] = {"uctech.icpcn.com"};
void main(void)
{
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
//DisplayListChar(0, 0, "9.63_8.24");
DisplayListChar(0, 1, "123.456");
DisplayOneChar(7,0,0x44);
DisplayOneChar(8,0,0x46);
//DisplayOneChar(8,0,0x20);
DisplayOneChar(9,0,0x43);
//ReadDataLCM();//测试用句无意义
while(1);
}
/*----------------------------------------------------------------*/
/* 写数据 */
/* 输入:RS=1,RW=0,E=1,D0~D7=数据,E=高脉冲 输出:无 */
/*----------------------------------------------------------------*/
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data=WDLCM;
LCM_RS=1;
LCM_RW=0;
LCM_E=0; //若晶振速度太高可以在这后加小的延时
LCM_E=0; //延时
LCM_E=1;
}
/*----------------------------------------------------------------*/
/* 写指令 */
/* 输入:RS=0,RW=0,E=1,D0~D7=指令码,E=高脉冲 输出:无 */
/*----------------------------------------------------------------*/
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*----------------------------------------------------------------*/
/* 读数据 */
/* 输入:RS=1,RW=1,E=1 输出:D0~D7=数据 */
/*----------------------------------------------------------------*/
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/*========================== */
/*读状态 :输入:RS=0,RW=1,E=1 输出:D0~D7 状态字 */
/* 状态字说明 */
/* D0~D6 当前数据地址指针的数值 */
/* D7 读写操作使能 1:禁止 0:允许 */
/*========================== */
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
0
回复
提示
@清风斜影
/*SMC1602A(16*2)模拟口线接线方式连接线图: --------------------------------------------------- |LCM-----51 |LCM-----51 |LCM------51 | --------------------------------------------------| |DB0-----P0.0|DB4-----P0.4|RW-------P2.1 | |DB1-----P0.1|DB5-----P0.5|RS-------P2.0 | |DB2-----P0.2|DB6-----P0.6|E--------P2.2 | |DB3-----P0.3|DB7-----P0.7|VLCD接1K电阻到GND| ---------------------------------------------------=============================================================*/#includesbitLCM_RW=P2^1;//定义引脚sbitLCM_RS=P2^0;sbitLCM_E=P2^2;#defineLCM_DataP0#defineBusy 0x80//用于检测LCM状态字中的Busy标识voidWriteDataLCM(unsignedcharWDLCM);voidWriteCommandLCM(unsignedcharWCLCM,BuysC);unsignedcharReadDataLCM(void);unsignedcharReadStatusLCM(void);voidLCMInit(void);voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);voidDelay5Ms(void);voidDelay400Ms(void);//unsignedcharcodeuctech[]={"uctech"};//unsignedcharcodenet[]={"uctech.icpcn.com"};voidmain(void){Delay400Ms();//启动等待,等LCM讲入工作状态LCMInit();//LCM初始化Delay5Ms();//延时片刻(可不要)//DisplayListChar(0,0,"9.63_8.24");DisplayListChar(0,1,"123.456"); DisplayOneChar(7,0,0x44); DisplayOneChar(8,0,0x46);//DisplayOneChar(8,0,0x20); DisplayOneChar(9,0,0x43);//ReadDataLCM();//测试用句无意义while(1);}/*----------------------------------------------------------------*//*写数据 *//* 输入:RS=1,RW=0,E=1,D0~D7=数据,E=高脉冲 输出:无 *//*----------------------------------------------------------------*/voidWriteDataLCM(unsignedcharWDLCM){ReadStatusLCM();//检测忙LCM_Data=WDLCM;LCM_RS=1;LCM_RW=0;LCM_E=0;//若晶振速度太高可以在这后加小的延时LCM_E=0;//延时LCM_E=1;}/*----------------------------------------------------------------*//*写指令 *//* 输入:RS=0,RW=0,E=1,D0~D7=指令码,E=高脉冲 输出:无 *//*----------------------------------------------------------------*/voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测{if(BuysC)ReadStatusLCM();//根据需要检测忙LCM_Data=WCLCM;LCM_RS=0;LCM_RW=0;LCM_E=0;LCM_E=0;LCM_E=1;}/*----------------------------------------------------------------*//*读数据 *//* 输入:RS=1,RW=1,E=1 输出:D0~D7=数据 *//*----------------------------------------------------------------*/unsignedcharReadDataLCM(void){LCM_RS=1;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;return(LCM_Data);}/*==========================*//*读状态:输入:RS=0,RW=1,E=1 输出:D0~D7状态字 *//* 状态字说明 *//* D0~D6当前数据地址指针的数值 *//* D7 读写操作使能 1:禁止 0:允许 *//*==========================*/unsignedcharReadStatusLCM(void){LCM_Data=0xFF;LCM_RS=0;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;while(LCM_Data&Busy);//检测忙信号return(LCM_Data);}voidLCMInit(void)//LCM初始化{LCM_Data=0;WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1);//关闭显示WriteCommandLCM(0x01,1);//显示清屏WriteCommandLCM(0x06,1);//显示光标移动设置WriteCommandLCM(0x0C,1);//显示开及光标设置}//按指定位置显示一个字符voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1if(Y)X|=0x40;//当要显示第二行时地址码+0x40;X|=0x80;//算出指令码WriteCommandLCM(X,0);//这里不检测忙信号,发送地址码WriteDataLCM(DData);}//按指定位置显示一串字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength; ListLength=0;Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1while(DData[ListLength]>0x20)//若到达字串尾则退出 { if(X
大哥,我只会汇编啊,这个C我看不懂.有没有汇编的啊??
0
回复
提示
@清风斜影
/*SMC1602A(16*2)模拟口线接线方式连接线图: --------------------------------------------------- |LCM-----51 |LCM-----51 |LCM------51 | --------------------------------------------------| |DB0-----P0.0|DB4-----P0.4|RW-------P2.1 | |DB1-----P0.1|DB5-----P0.5|RS-------P2.0 | |DB2-----P0.2|DB6-----P0.6|E--------P2.2 | |DB3-----P0.3|DB7-----P0.7|VLCD接1K电阻到GND| ---------------------------------------------------=============================================================*/#includesbitLCM_RW=P2^1;//定义引脚sbitLCM_RS=P2^0;sbitLCM_E=P2^2;#defineLCM_DataP0#defineBusy 0x80//用于检测LCM状态字中的Busy标识voidWriteDataLCM(unsignedcharWDLCM);voidWriteCommandLCM(unsignedcharWCLCM,BuysC);unsignedcharReadDataLCM(void);unsignedcharReadStatusLCM(void);voidLCMInit(void);voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);voidDelay5Ms(void);voidDelay400Ms(void);//unsignedcharcodeuctech[]={"uctech"};//unsignedcharcodenet[]={"uctech.icpcn.com"};voidmain(void){Delay400Ms();//启动等待,等LCM讲入工作状态LCMInit();//LCM初始化Delay5Ms();//延时片刻(可不要)//DisplayListChar(0,0,"9.63_8.24");DisplayListChar(0,1,"123.456"); DisplayOneChar(7,0,0x44); DisplayOneChar(8,0,0x46);//DisplayOneChar(8,0,0x20); DisplayOneChar(9,0,0x43);//ReadDataLCM();//测试用句无意义while(1);}/*----------------------------------------------------------------*//*写数据 *//* 输入:RS=1,RW=0,E=1,D0~D7=数据,E=高脉冲 输出:无 *//*----------------------------------------------------------------*/voidWriteDataLCM(unsignedcharWDLCM){ReadStatusLCM();//检测忙LCM_Data=WDLCM;LCM_RS=1;LCM_RW=0;LCM_E=0;//若晶振速度太高可以在这后加小的延时LCM_E=0;//延时LCM_E=1;}/*----------------------------------------------------------------*//*写指令 *//* 输入:RS=0,RW=0,E=1,D0~D7=指令码,E=高脉冲 输出:无 *//*----------------------------------------------------------------*/voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测{if(BuysC)ReadStatusLCM();//根据需要检测忙LCM_Data=WCLCM;LCM_RS=0;LCM_RW=0;LCM_E=0;LCM_E=0;LCM_E=1;}/*----------------------------------------------------------------*//*读数据 *//* 输入:RS=1,RW=1,E=1 输出:D0~D7=数据 *//*----------------------------------------------------------------*/unsignedcharReadDataLCM(void){LCM_RS=1;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;return(LCM_Data);}/*==========================*//*读状态:输入:RS=0,RW=1,E=1 输出:D0~D7状态字 *//* 状态字说明 *//* D0~D6当前数据地址指针的数值 *//* D7 读写操作使能 1:禁止 0:允许 *//*==========================*/unsignedcharReadStatusLCM(void){LCM_Data=0xFF;LCM_RS=0;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;while(LCM_Data&Busy);//检测忙信号return(LCM_Data);}voidLCMInit(void)//LCM初始化{LCM_Data=0;WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1);//关闭显示WriteCommandLCM(0x01,1);//显示清屏WriteCommandLCM(0x06,1);//显示光标移动设置WriteCommandLCM(0x0C,1);//显示开及光标设置}//按指定位置显示一个字符voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1if(Y)X|=0x40;//当要显示第二行时地址码+0x40;X|=0x80;//算出指令码WriteCommandLCM(X,0);//这里不检测忙信号,发送地址码WriteDataLCM(DData);}//按指定位置显示一串字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength; ListLength=0;Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1while(DData[ListLength]>0x20)//若到达字串尾则退出 { if(X
好像大家都很喜欢用软件延时啊?但是在实时操作系统里这样是不现实的,为什么不利用定时器做一个内部时钟源,再来做延时?一般软件延时只能用在系统初始化的时候吧?
0
回复
提示
@zlm943213
我做单片机有几年,看了你的发言,我还是不明白你的意思,在程序里有延时的,如何用定时器来替代?能说具体点吗?我非常想知道,谢谢!
我的意思是说,用软件延时意味着不能执行其他非中断的操作,如果这期间需要控制其他操作怎么办?用中断吗?用定时器就不会有这个问题,使用循环扫描查看可能需要执行的操作(内部计时也是操作list中的一个),象这种需要延时的操作在执行条件中加入时间限制就可以了.
不知道我说清楚了没有?定时器是用来产生内部计时的时基的.譬如说这个程序,要产生10ms的延时,用定时器作一个1ms的定时中断,每次中断相应变量加1,在程序执行时判断到变量值到10才允许继续,否则回到主循环等待下次扫描.
其实我说的只在需要同时进行多种操作时才有用,涉及到任务调度的问题.我是在RTOS介绍中看到的.你可以找本RTOS的书看看,相信你以前一定看过不少吧?不知道你们是怎样完成实时任务调度的?可以介绍一下吗?
谢谢!
不知道我说清楚了没有?定时器是用来产生内部计时的时基的.譬如说这个程序,要产生10ms的延时,用定时器作一个1ms的定时中断,每次中断相应变量加1,在程序执行时判断到变量值到10才允许继续,否则回到主循环等待下次扫描.
其实我说的只在需要同时进行多种操作时才有用,涉及到任务调度的问题.我是在RTOS介绍中看到的.你可以找本RTOS的书看看,相信你以前一定看过不少吧?不知道你们是怎样完成实时任务调度的?可以介绍一下吗?
谢谢!
0
回复
提示
@zhljb
我的意思是说,用软件延时意味着不能执行其他非中断的操作,如果这期间需要控制其他操作怎么办?用中断吗?用定时器就不会有这个问题,使用循环扫描查看可能需要执行的操作(内部计时也是操作list中的一个),象这种需要延时的操作在执行条件中加入时间限制就可以了.不知道我说清楚了没有?定时器是用来产生内部计时的时基的.譬如说这个程序,要产生10ms的延时,用定时器作一个1ms的定时中断,每次中断相应变量加1,在程序执行时判断到变量值到10才允许继续,否则回到主循环等待下次扫描.其实我说的只在需要同时进行多种操作时才有用,涉及到任务调度的问题.我是在RTOS介绍中看到的.你可以找本RTOS的书看看,相信你以前一定看过不少吧?不知道你们是怎样完成实时任务调度的?可以介绍一下吗?谢谢!
我知道你所说的,平常写程序基本上也是这么写的,一般不使用延时,但是有的时候还非使用不可,比如DS1820读写操作时(这个例子可能不怎么恰当),需要等待的时间较长,毕竟延时很耗时间,这样的程序有办法使用定时器吗?或使用其它好办法?我很想知道答案,希望大家共同探讨.
0
回复
提示
@zlm943213
我知道你所说的,平常写程序基本上也是这么写的,一般不使用延时,但是有的时候还非使用不可,比如DS1820读写操作时(这个例子可能不怎么恰当),需要等待的时间较长,毕竟延时很耗时间,这样的程序有办法使用定时器吗?或使用其它好办法?我很想知道答案,希望大家共同探讨.
我没有用过DS1820,不清楚具体情况怎么样,但是我想的话,一般对片外元件进行读写都需要延时,但是实际上延时不是为了延时而延时,只是在等待片外元件进入到可操作状态,一般当它可以进行操作的时候,都会有相应的状态标志,所以在扫描任务时检测一下应该就可以了.重申一下,我不知道DS1820是什么东东,如果说得离谱,请勿见笑.
我想了解一下DS1820的一些资料,还有你们现在用DS1820是怎样完成延时的,用软件延时吗?请指教.
我想了解一下DS1820的一些资料,还有你们现在用DS1820是怎样完成延时的,用软件延时吗?请指教.
0
回复
提示
@zhljb
我没有用过DS1820,不清楚具体情况怎么样,但是我想的话,一般对片外元件进行读写都需要延时,但是实际上延时不是为了延时而延时,只是在等待片外元件进入到可操作状态,一般当它可以进行操作的时候,都会有相应的状态标志,所以在扫描任务时检测一下应该就可以了.重申一下,我不知道DS1820是什么东东,如果说得离谱,请勿见笑.我想了解一下DS1820的一些资料,还有你们现在用DS1820是怎样完成延时的,用软件延时吗?请指教.
DS1820是单总线温度感应器,我是用软件延时对DS1820操作.
比如:DS1820读温度子程序如下
read_ds1820()
{
set_com();
set_read_com();
delay_ms(500);
read_temp();
}
read_temp()
{unsigned char i,data_temp;
data_io=0
delay_ms(2) ;
for(i=0;i<8;i++)
{
data_temp=data_io;
data_temp<<=1;
}
}
以上的delay_ms(2)和delay_ms(500)能用定时T0延时吗?我个人认为还是用软件延时较好.你认为呢?
比如:DS1820读温度子程序如下
read_ds1820()
{
set_com();
set_read_com();
delay_ms(500);
read_temp();
}
read_temp()
{unsigned char i,data_temp;
data_io=0
delay_ms(2) ;
for(i=0;i<8;i++)
{
data_temp=data_io;
data_temp<<=1;
}
}
以上的delay_ms(2)和delay_ms(500)能用定时T0延时吗?我个人认为还是用软件延时较好.你认为呢?
0
回复
提示
@zlm943213
DS1820是单总线温度感应器,我是用软件延时对DS1820操作.比如:DS1820读温度子程序如下 read_ds1820(){ set_com(); set_read_com(); delay_ms(500); read_temp();}read_temp(){unsignedchari,data_temp;data_io=0delay_ms(2);for(i=0;i
还是没搞清楚你加入延时的目的,是为了等待温度扫描结束,还是说采样频率只需要约2K就够了?从程序中看DS1820应该是按位送出采样温度的数值,那么你是怎么保证每次开始读的数据是一个完整的字节的第0位?还有需要问一下的是,你这个程序是不是只需要完成定时扫描温度这一项任务?如果没有别的任务,只需要读出温度再转送出去,我认为是没有问题的.
0
回复
提示
@zhljb
完全同意你的意见.需要考虑用途和成本压力.对于学习来说,软件延时确实好用.
还是没搞清楚你加入延时的目的,是为了等待温度扫描结束,还是说采样频率只需要约2K就够了?从程序中看DS1820应该是按位送出采样温度的数值,那么你是怎么保证每次开始读的数据是一个完整的字节的第0位?
zlm943213回:
DS1820读写操作不只这么简单,我只不过简单的写一点.因为DS1820是单总线,所以读写操作必须有时间等待(CPU等DS1820或DS1820等CPU),最长的大约1MS,我想表达的就是有没有办法使用定时查询的办法来对DS1820进行操作,而不要用死等待.
zlm943213回:
DS1820读写操作不只这么简单,我只不过简单的写一点.因为DS1820是单总线,所以读写操作必须有时间等待(CPU等DS1820或DS1820等CPU),最长的大约1MS,我想表达的就是有没有办法使用定时查询的办法来对DS1820进行操作,而不要用死等待.
0
回复
提示