哪位高手幫我看一下程序。坑悬c(diǎn)錯(cuò)誤,我改不了。#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P0 //LCD數(shù)據(jù)總線(xiàn)
sbit LCD_RS = P2^0; //1-選擇數(shù)據(jù)選擇器 0-選擇指令選擇器
sbit LCD_RW = P2^1; //1-讀操作 0-寫(xiě)操作
sbit LCD_EN = P2^2; //LCD使能端
uchar line1[16] = {"NowSpeed= rps"};//顯示緩存
uchar line2[16] = {"RH= ,RL= rps"};
uint N; //定義計(jì)數(shù)器脈沖值
int Nmax=100,Nmin=40; //定義報(bào)警上下限
uchar T0_count=0;
//LCD 1602A子程序---------------------------------//
//延時(shí)子函數(shù)//
void delay_ms(int ms)
{
uchar y;
while(ms--)
{
for(y = 0; y<250; y++)
{ _nop_();_nop_();_nop_();_nop_(); }
}
}
//檢查L(zhǎng)CD忙狀態(tài),lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫(xiě)指令與數(shù)據(jù)//
bit lcd_busy()
{
bit result;
LCD_RS=0;LCD_RW=1; //忙標(biāo)志讀出
LCD_EN=1;
{_nop_();_nop_();_nop_();_nop_();_nop_();};//延遲5個(gè)機(jī)器周期
result=(bit)(LCD_DATA&0x80);
LCD_EN=0;
return(result);
}
//寫(xiě)指令數(shù)據(jù)到LCD---------------------------------//
//RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
void lcd_write_cmd(uchar cmd)
{
while(lcd_busy());
LCD_EN=0;
LCD_RS=0;LCD_RW=0;//指令寄存器寫(xiě)入
LCD_EN=1;
LCD_DATA=cmd; //寫(xiě)命令
LCD_EN=0;
}
//寫(xiě)顯示數(shù)據(jù)到LCD---------------------------------//
//RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。
void lcd_write_data(uchar dat)
{
while(lcd_busy());
LCD_EN=0;
LCD_RS=1;LCD_RW=0;//數(shù)據(jù)寄存器寫(xiě)入
LCD_EN=1;
LCD_DATA=dat; //寫(xiě)數(shù)據(jù)
LCD_EN=0;
}
//LCD初始化設(shè)定----------------------------------//
void lcd_init()
{
LCD_DATA=0;
delay_ms(10); //延時(shí)
lcd_write_cmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
delay_ms(5);
lcd_write_cmd(0x38); //重復(fù)寫(xiě)入,解決冷啟動(dòng)時(shí)的異常
delay_ms(5);
lcd_write_cmd(0x0c); //顯示開(kāi),關(guān)光標(biāo)
delay_ms(5);
lcd_write_cmd(0x06); //移動(dòng)光標(biāo)
delay_ms(5);
lcd_write_cmd(0x01); //清除LCD的顯示內(nèi)容
delay_ms(5);
}
//設(shè)定顯示位置-------------------------------------//
void lcd_pos(uchar pos)
{
lcd_write_cmd(pos | 0x80); //數(shù)據(jù)指針=80+地址變量
}
//LCD顯示-----------------------------------------//
display()
{
uchar m;
lcd_pos(0); //設(shè)置顯示位置為第一行第1個(gè)字符,00H-27H共40字符
for(m=0;m<16;m++)
lcd_write_data(line1[m]);
lcd_pos(0x40); //設(shè)置顯示位置為第二行第1個(gè)字符,40H-67H共40字符
for(m=0;m<16;m++)
lcd_write_data(line2[m]);
}
//LCD 1602A子程序結(jié)束-----------------------------//
//計(jì)算轉(zhuǎn)速并計(jì)算顯存值--------------------------------//
void compute_rps(uint N) // uint N; //0-65535
{
uint rps;
uchar num_array[3]={0};
uchar max_array[3]={0};
uchar min_array[3]={0};
uint num;
uchar i=0;
rps=N; //計(jì)算轉(zhuǎn)速值 r/s(轉(zhuǎn)/秒) rps=N/2 r/ 500 ms =N r/s */
num=rps;
//分離num(num為整數(shù))各位值的函數(shù),最低位放在array[0]----//
do{
num_array[i++]=num%10;
}while(num=num/10); //分號(hào)不能忽略!
i=0;
line1[10]=num_array[2]+0x30;
line1[11]=num_array[1]+0x30;
line1[12]=num_array[0]+0x30;
num=Nmax;
//分離num(num為整數(shù))各位值的函數(shù),最低位放在array[0]----
do{
max_array[i++]=num%10;
}while(num=num/10); //分號(hào)不能忽略!
i=0;
line2[3]=max_array[2]+0x30;
line2[4]=max_array[1]+0x30;
line2[5]=max_array[0]+0x30;
num=Nmin;
//分離num(num為整數(shù))各位值的函數(shù),最低位放在array[0]----
do{
min_array[i++]=num%10;
}while(num=num/10); //分號(hào)不能忽略!
i=0;
line2[10]=min_array[2]+0x30;
line2[11]=min_array[1]+0x30;
line2[12]=min_array[0]+0x30;
//定時(shí)器0中斷--------------------//
void timer0(void) interrupt 1
{
T0_count++;
TH0=0x3C;TL0=0xB0; //T0重置,50ms f0=12MHZ
scan();
if(T0_count>=10)
{
T0_count=0;
ET0=0; //關(guān)中斷開(kāi)關(guān)
TR0=0;TR1=0; //關(guān)T0,關(guān)T1
N=256*TH1+TL1; //統(tǒng)計(jì)50ms*10內(nèi)的脈沖數(shù)N
compute_rps(N);
display();
TH0=0x3C;TL0=0xB0; //T0重置,50ms f0=12MHz
TH1=0x00;TL1=0x00; //T1重置
ET0=1; //中斷開(kāi)關(guān)開(kāi)
TR0=1;TR1=1;
}
}
//主函數(shù)---------------------------//
main()
{
lcd_init(); //初始化LCD
TMOD=0x51; //設(shè)置定時(shí)器工作方式,即T0為16位定時(shí)器、T1為16位計(jì)數(shù)器。
// GATE C/T M1 M0 GATE C/T M1 M0
// 0 1 0 1 0 0 0 1
TH0=0x3C;TL0=0xB0; //T0初始化
TH1=0x00;TL1=0x00; //T1初始化
EA=1; //打開(kāi)總中斷
// EA - ET2 ES ET1 EX1 ET0 EX0
// 1 0 0 0 0 0 1 0
ET0=1; //允許T0中斷
TR0=1;TR1=1; //啟動(dòng)T0,T1
//TF1 TR1 TF0 TR0
// 1 1
while(1)
{
}
|