只改了 P0=com;//送入數(shù)據(jù),P0=dat;//送入數(shù)據(jù) 改完不顯示,初學,請哥哥們指教?
[code]#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RW=P2^6;//定義LCD1602液晶顯示器讀寫端
sbit RS=P2^5;//定義LCD1602液晶顯示器數(shù)據(jù)命令端
sbit EN=P2^7;//定義LCD1602液晶顯示器使能端
sbit qiting=P3^0;//定義啟停按鍵
uchar qitingnum;//定義啟停次數(shù)變量
uint count;//定時器0定時中斷次數(shù)變量
unsigned long speed=0;//定義速度變量
uchar code tab1[]={"RPM:"};//顯示轉(zhuǎn)速的固定大寫字符
uchar code tab2[]={"rpm/sec"};//顯示轉(zhuǎn)速的固定小寫字符
/**ms級延時子程序**/
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
/********液晶寫入指令函數(shù)與寫入數(shù)據(jù)函數(shù)**************/
void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
{
RS=0;//數(shù)據(jù)/指令選擇置為指令
P0=com;//送入數(shù)據(jù) *******************************這個我改成了P1
delay(1);
EN=1;//拉高使能端,為制造有效的下降沿做準備。
delay(1);
EN=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令。
}
void write_1602dat(uchar dat)//液晶寫入數(shù)據(jù)函數(shù)
{
RS=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
P0=dat;//送入數(shù)據(jù) *******************************這個我改成了P1
delay(1);
EN=1; //en置高電平,為制造下降沿做準備。
delay(1);
EN=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命。
}
void lcd1602_init()//液晶初始化函數(shù)
{
uchar a;
RW=0;
write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)。
write_1602com(0x0c);//開顯示不顯示光標
write_1602com(0x06);//整屏不移動,光標自動右移。
write_1602com(0x01);//清顯示
write_1602com(0x80);//顯示固定符號從第一行第0個(從第0個開始數(shù))位置開始顯示
for(a=0;a<4;a++)
{
write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
}
write_1602com(0x80+9);//顯示固定符號寫入位置,從第一行第9個(從第0個開始數(shù))位置開始顯示。
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//寫顯示固定符號
}
}
/*************轉(zhuǎn)速顯示函數(shù)**********/
void display(unsigned long speed)//轉(zhuǎn)速顯示函數(shù)
{
if(speed<=99999)
{
uchar wan,qian,bai,shi,ge;//定義拆字變量
wan=speed/10000;//轉(zhuǎn)速/10000得到萬位
qian=speed%10000/1000;//轉(zhuǎn)速/10000的余數(shù)/1000得到千位
bai=speed%1000/100;//取得百位
shi=speed%100/10;//取得十位數(shù)字
ge=speed%10;//取得個位數(shù)字
write_1602com(0x80+4);//從第一行第4個(從第0個開始數(shù))位置開始顯示
if(wan==0)//萬位為0時
{
write_1602dat(' ');//顯示空格
}
else//萬位不為0時
{
write_1602dat(0x30+wan);//顯示萬位的數(shù)據(jù),+0x30是因為在液晶的字庫中,0的地址是0x30,1的地址是0x31,以此類推。
}
if((wan+qian)==0)//萬位和千位都為0時
{
write_1602dat(' ');//千位顯示空格
}
else//萬位和千位不都為0時
{
write_1602dat(0x30+qian);//顯示千位數(shù)據(jù)
}
if((wan+qian+bai)==0)//萬位、千位和百位都是0時
{
write_1602dat(' ');//顯示空格
}
else//萬位、千位和百位不都為0時
{
write_1602dat(0x30+bai);//顯示百位數(shù)據(jù)
}
if((wan+qian+bai+shi)==0)//萬位、千位、百位和十位都為0時
{
write_1602dat(' ');//顯示空格
}
else//萬位、千位、百位和十位不都為0時
{
write_1602dat(0x30+shi);//顯示十位數(shù)據(jù)
}
write_1602dat(0x30+ge);//顯示個位數(shù)據(jù),數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼。
}
}
/**************按鍵掃描函數(shù)*****************/
void keyscan()//按鍵掃描函數(shù)
{
if(qiting==0)//判斷啟停鍵是否按下
{
delay(5);
if(qiting==0)//判斷啟停鍵是否再次按下
{
qitingnum++;//啟停次數(shù)變量加加
lcd1602_init();//LCD1602液晶顯示器初始化函數(shù)
while(!qiting);//等待啟停鍵松開
}
}
if(qitingnum==1)//判斷啟停次數(shù)變量是否為1
{
display(speed);//顯示速度函數(shù)
}
if(qitingnum==2)//判斷啟停次數(shù)變量是否為2
{
write_1602com(0x08);//關(guān)LCD1602液晶顯示器顯示
qitingnum=0;//啟停次數(shù)變量置0
}
}
/**********定時器0、計數(shù)器1初始化子程序*********/
void Time0_Time1_init()
{
TMOD=0X51;//模式選定時器0、計數(shù)器1,工作方式選定時器0定時模式1、計數(shù)器1計數(shù)模式1。
TH0=(65536-50000)/256;//定時器0高8位定時50毫秒
TL0=(65536-50000)%256;//定時器0低8位定時50毫秒
TH1=0;//計數(shù)器1高8位計數(shù)初值為0
TL1=0;//計數(shù)器1低8位計數(shù)初值為0
EA=1;//打開總中斷
ET0=1;//打開定時器0的中斷
TR0=1;//打開定時器0
ET1=1;//打開計數(shù)器1的中斷
TR1=1;//打開計數(shù)器1
}
/************主函數(shù)***************/
void main()//主函數(shù)
{
Time0_Time1_init();//定時器0與外部中斷0初始化子程序
while(1)//固定循環(huán)
{
keyscan();
}
}
/**定時器0中斷服務(wù)子程序**/
void Timer0() interrupt 1
{
TH0=(65536-50000)/256;//重裝定時器0高8位定時50毫秒
TL0=(65536-50000)%256;//重裝定時器0低8位定時50毫秒
count++;//定時器0定時中斷次數(shù)變量加加
if(count==20)//判斷定時器0定時中斷次數(shù)變量是否等于20,即1秒鐘。
{
count=0;//定時器0定時中斷次數(shù)變量清0
TR1=0;//關(guān)計數(shù)器1,開始統(tǒng)計1秒鐘內(nèi),霍爾元件發(fā)送的脈沖個數(shù)。
speed=TH1*256+TL1;//表示計數(shù)器1計數(shù)霍爾元件發(fā)送的脈沖個數(shù),即轉(zhuǎn)速:轉(zhuǎn)/秒。
TH1=0;//計數(shù)器1高8位計數(shù)清0,為了下一次計數(shù)。
TL1=0;//計數(shù)器1低8位計數(shù)0,為了下一次計數(shù)。
TR1=1;//開計數(shù)器1,為了下一次統(tǒng)計1秒鐘內(nèi),霍爾元件發(fā)送的脈沖個數(shù)。
}
}[/code]
|