void delay(uint z);//延時,1微妙時間有點短
十載的高邑網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整高邑建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“高邑網(wǎng)站設(shè)計”,“高邑網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
你看看下面我做的程序,在2051+12M晶振通過你可以套用這個程序,不行的話就改長延時
/******************AT89S51使用12M晶振*******************/
//LCD腳接法,根據(jù)實際接法定義
#define LCM_D4_RS P3_2//第4腳數(shù)據(jù)/命令
#define LCM_D5_RW P3_5//第5腳讀/寫
#define LCM_D6_E P3_7//第6腳使能
#define LCM_D16_BLK P3_0//背光負(fù)極
#define LCM_D7_Data P1//第7-14腳數(shù)據(jù)
//LCD腳接法,根據(jù)實際接法定義
#define Busy 0x80 //用于檢測LCM狀態(tài)字中的Busy標(biāo)識
#define _LCD_BIT_IS 4 //CPU與LCD1602間使用DB7-DB4這4根數(shù)據(jù)線進(jìn)行傳輸
#include at89x51.h //頭文件
#include string.h //strlen()函數(shù)頭文件
void LCMInit(void); //LCM初始化化
void WriteDataLCM(unsigned char WDLCM); //寫數(shù)據(jù)
void WriteCommandLCM(unsigned char WCLCM,int BuysC); //寫指令
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); //5ms延時
unsigned char ReadStatusLCM(void); //讀狀態(tài)
unsigned char code Greetings_Line1[] = {"Welcome Control"};
unsigned char code Greetings_Line2[] = {" ChuLong Make "};
data unsigned char cou = 0; // 定義軟計數(shù)器,放在程序最前面的寄存器定義部分
void main(void)
{
LCMInit(); //LCM初始化
LCM_D16_BLK = 0; //開背光燈
TMOD = 0x11; // 定時/計數(shù)器0,1工作于方式1 16位定時
TH0 = 0x3c; // 預(yù)置產(chǎn)生50ms時基信號
TL0 = 0xb0;
EA = 1; // 開總中斷
ET0 = 1; // 定時/計數(shù)器0允許中斷
TR0 = 1; // 開定時/計數(shù)器0
DisplayListChar(0, 0, Greetings_Line1);
DisplayListChar(0, 1, Greetings_Line2);
// while(1);
}
//
void LCMInit(void) //LCM初始化
{
WriteCommandLCM(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
#if(_LCD_BIT_IS == 8) //CPU與LCD1602間使用DB0-DB8這8根數(shù)據(jù)線進(jìn)行傳輸
WriteCommandLCM(0x38,1); //顯示8位模式設(shè)置,開始要求每次檢測忙信號
#else //CPU與LCD1602間使用DB0-DB4這4根數(shù)據(jù)線進(jìn)行傳輸
WriteCommandLCM(0x28,1); //顯示4位模式設(shè)置,開始要求每次檢測忙信號
#endif
WriteCommandLCM(0x08,1); //關(guān)閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示光標(biāo)移動設(shè)置
WriteCommandLCM(0x0C,1); // 顯示開及光標(biāo)設(shè)置
}
//寫數(shù)據(jù)
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
LCM_D4_RS = 1;
LCM_D5_RW = 0;
#if(_LCD_BIT_IS == 8) //CPU與LCD1602間使用DB0-DB8這8根數(shù)據(jù)線進(jìn)行傳輸
{
LCM_D7_Data = WDLCM;
}
#else //CPU與LCD1602間使用DB0-DB4這4根數(shù)據(jù)線進(jìn)行傳輸
{
LCM_D7_Data = 0x0f; //清高四位
LCM_D7_Data |= WDLCM 0xf0; //寫高四位
LCM_D6_E = 0;
LCM_D6_E = 1;
WDLCM = WDLCM 4; //低四位移到高四位
LCM_D7_Data = 0x0f; //清高四位
LCM_D7_Data |= WDLCM 0xf0; //寫低四位
}
#endif
LCM_D6_E = 0;
LCM_D6_E = 1;
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM,int BuysC) //BuysC為0時忽略忙檢測
{
if(BuysC)
ReadStatusLCM(); //根據(jù)需要檢測忙
LCM_D4_RS = 0;
LCM_D5_RW = 0;
#if(_LCD_BIT_IS == 8) //CPU與LCD1602間使用DB7-DB4這4根數(shù)據(jù)線進(jìn)行傳輸
{
LCM_D7_Data = WCLCM;
}
#else
{
LCM_D7_Data = 0x0f; //清高四位
LCM_D7_Data |= WCLCM 0xf0; //寫高四位
LCM_D6_E = 0;
LCM_D6_E = 1;
WCLCM = WCLCM 4; //低四位移到高四位
LCM_D7_Data = 0x0f; //清高四位
LCM_D7_Data |= WCLCM 0xf0; //寫低四位
}
#endif
LCM_D6_E = 0;
LCM_D6_E = 1;
}
//讀狀態(tài)
unsigned char ReadStatusLCM(void)
{
LCM_D7_Data = 0xff;
LCM_D4_RS = 0;
LCM_D5_RW = 1;
LCM_D6_E = 1;
while (LCM_D7_Data Busy); //檢測忙信號
return(LCM_D7_Data);
}
//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y = 0x1;
X = 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
X |= 0x80; //算出指令碼
WriteCommandLCM(X, 0); //這里不檢測忙信號,發(fā)送地址碼
WriteDataLCM(DData);
}
//按指定位置顯示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
int ListLength;
Y = 0x1;
X = 0xF; //限制X不能大于15,Y不能大于1
for(ListLength = 0;ListLength strlen(DData);ListLength++) //若到達(dá)字串尾則退出
{
if (X = 0xF) //X坐標(biāo)應(yīng)小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
X++;
}
}
}
//5ms延時
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//10s延時
void tiem0(void) interrupt 1
{ // T/C0中斷服務(wù)程序(產(chǎn)生50ms時基信號)
if(cou 60)
{ // 計數(shù)值到1000(1s) (****時間為倒計時****)
cou = 0; // 軟計數(shù)器清零
}
cou++; // 軟計數(shù)器加1
TH0 = 0x3c; // 重置定時常數(shù)
TL0 = 0xb0;
}
我才學(xué)C。你說的我就能幫你搞個加減乘除運算了。以下是代碼。#includestdio.h
main()
{
int i=1,flag=0; float a,b,c; char v;
printf("輸入數(shù)字完成運算");
scanf("%f%c%f",a,v,b);
while(v!='#')
{ switch(v)
{ case '+':c=a+b;break;
case '-':c=a-b;break;
case '*':c=a*b;break;
case '/':
if(b==0) flag=1;
else c=a/b; break;
default: flag=2;
}
if(flag==0)
{
printf("%f%c%f=%f\n",a,v,b,c);
i++;
}
if(flag==1) printf("shucuole");
if(flag==2) printf("zifucuole");
printf("jixushuchu");
scanf("%f%c%f",a,v,b);
}
}我是個新手。但可以保證代碼的正確
#define?LCD1602_FLAG
#define?LCD1602_PORT?P0
#includereg51.h
#includestddef.h
#define?uchar?unsigned?char
sbit?lcd1602_rs=P2^0;
sbit?lcd1602_e=P2^2;
sbit?lcd1602_rw=P2^1;
sbit?lcd1602_busy=P0^7;
uchar?str[]="This?is?Key?Test";
uchar?keyval,keystr[16];
void?delay(uchar?a)
{
uchar?i;
while(a--)for(i=0;i120;i++);
}
/*
************************************
*?函數(shù)名稱:lcd1602_CheckBusy()
*?函數(shù)功能:狀態(tài)查詢
************************************
*/
void?lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
*?函數(shù)名稱:?lcd1602_WriteCmd()
*?函數(shù)功能:寫命令
*?入口參數(shù):命令字
*?出口參數(shù):無
***************************************
*/
void?lcd1602_WriteCmd(const?uchar?cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
*?函數(shù)名稱:lcd1602_WriteData()
*?函數(shù)功能:寫數(shù)據(jù)
*?入口參數(shù):c--待寫數(shù)據(jù)
*?出口參數(shù):無
*********************************************
*/
void?lcd1602_WriteData(const?uchar?c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
*?函數(shù)名稱:lcd1602_Init()
*?函數(shù)功能:初始化LCD
*?入口參數(shù):無
*?出口參數(shù):無
***********************************************
*/
void?lcd1602_Init()
{
lcd1602_WriteCmd(0x38); //顯示模式為8位2行5*7點陣
lcd1602_WriteCmd(0x0c);?//display?enable,flag?enable,flash?enable,
lcd1602_WriteCmd(0x06);?//flag?move?to?right,screen?don't?move
lcd1602_WriteCmd(0x01);?//clear?screen
}
/*
************************************************
*?函數(shù)名稱:lcd1602_Display()
*?函數(shù)功能:?字符顯示
*?入口參數(shù):ptr--字符或字符串指針
*?出口參數(shù):無
*?說????明:用戶可通過以下方式來調(diào)用:
*???????????1)lcd1602_Display("Hello,world!");
*???????????2)?INT8U?存儲類型?txt[]="要顯示的字符串";
*??????????????或者?INT8U?存儲類型?txt[]={'t','x','t',..,'\0'};
*??????????????INT8U?*ptr;
*??????????????ptr=txt;
*??????????????lcd1602_Display(ptr);
*??????????????或?lcd1602_Display(txt);
*??????????????或?lcd1602_Display(txt);
************************************************
*/
void?lcd1602_Display(const?uchar?*ptr,uchar?line)
{
uchar?data?i=0;
uchar?*data?q;
q=ptr;
switch(line)
{
case?0:
lcd1602_WriteCmd(0x80);
while(q!=NULL??(*q!='\0')??i16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
case?1:
lcd1602_WriteCmd(0xc0);
while(q!=NULL??(*q!='\0')??i16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
}
}
uchar?kbscan(void)
{
unsigned?char?sccode,recode;
P3=0x0f;??//發(fā)0掃描,列線輸入
if?((P3??0x0f)?!=?0x0f)??//有鍵按下
{
delay(20);???//延時去抖動
if?((P30x0f)!=?0x0f)
{
sccode?=?0xef;????//逐行掃描初值
while((sccode0x01)!=0)
{
P3=sccode;
if((P30x0f)!=0x0f)
{
recode=(P30x0f)|0xf0;
while((P30x0f)!=0x0f);//等待鍵抬起
return((~sccode)+(~recode));
?}
else
sccode=(sccode1)|0x01;
}
}
}
return?0;??//無鍵按下,返回0
}
uchar?getkey(void)
{
uchar?key;
key=kbscan();
if(key==0){keyval=0xff;return(0);}
switch(key)
{
case?0x11:keyval=7;break;
case?0x12:keyval=4;break;
case?0x14:keyval=1;break;
case?0x18:keyval=10;break;
case?0x21:keyval=8;break;
case?0x22:keyval=5;break;
case?0x24:keyval=2;break;
case?0x28:keyval=0;break;
case?0x41:keyval=9;break;
case?0x42:keyval=6;break;
case?0x44:keyval=3;break;
case?0x48:keyval=11;break;
case?0x81:keyval=12;break;
case?0x82:keyval=13;break;
case?0x84:keyval=14;break;
case?0x88:keyval=15;break;
default:keyval=0xff;break;
}
if(keyval!=0xff)return(1);
else?return(0);
}
main()
{
uchar?num;
lcd1602_Init();
lcd1602_Display(str,0);
while(1)
{
if(getkey())
{
keystr[num]=keyval+0x30;
lcd1602_Display(keystr,1);
num++;
num%=16;
}
}
}
51單片機(jī)是對所有兼容Intel 8031指令系統(tǒng)的單片機(jī)的統(tǒng)稱。該系列單片機(jī)的始祖是Intel的8031單片機(jī),后來隨著Flash rom技術(shù)的發(fā)展,8031單片機(jī)取得了長足的進(jìn)展,成為應(yīng)用最廣泛的8位單片機(jī)之一,其代表型號是ATMEL公司的AT89系列,它廣泛應(yīng)用于工業(yè)測控系統(tǒng)之中。很多公司都有51系列的兼容機(jī)型推出,今后很長的一段時間內(nèi)將占有大量市場。51單片機(jī)是基礎(chǔ)入門的一個單片機(jī),還是應(yīng)用最廣泛的一種。需要注意的是52系列的單片機(jī)一般不具備自編程能力。
寫一個函數(shù)把整型數(shù)據(jù)每位提取出來,就可以顯示每位數(shù)據(jù)了。
void display_tem(x,y,int getdata) //getdata就是你采集來的數(shù)據(jù)吧~~?
{
display_char(x,y,getdata/10);//我不知道你的溫度是幾位的整數(shù)~ 這里我
? ? ? ? ? ? ? ? ? ? ? ? //假設(shè)是兩位
? ? ? ? ? ? ? ? ? ? ? ?//display_char用你自己的字符顯示函數(shù)替代 ?
display_char(x+1,y,getdata%10);
}
當(dāng)前名稱:1602顯示函數(shù)C語言 c++顯示函數(shù)
轉(zhuǎn)載注明:http://jinyejixie.com/article22/ddieocc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計、電子商務(wù)、網(wǎng)站策劃、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)