小弟現(xiàn)在準備學習液晶顯示技術,用的是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狀態(tài)字中的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講入工作狀態(tài)
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);
}
/*----------------------------------------------------------------*/
/* 寫數(shù)據(jù) */
/* 輸入:RS=1,RW=0,E=1,D0~D7=數(shù)據(jù),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(); //根據(jù)需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*----------------------------------------------------------------*/
/* 讀數(shù)據(jù) */
/* 輸入:RS=1,RW=1,E=1 輸出:D0~D7=數(shù)據(jù) */
/*----------------------------------------------------------------*/
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/*========================== */
/*讀狀態(tài) :輸入:RS=0,RW=1,E=1 輸出:D0~D7 狀態(tài)字 */
/* 狀態(tài)字說明 */
/* D0~D6 當前數(shù)據(jù)地址指針的數(shù)值 */
/* 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); //這里不檢測忙信號,發(fā)送地址碼
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狀態(tài)字中的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講入工作狀態(tài)
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);
}
/*----------------------------------------------------------------*/
/* 寫數(shù)據(jù) */
/* 輸入:RS=1,RW=0,E=1,D0~D7=數(shù)據(jù),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(); //根據(jù)需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*----------------------------------------------------------------*/
/* 讀數(shù)據(jù) */
/* 輸入:RS=1,RW=1,E=1 輸出:D0~D7=數(shù)據(jù) */
/*----------------------------------------------------------------*/
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/*========================== */
/*讀狀態(tài) :輸入:RS=0,RW=1,E=1 輸出:D0~D7 狀態(tài)字 */
/* 狀態(tài)字說明 */
/* D0~D6 當前數(shù)據(jù)地址指針的數(shù)值 */
/* 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); //這里不檢測忙信號,發(fā)送地址碼
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狀態(tài)字中的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講入工作狀態(tài)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);}/*----------------------------------------------------------------*//*寫數(shù)據(jù) *//* 輸入:RS=1,RW=0,E=1,D0~D7=數(shù)據(jù),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();//根據(jù)需要檢測忙LCM_Data=WCLCM;LCM_RS=0;LCM_RW=0;LCM_E=0;LCM_E=0;LCM_E=1;}/*----------------------------------------------------------------*//*讀數(shù)據(jù) *//* 輸入:RS=1,RW=1,E=1 輸出:D0~D7=數(shù)據(jù) *//*----------------------------------------------------------------*/unsignedcharReadDataLCM(void){LCM_RS=1;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;return(LCM_Data);}/*==========================*//*讀狀態(tài):輸入:RS=0,RW=1,E=1 輸出:D0~D7狀態(tài)字 *//* 狀態(tài)字說明 *//* D0~D6當前數(shù)據(jù)地址指針的數(shù)值 *//* 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);//關閉顯示W(wǎng)riteCommandLCM(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);//這里不檢測忙信號,發(fā)送地址碼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狀態(tài)字中的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講入工作狀態(tài)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);}/*----------------------------------------------------------------*//*寫數(shù)據(jù) *//* 輸入:RS=1,RW=0,E=1,D0~D7=數(shù)據(jù),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();//根據(jù)需要檢測忙LCM_Data=WCLCM;LCM_RS=0;LCM_RW=0;LCM_E=0;LCM_E=0;LCM_E=1;}/*----------------------------------------------------------------*//*讀數(shù)據(jù) *//* 輸入:RS=1,RW=1,E=1 輸出:D0~D7=數(shù)據(jù) *//*----------------------------------------------------------------*/unsignedcharReadDataLCM(void){LCM_RS=1;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;return(LCM_Data);}/*==========================*//*讀狀態(tài):輸入:RS=0,RW=1,E=1 輸出:D0~D7狀態(tài)字 *//* 狀態(tài)字說明 *//* D0~D6當前數(shù)據(jù)地址指針的數(shù)值 *//* 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);//關閉顯示W(wǎng)riteCommandLCM(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);//這里不檢測忙信號,發(fā)送地址碼WriteDataLCM(DData);}//按指定位置顯示一串字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength; ListLength=0;Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1while(DData[ListLength]>0x20)//若到達字串尾則退出 { if(X
好像大家都很喜歡用軟件延時啊?但是在實時操作系統(tǒng)里這樣是不現(xiàn)實的,為什么不利用定時器做一個內(nèi)部時鐘源,再來做延時?一般軟件延時只能用在系統(tǒng)初始化的時候吧?
0
回復
@zlm943213
我做單片機有幾年,看了你的發(fā)言,我還是不明白你的意思,在程序里有延時的,如何用定時器來替代?能說具體點嗎?我非常想知道,謝謝!
我的意思是說,用軟件延時意味著不能執(zhí)行其他非中斷的操作,如果這期間需要控制其他操作怎么辦?用中斷嗎?用定時器就不會有這個問題,使用循環(huán)掃描查看可能需要執(zhí)行的操作(內(nèi)部計時也是操作list中的一個),象這種需要延時的操作在執(zhí)行條件中加入時間限制就可以了.
不知道我說清楚了沒有?定時器是用來產(chǎn)生內(nèi)部計時的時基的.譬如說這個程序,要產(chǎn)生10ms的延時,用定時器作一個1ms的定時中斷,每次中斷相應變量加1,在程序執(zhí)行時判斷到變量值到10才允許繼續(xù),否則回到主循環(huán)等待下次掃描.
其實我說的只在需要同時進行多種操作時才有用,涉及到任務調(diào)度的問題.我是在RTOS介紹中看到的.你可以找本RTOS的書看看,相信你以前一定看過不少吧?不知道你們是怎樣完成實時任務調(diào)度的?可以介紹一下嗎?
謝謝!
不知道我說清楚了沒有?定時器是用來產(chǎn)生內(nèi)部計時的時基的.譬如說這個程序,要產(chǎn)生10ms的延時,用定時器作一個1ms的定時中斷,每次中斷相應變量加1,在程序執(zhí)行時判斷到變量值到10才允許繼續(xù),否則回到主循環(huán)等待下次掃描.
其實我說的只在需要同時進行多種操作時才有用,涉及到任務調(diào)度的問題.我是在RTOS介紹中看到的.你可以找本RTOS的書看看,相信你以前一定看過不少吧?不知道你們是怎樣完成實時任務調(diào)度的?可以介紹一下嗎?
謝謝!
0
回復
@zhljb
我的意思是說,用軟件延時意味著不能執(zhí)行其他非中斷的操作,如果這期間需要控制其他操作怎么辦?用中斷嗎?用定時器就不會有這個問題,使用循環(huán)掃描查看可能需要執(zhí)行的操作(內(nèi)部計時也是操作list中的一個),象這種需要延時的操作在執(zhí)行條件中加入時間限制就可以了.不知道我說清楚了沒有?定時器是用來產(chǎn)生內(nèi)部計時的時基的.譬如說這個程序,要產(chǎn)生10ms的延時,用定時器作一個1ms的定時中斷,每次中斷相應變量加1,在程序執(zhí)行時判斷到變量值到10才允許繼續(xù),否則回到主循環(huán)等待下次掃描.其實我說的只在需要同時進行多種操作時才有用,涉及到任務調(diào)度的問題.我是在RTOS介紹中看到的.你可以找本RTOS的書看看,相信你以前一定看過不少吧?不知道你們是怎樣完成實時任務調(diào)度的?可以介紹一下嗎?謝謝!
我知道你所說的,平常寫程序基本上也是這么寫的,一般不使用延時,但是有的時候還非使用不可,比如DS1820讀寫操作時(這個例子可能不怎么恰當),需要等待的時間較長,畢竟延時很耗時間,這樣的程序有辦法使用定時器嗎?或使用其它好辦法?我很想知道答案,希望大家共同探討.
0
回復
@zlm943213
我知道你所說的,平常寫程序基本上也是這么寫的,一般不使用延時,但是有的時候還非使用不可,比如DS1820讀寫操作時(這個例子可能不怎么恰當),需要等待的時間較長,畢竟延時很耗時間,這樣的程序有辦法使用定時器嗎?或使用其它好辦法?我很想知道答案,希望大家共同探討.
我沒有用過DS1820,不清楚具體情況怎么樣,但是我想的話,一般對片外元件進行讀寫都需要延時,但是實際上延時不是為了延時而延時,只是在等待片外元件進入到可操作狀態(tài),一般當它可以進行操作的時候,都會有相應的狀態(tài)標志,所以在掃描任務時檢測一下應該就可以了.重申一下,我不知道DS1820是什么東東,如果說得離譜,請勿見笑.
我想了解一下DS1820的一些資料,還有你們現(xiàn)在用DS1820是怎樣完成延時的,用軟件延時嗎?請指教.
我想了解一下DS1820的一些資料,還有你們現(xiàn)在用DS1820是怎樣完成延時的,用軟件延時嗎?請指教.
0
回復
@zhljb
我沒有用過DS1820,不清楚具體情況怎么樣,但是我想的話,一般對片外元件進行讀寫都需要延時,但是實際上延時不是為了延時而延時,只是在等待片外元件進入到可操作狀態(tài),一般當它可以進行操作的時候,都會有相應的狀態(tài)標志,所以在掃描任務時檢測一下應該就可以了.重申一下,我不知道DS1820是什么東東,如果說得離譜,請勿見笑.我想了解一下DS1820的一些資料,還有你們現(xiàn)在用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
還是沒搞清楚你加入延時的目的,是為了等待溫度掃描結(jié)束,還是說采樣頻率只需要約2K就夠了?從程序中看DS1820應該是按位送出采樣溫度的數(shù)值,那么你是怎么保證每次開始讀的數(shù)據(jù)是一個完整的字節(jié)的第0位?還有需要問一下的是,你這個程序是不是只需要完成定時掃描溫度這一項任務?如果沒有別的任務,只需要讀出溫度再轉(zhuǎn)送出去,我認為是沒有問題的.
0
回復
@zhljb
還是沒搞清楚你加入延時的目的,是為了等待溫度掃描結(jié)束,還是說采樣頻率只需要約2K就夠了?從程序中看DS1820應該是按位送出采樣溫度的數(shù)值,那么你是怎么保證每次開始讀的數(shù)據(jù)是一個完整的字節(jié)的第0位?還有需要問一下的是,你這個程序是不是只需要完成定時掃描溫度這一項任務?如果沒有別的任務,只需要讀出溫度再轉(zhuǎn)送出去,我認為是沒有問題的.
我贊同你的觀點,但是如果始終不夠怎么辦,難道需要外部時鐘嗎?可這樣又增加了成本和體積.我覺得看你用在什么場合,如果不是對實時性要求很高的場合我覺得軟件延時對于初學者來說是不錯的,畢竟簡單.
0
回復
@zhljb
完全同意你的意見.需要考慮用途和成本壓力.對于學習來說,軟件延時確實好用.
還是沒搞清楚你加入延時的目的,是為了等待溫度掃描結(jié)束,還是說采樣頻率只需要約2K就夠了?從程序中看DS1820應該是按位送出采樣溫度的數(shù)值,那么你是怎么保證每次開始讀的數(shù)據(jù)是一個完整的字節(jié)的第0位?
zlm943213回:
DS1820讀寫操作不只這么簡單,我只不過簡單的寫一點.因為DS1820是單總線,所以讀寫操作必須有時間等待(CPU等DS1820或DS1820等CPU),最長的大約1MS,我想表達的就是有沒有辦法使用定時查詢的辦法來對DS1820進行操作,而不要用死等待.
zlm943213回:
DS1820讀寫操作不只這么簡單,我只不過簡單的寫一點.因為DS1820是單總線,所以讀寫操作必須有時間等待(CPU等DS1820或DS1820等CPU),最長的大約1MS,我想表達的就是有沒有辦法使用定時查詢的辦法來對DS1820進行操作,而不要用死等待.
0
回復