这是我的代码:
如下:改改
#include<reg52.h>
#include "intrins.h"
#include "delay.h"
#include"Drive_parallel.h"
#define uint8 unsigned char //宏定义
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
#define DataPort P0 //数据口
sbit bianmaqiZ=P1^3; //编码器Z线
sbit fuwei=P3^5; //复位口
sbit BMQshuruB=P3^2; //输入口接编码器B线
sbit DIR=P3^3; //比较口接编码器A线
int i,count;
long bianma;//编码
uchar code line1_data[]={" 编码器测试 "};
uchar code line2_data[]={"计数: "};
///////////////////////////////////////
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1) {X=0x80;}
else if (X==2) {X=0x90;}
else if (X==3) {X=0x88;}
else if (X==4) {X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
///////////////////////////////////////
void display() // 开机页面
{
lcd_clr();
lcd_pos(1,0);
for(i=0;i<16;i++)
{
lcd_wdat(line1_data[i]);
delay_ms(1);
}
lcd_pos(3,0);
for(i=0;i<16;i++)
{
lcd_wdat(line2_data[i]);
delay_ms(1);
}
}
void bianma_display() //显示计数
{
lcd_pos(3,4);
lcd_wdat(bianma/10000%10+0x30);
lcd_wdat(bianma/1000%10+0x30);
lcd_wdat(bianma/100%10+0x30);
lcd_wdat(bianma/10%10+0x30);
lcd_wdat(bianma%10+0x30);
}
////////////////////////////////////////////
void main()
{
lcd_init();//初始化
lcd_clr(); //清屏
display(); //开机页面
bianma=0;
EA=1; //开总中断
EX0=1; //外部中断0打开
IT0=1; //等于0为电平触发方式,低电平有效,等于1为脉冲触发方式,下降沿有效.
while(1)
{
if(!fuwei||bianma>999000||bianma<0)
{
bianma=0;bianmaqiZ=0;
bianma_display();
}
bianma_display();
}
}
/*中断函数,编码器AB进入单片机时要通过高速光耦隔离,
INT0与INT1口10K上拉电阻接+5V*/
void int0() interrupt 0
{
EX0=0;//外部中断0关闭//等于0为电平触发方式,低电平有效,等于1为脉冲触发方式,下降沿有效,
if(DIR){count--; }//中断计数---正转时,A为下降沿,B为高电平
else count++;
if(!BMQshuruB)bianma++; //中断计数---反转时,A为下降沿,B为低电平
EX0=1;//外部中断0打开
}
|