只改了 P0=com;//送入数据,P0=dat;//送入数据 改完不显示,初学,请哥哥们指教?
[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液晶显示器数据命令端
sbit EN=P2^7;//定义LCD1602液晶显示器使能端
sbit qiting=P3^0;//定义启停按键
uchar qitingnum;//定义启停次数变量
uint count;//定时器0定时中断次数变量
unsigned long speed=0;//定义速度变量
uchar code tab1[]={"RPM:"};//显示转速的固定大写字符
uchar code tab2[]={"rpm/sec"};//显示转速的固定小写字符
/**ms级延时子程序**/
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
/********液晶写入指令函数与写入数据函数**************/
void write_1602com(uchar com)//****液晶写入指令函数****
{
RS=0;//数据/指令选择置为指令
P0=com;//送入数据 *******************************这个我改成了P1
delay(1);
EN=1;//拉高使能端,为制造有效的下降沿做准备。
delay(1);
EN=0;//en由高变低,产生下降沿,液晶执行命令。
}
void write_1602dat(uchar dat)//液晶写入数据函数
{
RS=1;//数据/指令选择置为数据
P0=dat;//送入数据 *******************************这个我改成了P1
delay(1);
EN=1; //en置高电平,为制造下降沿做准备。
delay(1);
EN=0; //en由高变低,产生下降沿,液晶执行命。
}
void lcd1602_init()//液晶初始化函数
{
uchar a;
RW=0;
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据。
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移。
write_1602com(0x01);//清显示
write_1602com(0x80);//显示固定符号从第一行第0个(从第0个开始数)位置开始显示
for(a=0;a<4;a++)
{
write_1602dat(tab1[a]);//向液晶屏写固定符号部分
}
write_1602com(0x80+9);//显示固定符号写入位置,从第一行第9个(从第0个开始数)位置开始显示。
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//写显示固定符号
}
}
/*************转速显示函数**********/
void display(unsigned long speed)//转速显示函数
{
if(speed<=99999)
{
uchar wan,qian,bai,shi,ge;//定义拆字变量
wan=speed/10000;//转速/10000得到万位
qian=speed%10000/1000;//转速/10000的余数/1000得到千位
bai=speed%1000/100;//取得百位
shi=speed%100/10;//取得十位数字
ge=speed%10;//取得个位数字
write_1602com(0x80+4);//从第一行第4个(从第0个开始数)位置开始显示
if(wan==0)//万位为0时
{
write_1602dat(' ');//显示空格
}
else//万位不为0时
{
write_1602dat(0x30+wan);//显示万位的数据,+0x30是因为在液晶的字库中,0的地址是0x30,1的地址是0x31,以此类推。
}
if((wan+qian)==0)//万位和千位都为0时
{
write_1602dat(' ');//千位显示空格
}
else//万位和千位不都为0时
{
write_1602dat(0x30+qian);//显示千位数据
}
if((wan+qian+bai)==0)//万位、千位和百位都是0时
{
write_1602dat(' ');//显示空格
}
else//万位、千位和百位不都为0时
{
write_1602dat(0x30+bai);//显示百位数据
}
if((wan+qian+bai+shi)==0)//万位、千位、百位和十位都为0时
{
write_1602dat(' ');//显示空格
}
else//万位、千位、百位和十位不都为0时
{
write_1602dat(0x30+shi);//显示十位数据
}
write_1602dat(0x30+ge);//显示个位数据,数字+0x30得到该数字的LCD1602显示码。
}
}
/**************按键扫描函数*****************/
void keyscan()//按键扫描函数
{
if(qiting==0)//判断启停键是否按下
{
delay(5);
if(qiting==0)//判断启停键是否再次按下
{
qitingnum++;//启停次数变量加加
lcd1602_init();//LCD1602液晶显示器初始化函数
while(!qiting);//等待启停键松开
}
}
if(qitingnum==1)//判断启停次数变量是否为1
{
display(speed);//显示速度函数
}
if(qitingnum==2)//判断启停次数变量是否为2
{
write_1602com(0x08);//关LCD1602液晶显示器显示
qitingnum=0;//启停次数变量置0
}
}
/**********定时器0、计数器1初始化子程序*********/
void Time0_Time1_init()
{
TMOD=0X51;//模式选定时器0、计数器1,工作方式选定时器0定时模式1、计数器1计数模式1。
TH0=(65536-50000)/256;//定时器0高8位定时50毫秒
TL0=(65536-50000)%256;//定时器0低8位定时50毫秒
TH1=0;//计数器1高8位计数初值为0
TL1=0;//计数器1低8位计数初值为0
EA=1;//打开总中断
ET0=1;//打开定时器0的中断
TR0=1;//打开定时器0
ET1=1;//打开计数器1的中断
TR1=1;//打开计数器1
}
/************主函数***************/
void main()//主函数
{
Time0_Time1_init();//定时器0与外部中断0初始化子程序
while(1)//固定循环
{
keyscan();
}
}
/**定时器0中断服务子程序**/
void Timer0() interrupt 1
{
TH0=(65536-50000)/256;//重装定时器0高8位定时50毫秒
TL0=(65536-50000)%256;//重装定时器0低8位定时50毫秒
count++;//定时器0定时中断次数变量加加
if(count==20)//判断定时器0定时中断次数变量是否等于20,即1秒钟。
{
count=0;//定时器0定时中断次数变量清0
TR1=0;//关计数器1,开始统计1秒钟内,霍尔元件发送的脉冲个数。
speed=TH1*256+TL1;//表示计数器1计数霍尔元件发送的脉冲个数,即转速:转/秒。
TH1=0;//计数器1高8位计数清0,为了下一次计数。
TL1=0;//计数器1低8位计数0,为了下一次计数。
TR1=1;//开计数器1,为了下一次统计1秒钟内,霍尔元件发送的脉冲个数。
}
}[/code]
|