我用P3^2脚接编码器A相,P3^4脚接编码器B相,当A相有下降沿的时候,进入外部中断,若此时B相为高电平,则变量加1,若此时B相为低电平,则变量减1,最后将变量用1602显示出来 但是在显示的时候偏偏第2行的前面4个数显示不出来,总是一闪一闪,然后显示的都不是数来的。麻烦帮我看一下!
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code welcome [16]={"0123456789123456"};//定义第一行显示数组
uchar idata lcdtimer [16]={"0123456789123456"};//定义第二行显示数组
***it key=P3^4;
int number,m,i,t,w,n,k;
uchar a1,a2,a0,a3;
bit timeflag;
***it RS = P2^4;//Pin4
***it RW = P2^5; //Pin5
***it E = P2^6;//Pin6
#define Data P0 //数据端口
//软件延时函数
void DelayMs(unsigned int de1)
{
uchar del2;
for(;de1>0;de1--)
for(del2=10;del2>0;del2--);
}void WriteCommand(unsigned char c)
{
DelayMs(200);//short delay before operation
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
//向液晶显示器写数据函数?
void WriteData(unsigned char c)
{
DelayMs(200); //short delay before operation
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
//向液晶显示器写入显示数据函数
void disp_lcd(uchar addr,uchar *temp1)
{
uchar i;
WriteCommand(addr);
DelayMs(200);
for(i=0;i<16;i++)
{
WriteData(temp1);
DelayMs(500);
}
}
//液晶显示器初始化函数
void lcd_ini()
{
char i;
for(i=3;i>0;i--)//初始化 无调用任何函数
{
DelayMs(200); //short delay before operation
E=0;
RS=0;
RW=0;
E=1;
P0=0x30;
E=0;
DelayMs(200);
}
E=0;
RS=0;
RW=0;
E=1;
P0=0x38;//设置16*2 5*7 8位数据接口
E=0;
DelayMs(200);
}
//液晶显示器复位函数
void lcd_Reset()
{
WriteCommand(0x01);
DelayMs(200);
WriteCommand(0x06);
DelayMs(200);
WriteCommand(0x0c);
DelayMs(200);
}//主函数
void main()
{
lcd_ini();//初始化函数里无调用任何函数
lcd_Reset();//复位函数 调用了写命令函数 有一部分初始化成分
disp_lcd(0x80,welcome);//把第一行数组显示出来
disp_lcd(0xc0,lcdtimer);//把第二行数组显示出来00:00:00
EA=1;
EX0=1;
IT0=1;
while(1)
{
if(timeflag==1)
{
timeflag=0;
number=i;
if(number>=0)
m=number;
else
m=-number;
if(m>=10000)
{
i=0;
}
//for(t=5;t<4;t++)
//{
//n=m/k;
//lcdtimer[t]=n;
//w=m%k;
//m=w;
// k=k/10;
//}
a0=m/1000;
w=m%1000;
a1=w/100;
k=w%100;
a2=k/10;
a3=k%10;
lcdtimer[0]=a0;
lcdtimer[1]=a1;
lcdtimer[2]=a2;
lcdtimer[3]=a3;
disp_lcd(0xc0,lcdtimer);//重新给第2行赋值,重新显示第2行
}
}
}
void wai(void )interrupt 0 using 1
{
timeflag=0;
if(key==1)
i++;
else i--;
timeflag=1;
}