這是我根據頻率計程式修的
//用定時計數器1作為脈衝計數器(P3.5引腳正是輸入功能),定時器0作為定時器用,定時50ms產生中斷
//中斷4次後(即0.2s)讀計數器1的資料
#include
#define uint unsigned int
#define uchar unsigned char
//定義以I/O口的功能
sbit rs=P1^3;//液晶屏寫選擇,0命令 1資料
sbit rw=P1^4;//液晶屏讀寫選擇
sbit lcden=P1^5;//液晶屏使能
#define db P2 //定義P2為資料輸出口,寫資料時用db代替P2,增加液晶屏程式的通用性
//更改硬體接線時,只更改此處,而不必去更改液晶屏讀寫子程式
uchar aa;//計中斷次數
uint bb,cc,dd;//儲存計數器的值
void Delay1ms(unsigned int i) //1ms延時程式
{
unsigned int j;
for(;i>0;i--)
for(j=0;j
{;}
}
void init()//初始化設定
TMOD=0x51;//定時器1作為計數器,定時器0作為定時器用
TH1=0;//計數器清0
TL1=0;
EA=1;//開總中斷
ET0=1;//允許定時器0中斷
TH0=0x4c;
TL0=0x5c;
TR1=1;//啟動計數器
TR0=1;//啟動定時器
aa=0;
void write_com(uchar com)//向液晶屏寫命令
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
void write_date(uchar date)//向液晶屏寫資料
db=date;
rs=1;
void init2()//液晶屏初始化
rw=0;
write_com(0x38);//顯示模式16字*2行,5*7點陣,資料口8位
write_com(0x0f);//開顯示,顯示游標,游標閃爍
write_com(0x06);//寫完資料後資料指標和游標位置自動加1
write_com(0x01);//螢幕清除
void display4(unsigned int number) //單行多位顯示程式
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分離出十萬,萬,千,百,十,個
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;
write_com(0x80);//第1個數據的位置設定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//寫資料
write_date(0x30+A2);
write_date(0x30+A3);
write_date(0x30+A4);
write_date(0x30+A5);
void main()//主程式很簡單
init();//初始化
while(1)//迴圈程式
dd=bb*256+cc;//0.2S的計數值
display4(dd);//顯示
Delay1ms(100); //延時
void timer0()interrupt 1//注意:定時器0的中斷序號為1
aa++;
if(aa==4)//中斷4次,共0.2S
TR1=0;//暫停計數
bb=TH1;//讀出計數器資料
cc=TL1;
TL1=0;//計數器清0
TH1=0;
TR1=1;//重新啟動計數器
這是我根據頻率計程式修的
//用定時計數器1作為脈衝計數器(P3.5引腳正是輸入功能),定時器0作為定時器用,定時50ms產生中斷
//中斷4次後(即0.2s)讀計數器1的資料
#include
#define uint unsigned int
#define uchar unsigned char
//定義以I/O口的功能
sbit rs=P1^3;//液晶屏寫選擇,0命令 1資料
sbit rw=P1^4;//液晶屏讀寫選擇
sbit lcden=P1^5;//液晶屏使能
#define db P2 //定義P2為資料輸出口,寫資料時用db代替P2,增加液晶屏程式的通用性
//更改硬體接線時,只更改此處,而不必去更改液晶屏讀寫子程式
uchar aa;//計中斷次數
uint bb,cc,dd;//儲存計數器的值
void Delay1ms(unsigned int i) //1ms延時程式
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j
{;}
}
}
void init()//初始化設定
{
TMOD=0x51;//定時器1作為計數器,定時器0作為定時器用
TH1=0;//計數器清0
TL1=0;
EA=1;//開總中斷
ET0=1;//允許定時器0中斷
TH0=0x4c;
TL0=0x5c;
TR1=1;//啟動計數器
TR0=1;//啟動定時器
aa=0;
}
void write_com(uchar com)//向液晶屏寫命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void write_date(uchar date)//向液晶屏寫資料
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void init2()//液晶屏初始化
{
rw=0;
write_com(0x38);//顯示模式16字*2行,5*7點陣,資料口8位
Delay1ms(10*12);
write_com(0x0f);//開顯示,顯示游標,游標閃爍
Delay1ms(10*12);
write_com(0x06);//寫完資料後資料指標和游標位置自動加1
Delay1ms(10*12);
write_com(0x01);//螢幕清除
Delay1ms(10*12);
}
void display4(unsigned int number) //單行多位顯示程式
{
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分離出十萬,萬,千,百,十,個
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;
write_com(0x80);//第1個數據的位置設定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//寫資料
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
}
void main()//主程式很簡單
{
init();//初始化
while(1)//迴圈程式
{
dd=bb*256+cc;//0.2S的計數值
display4(dd);//顯示
Delay1ms(100); //延時
}
}
void timer0()interrupt 1//注意:定時器0的中斷序號為1
{
aa++;
TH0=0x4c;
TL0=0x5c;
if(aa==4)//中斷4次,共0.2S
{
TR1=0;//暫停計數
aa=0;
bb=TH1;//讀出計數器資料
cc=TL1;
TL1=0;//計數器清0
TH1=0;
TR1=1;//重新啟動計數器
}
}