void delay(uint z);//延時,1微妙時間有點短
十載的高邑網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網站的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整高邑建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯公司從事“高邑網站設計”,“高邑網站推廣”以來,每個客戶項目都認真落實執行。
你看看下面我做的程序,在2051+12M晶振通過你可以套用這個程序,不行的話就改長延時
/******************AT89S51使用12M晶振*******************/
//LCD腳接法,根據實際接法定義
#define LCM_D4_RS P3_2//第4腳數據/命令
#define LCM_D5_RW P3_5//第5腳讀/寫
#define LCM_D6_E P3_7//第6腳使能
#define LCM_D16_BLK P3_0//背光負極
#define LCM_D7_Data P1//第7-14腳數據
//LCD腳接法,根據實際接法定義
#define Busy 0x80 //用于檢測LCM狀態字中的Busy標識
#define _LCD_BIT_IS 4 //CPU與LCD1602間使用DB7-DB4這4根數據線進行傳輸
#include at89x51.h //頭文件
#include string.h //strlen()函數頭文件
void LCMInit(void); //LCM初始化化
void WriteDataLCM(unsigned char WDLCM); //寫數據
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); //讀狀態
unsigned char code Greetings_Line1[] = {"Welcome Control"};
unsigned char code Greetings_Line2[] = {" ChuLong Make "};
data unsigned char cou = 0; // 定義軟計數器,放在程序最前面的寄存器定義部分
void main(void)
{
LCMInit(); //LCM初始化
LCM_D16_BLK = 0; //開背光燈
TMOD = 0x11; // 定時/計數器0,1工作于方式1 16位定時
TH0 = 0x3c; // 預置產生50ms時基信號
TL0 = 0xb0;
EA = 1; // 開總中斷
ET0 = 1; // 定時/計數器0允許中斷
TR0 = 1; // 開定時/計數器0
DisplayListChar(0, 0, Greetings_Line1);
DisplayListChar(0, 1, Greetings_Line2);
// while(1);
}
//
void LCMInit(void) //LCM初始化
{
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
#if(_LCD_BIT_IS == 8) //CPU與LCD1602間使用DB0-DB8這8根數據線進行傳輸
WriteCommandLCM(0x38,1); //顯示8位模式設置,開始要求每次檢測忙信號
#else //CPU與LCD1602間使用DB0-DB4這4根數據線進行傳輸
WriteCommandLCM(0x28,1); //顯示4位模式設置,開始要求每次檢測忙信號
#endif
WriteCommandLCM(0x08,1); //關閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示光標移動設置
WriteCommandLCM(0x0C,1); // 顯示開及光標設置
}
//寫數據
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
LCM_D4_RS = 1;
LCM_D5_RW = 0;
#if(_LCD_BIT_IS == 8) //CPU與LCD1602間使用DB0-DB8這8根數據線進行傳輸
{
LCM_D7_Data = WDLCM;
}
#else //CPU與LCD1602間使用DB0-DB4這4根數據線進行傳輸
{
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(); //根據需要檢測忙
LCM_D4_RS = 0;
LCM_D5_RW = 0;
#if(_LCD_BIT_IS == 8) //CPU與LCD1602間使用DB7-DB4這4根數據線進行傳輸
{
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;
}
//讀狀態
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; //當要顯示第二行時地址碼+0x40;
X |= 0x80; //算出指令碼
WriteCommandLCM(X, 0); //這里不檢測忙信號,發送地址碼
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++) //若到達字串尾則退出
{
if (X = 0xF) //X坐標應小于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中斷服務程序(產生50ms時基信號)
if(cou 60)
{ // 計數值到1000(1s) (****時間為倒計時****)
cou = 0; // 軟計數器清零
}
cou++; // 軟計數器加1
TH0 = 0x3c; // 重置定時常數
TL0 = 0xb0;
}
我才學C。你說的我就能幫你搞個加減乘除運算了。以下是代碼。#includestdio.h
main()
{
int i=1,flag=0; float a,b,c; char v;
printf("輸入數字完成運算");
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++);
}
/*
************************************
*?函數名稱:lcd1602_CheckBusy()
*?函數功能:狀態查詢
************************************
*/
void?lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
*?函數名稱:?lcd1602_WriteCmd()
*?函數功能:寫命令
*?入口參數:命令字
*?出口參數:無
***************************************
*/
void?lcd1602_WriteCmd(const?uchar?cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
*?函數名稱:lcd1602_WriteData()
*?函數功能:寫數據
*?入口參數:c--待寫數據
*?出口參數:無
*********************************************
*/
void?lcd1602_WriteData(const?uchar?c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
*?函數名稱:lcd1602_Init()
*?函數功能:初始化LCD
*?入口參數:無
*?出口參數:無
***********************************************
*/
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
}
/*
************************************************
*?函數名稱:lcd1602_Display()
*?函數功能:?字符顯示
*?入口參數:ptr--字符或字符串指針
*?出口參數:無
*?說????明:用戶可通過以下方式來調用:
*???????????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;??//發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單片機是對所有兼容Intel 8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8031單片機,后來隨著Flash rom技術的發展,8031單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用于工業測控系統之中。很多公司都有51系列的兼容機型推出,今后很長的一段時間內將占有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。需要注意的是52系列的單片機一般不具備自編程能力。
寫一個函數把整型數據每位提取出來,就可以顯示每位數據了。
void display_tem(x,y,int getdata) //getdata就是你采集來的數據吧~~?
{
display_char(x,y,getdata/10);//我不知道你的溫度是幾位的整數~ 這里我
? ? ? ? ? ? ? ? ? ? ? ? //假設是兩位
? ? ? ? ? ? ? ? ? ? ? ?//display_char用你自己的字符顯示函數替代 ?
display_char(x+1,y,getdata%10);
}
當前名稱:1602顯示函數C語言 c++顯示函數
轉載注明:http://m.newbst.com/article22/ddieocc.html
成都網站建設公司_創新互聯,為您提供移動網站建設、動態網站、品牌網站設計、電子商務、網站策劃、用戶體驗
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯