现在想写一个计算器的程序,用1602来显示按键的值,依次往右移,但代码有问题,请大神指教一下。

2019-07-15 07:55发布

请问下边的代码哪有问题啊,下到板子上按键全是乱的,不按也是乱的<span]

<span]
#include<reg52.h>


#define KEY P1
unsigned char display[10];
int data_a;
short keynum;


sbit LCD_1602_RW = P2^5;
sbit LCD_1602_RS = P2^6;
sbit LCD_1602_E = P2^7;


void delay1ms(unsigned char c)
{       
        unsigned char a,b;
        for (; c>0; c--)
        {
                for (b=199;b>0;b--)
                {
                          for(a=1;a>0;a--);
                }      
        }
}
void LCDWriteCom(unsigned char com)
{
        LCD_1602_E=0;
        LCD_1602_RW=0;
        LCD_1602_RS=0;


        P0=com;
        delay1ms(1);


        LCD_1602_E=1;
        delay1ms(1);
        LCD_1602_E=0;


        P0=com<<4;
        delay1ms(1);


        LCD_1602_E=1;
        delay1ms(1);
        LCD_1602_E=0;
}


void LCDWriteData(unsigned char dat)
{
        LCD_1602_E=0;
        LCD_1602_RW=0;
        LCD_1602_RS=1;


        P0=dat;
        delay1ms(1);


        LCD_1602_E=1;
        delay1ms(1);
        LCD_1602_E=0;


        P0=dat<<4;
        delay1ms(1);


        LCD_1602_E=1;
        delay1ms(1);
        LCD_1602_E=0;
}


void IniLCD()
{
        LCDWriteCom(0x32);
        LCDWriteCom(0x28);       
        LCDWriteCom(0x0c);  
        LCDWriteCom(0x06);  
        LCDWriteCom(0x01);
}


void display_a()
{
        unsigned char i;
        display[3]=data_a/1000;
        display[2]=(data_a%1000)/100;
        display[1]=(data_a%100)/10;
        display[0]=data_a%10;


        for(i=0;i<=3;i++)
        {
                LCDWriteCom(0x80+i);
                LCDWriteData('0'+display[3-i]);
        }
}


void keyscan()
{
        unsigned char a,keynum;
        KEY=0x0f;
        if(KEY!=0x0f)
        {
                delay1ms(1);                                   //延时进行消抖
                if(KEY!=0x0f)
                {
                        KEY=0x0f;
                        switch(KEY)
                        {
                                case 0x0e:keynum=3;break;
                                case 0x0d:keynum=2;break;
                                case 0x0b:keynum=1;break;
                                case 0x07:keynum=0;break;
                        }
                        KEY=0xf0;
                        switch(KEY)
                        {
                                case 0xe0:keynum=keynum+12;break;
                                case 0xd0:keynum=keynum+8;break;
                                case 0xb0:keynum=keynum+4;break;
                                case 0x70:keynum=keynum;break;       
                        }
                        while((a<50)&&(KEY!=0xf0))        //检测按键松手检测
                        {
                                delay1ms(1);
                                a++;
                        }
                }       
        }
}


unsigned char numpro(unsigned char a)
{
        switch(a)
        {
                case 0:return 7;break;
                case 1:return 8;break;
                case 2:return 9;break;
                case 3:return 0x0d;break;                                //按键/


                case 4:return 4;break;
                case 5:return 5;break;
                case 6:return 6;break;
                case 7:return 0x0c;break;                                //按键*


                case 8:return 1;break;
                case 9:return 2;break;
                case 10:return 3;break;
                case 11:return 0x0b;break;                                //按键-


                case 12:return 0;break;
                case 13:return 0x0f;break;                                  //按键CE
                case 14:return 0x0a;break;                                  //按键+
                case 15:return 0x0e;break;                                  //按键=


                default:return 0xff;
        }
}


void main()
{
        unsigned char b=0xff;
        IniLCD();
        data_a=0;
        display_a();
        while(1)
        {
                keyscan();
                b=numpro(keynum);
                if(b!=0xff)
                {
                        if(b<10)
                        {
                                data_a=b+data_a*10;
                                display_a();
                        }
                }
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。