[51单片机]

请教一下12864的问题,望指点!

[复制链接]
1198|17
手机看帖
扫描二维码
随时随地手机跟帖
han001|  楼主 | 2017-6-6 15:27 | 显示全部楼层 |阅读模式
感谢您能抽出时间来看一下愚生的问题。查阅了些资料,依然不知问题所在。可能是在下比较愚笨,无法看清本质,还请各位大侠指点迷津,在下感激不尽!这是一个12864显示的小函数。如有陋处,还请多多包涵,本人小白一枚。
问题如下:
我的想法是,按某个键一下,12864上的显示就会在dis12[][10]这个数组里面一个一个显示。但不知道为什么,只能显示51%,在按的话,就成了50%了,且后面都是50%。就酱。
代码不美,将就的看吧。控制的按键的部分已经红字标出。
本想附链接视频,这样应该更加直观,小白初来乍到,没有权限,还请各位大侠指点一二。


字数超了,下面代码可能会分楼层贴出,请体谅!

相关帖子

han001|  楼主 | 2017-6-6 15:27 | 显示全部楼层
步入正题,代码如下:
#include<reg52.h>
#include <stdlib.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_data P0
sbit col1=P1^7;   //列端口定义
sbit col2=P1^6;
sbit col3=P2^0;
sbit col4=P2^1;
sbit LCD_EN=P3^4;
sbit LCD_RS=P3^5;
sbit LCD_RW=P3^6;
sbit LCD_PSB=P3^7;
uchar code dis0[]={"****智能控制****"};
uchar code dis1[]={"当前功能显示区"};
uchar code dis2[]={"当前水温:"};
uchar code dis3[]={"当前水位比: 50%"};
uchar code dis4[]={"按S17 开始上水"};
uchar code dis5[]={"目标水位比: 50%"};
uchar code dis6[]={"按 S5 停止上水"};
uchar code dis7[]={"上水中..."};
uchar code dis8[]={"按S18 开始加热"};
uchar code dis9[]={"目标水温:"};
uchar code dis10[]={"按 S6 停止加热"};
uchar code dis11[]={"加热中..."};
uchar code dis12[][10]={"51%","52%","53%","54%","55%","56%","57%","58%","59%","60%", //0-9
                                            "61%","62%","63%","64%","65%","66%","67%","68%","69%","70%", //10-19
                                            "71%","72%","73%","74%","75%","76%","77%","78%","79%","80%", //20-29
                                            "81%","82%","83%","84%","85%","86%","87%","88%","89%","90%", //30-39
                                            "91%","92%","93%","94%","95%","96%","97%","98%","99%","100%"};//40-49
uchar code dis13[][10]={"49%","48%","47%","46%","45%","44%","43%","42%","41%","40%",//0-9
                                            "39%","38%","37%","36%","35%","34%","33%","32%","31%","30%"};//10-19
/*uchar code dis12[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00};//清行*/
void delay1ms(uint);
void dekay(uchar);                                          
void keyscan();
void write_cmd(uchar cmd);
void write_dat(uchar dat);
void lcd_pos(uchar X,uchar Y);
void lcd_init();
uchar num,i,m,n,temp;
uint counter,a,counter1,b;
uint add0;
void main()//固定界面显示
{
        //uint add0,add1,minus0,minus1;

        delay1ms(10);
        lcd_init();


        lcd_pos(0,0);//智能控制
        i=0;
        while(dis0!='\0')
        {
                write_dat(dis0);
                i++;
        }


        lcd_pos(1,0);//当前水温
        i=0;
        while(dis2!='\0')
        {
                write_dat(dis2);
                i++;
        }


        lcd_pos(2,0);//当前水位比
        i=0;
        while(dis3!='\0')
        {
                write_dat(dis3);
                i++;
        }


        lcd_pos(3,0);//当前功能显示区
        i=0;
        while(dis1!='\0')
        {
                write_dat(dis1);
                i++;
        }


        delay1ms(10);
        while(1)
        {
                //P1=0xff;
                //P2=0xff;
                //P3=0xff;
                keyscan();
        }
}
void delay1ms(uint x)//延时
{
        uint i,j;
        for(j=0;j<x;j++)
                for(i=0;i<110;i++);
}
void delay(uchar i)//延时
{
        uchar j,k;
        for(j=i;j>0;j--)
                for(k=125;k>0;k--);
}

使用特权

评论回复
han001|  楼主 | 2017-6-6 15:29 | 显示全部楼层
void keyscan()
{
                col1=1;col2=1;col3=0;col4=1;//上水按键区
                temp=P2;
                temp=P2&0x3f;
                if(col3==0)         
                {                        
                        delay(80);
                        if(temp!=0x3f)
                        {        
                                temp=P2&0x3c;
                                switch(temp)
                                {
                                        case 0x1c:        //进入上水功能界面
                                        counter++;
                                        a=counter%2;
                                                switch(a)
                                                {
                                                        case 1:         //第一功能键,显示上水界面

                                                                write_cmd(0x01);
                                                                delay1ms(5);

                                                                delay(20);
                                                                lcd_pos(0,0);
                                                                i=0;
                                                                while(dis0!='\0')
                                                                {
                                                                        write_dat(dis0);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(1,0);
                                                                i=0;
                                                                while(dis4!='\0')
                                                                {
                                                                        write_dat(dis4);
                                                                        i++;
                                                                }
               
                                                                delay(20);
                                                                lcd_pos(2,0);
                                                                i=0;
                                                                while(dis5!='\0')
                                                                {                                                                           
                                                                        write_dat(dis5);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis1!='\0')
                                                                {
                                                                        write_dat(dis1);
                                                                        i++;
                                                                }
                                                                break;

                                                        case 0:           //第二功能键,开始上水

                                                                write_cmd(0x01);
                                                                delay1ms(5);

                                                                delay(20);
                                                                lcd_pos(0,0);
                                                                i=0;
                                                                while(dis0!='\0')
                                                                {
                                                                        write_dat(dis0);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(1,0);
                                                                i=0;
                                                                while(dis6!='\0')
                                                                {
                                                                        write_dat(dis6);
                                                                        i++;
                                                                }
               
                                                                delay(20);
                                                                lcd_pos(2,0);
                                                                i=0;
                                                                while(dis3!='\0')
                                                                {
                                                                        write_dat(dis3);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis7!='\0')
                                                                {
                                                                        write_dat(dis7);
                                                                        i++;
                                                                }
                                                                break;
                                                        }
                                                        break;
                                
                                        case 0x2c:        //增加水位比
                                
                                                add0++;
                                                if(add0==1)
                                                {
                                                        write_cmd(0x01);
                                                        delay1ms(5);                                         
        
                                                        delay(20);
                                                        lcd_pos(0,0);
                                                        i=0;
                                                        while(dis0!='\0')
                                                        {
                                                                write_dat(dis0);
                                                                i++;
                                                        }
        
                                                        delay(20);
                                                        lcd_pos(1,0);
                                                        i=0;
                                                        while(dis4!='\0')
                                                        {
                                                                write_dat(dis4);
                                                                i++;
                                                        }
        
                                                        delay(20);
                                                        lcd_pos(2,0);
                                                        i=0;
                                                        while(dis5!='\0')
                                                        {
                                                                write_dat(dis5);
                                                                i++;
                                                        }
        
                                                        delay(20);
                                                        lcd_pos(3,0);
                                                        i=0;
                                                        while(dis1!='\0')
                                                        {
                                                                write_dat(dis1);
                                                                i++;
                                                        }
                                                        break;
                                                }


                                                else if(add0>1&&add0<51)
                                                {
                                                        write_cmd(0x01);
                                                        delay1ms(5);                                         
        
                                                        delay(20);
                                                        lcd_pos(0,0);
                                                        i=0;
                                                        while(dis0!='\0')
                                                        {
                                                                write_dat(dis0);
                                                                i++;
                                                        }
        
                                                        delay(20);
                                                        lcd_pos(1,0);
                                                        i=0;
                                                        while(dis4!='\0')
                                                        {
                                                                write_dat(dis4);
                                                                i++;
                                                        }
        
                                                        delay(20);
                                                        lcd_pos(2,0);
                                                        i=0;
                                                        while(dis5!='\0')
                                                        {
                                                                write_dat(dis5);
                                                                i++;
                                                        }
                                                        //delay(20);
                                                        lcd_pos(2,6);
                                                        while(dis12[m][n]!='\0')
                                                        {
                                                                write_dat(dis12[m][n]);
                                                                n++;
                                                                if(n==9||n==19||n==29||n==39)
                                                                {        
                                                                        m++;
                                                                }
                                                                if(n==9&&m==4)
                                                                {
                                                                        n=0;
                                                                        m=0;
                                                                }
                                                        }
        
                                                        delay(20);
                                                        lcd_pos(3,0);
                                                        i=0;
                                                        while(dis1!='\0')
                                                        {
                                                                write_dat(dis1);
                                                                i++;
                                                        }
                                                        break;        
                                                }


                                        case 0x34:  //降低水位比

                                                 write_cmd(0x01);
                                                delay1ms(5);

                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis4!='\0')
                                                {
                                                        write_dat(dis4);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis5!='\0')
                                                {
                                                        write_dat(dis5);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;

                                        case 0x38: //退出键以及上水中止键

                                                //a=1;
                                                counter=0;
                                                write_cmd(0x01);
                                                delay1ms(5);

                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis2!='\0')
                                                {
                                                        write_dat(dis2);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis3!='\0')
                                                {
                                                        write_dat(dis3);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;
                                }
                        }
                }

使用特权

评论回复
han001|  楼主 | 2017-6-6 15:29 | 显示全部楼层
                col1=1;col2=1;col3=1;col4=0; //加热按键区
                temp=P2;
                temp=P2&0x3f;
                if(col4==0)
                {                                 
                        delay(80);
                        if(temp!=0x3f)
                        {                                                                        
                                temp=P2&0x3c;
                                switch(temp)
                                {
                                        case 0x1c:        //进入加热功能界面
                                        counter1++;
                                        b=counter1%2;
                                                switch(b)
                                                {
                                                        case 1:         //第一功能键,显示加热界面

                                                                write_cmd(0x01);
                                                                delay1ms(5);

                                                                delay(20);
                                                                lcd_pos(0,0);
                                                                i=0;
                                                                while(dis0!='\0')
                                                                {
                                                                        write_dat(dis0);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(1,0);
                                                                i=0;
                                                                while(dis9!='\0')
                                                                {
                                                                        write_dat(dis9);
                                                                        i++;
                                                                }
               
                                                                delay(20);
                                                                lcd_pos(2,0);
                                                                i=0;
                                                                while(dis8!='\0')
                                                                {
                                                                        write_dat(dis8);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis1!='\0')
                                                                {
                                                                        write_dat(dis1);
                                                                        i++;
                                                                }
                                                                break;

                                                        case 0:           //第二功能键,开始加热

                                                                write_cmd(0x01);
                                                                delay1ms(5);

                                                                delay(20);
                                                                lcd_pos(0,0);
                                                                i=0;
                                                                while(dis0!='\0')
                                                                {
                                                                        write_dat(dis0);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(1,0);
                                                                i=0;
                                                                while(dis2!='\0')
                                                                {
                                                                        write_dat(dis2);
                                                                        i++;
                                                                }
               
                                                                delay(20);
                                                                lcd_pos(2,0);
                                                                i=0;
                                                                while(dis10!='\0')
                                                                {
                                                                        write_dat(dis10);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis11!='\0')
                                                                {
                                                                        write_dat(dis11);
                                                                        i++;
                                                                }
                                                                break;
                                                }
                                                break;
                                
                                        case 0x2c:        //提高温度
                                
                                                write_cmd(0x01);
                                                delay1ms(5);

                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis9!='\0')
                                                {
                                                        write_dat(dis9);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis8!='\0')
                                                {
                                                        write_dat(dis8);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;

                                        case 0x34:  //降低温度

                                                write_cmd(0x01);
                                                delay1ms(5);

                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis9!='\0')
                                                {
                                                        write_dat(dis9);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis8!='\0')
                                                {
                                                        write_dat(dis8);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;

                                        case 0x38: //退出键以及加热中止键

                                                write_cmd(0x01);
                                                delay1ms(5);

                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis2!='\0')
                                                {
                                                        write_dat(dis2);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis3!='\0')
                                                {
                                                        write_dat(dis3);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;
                                }
                        }
                }
                while(temp!=0x3c)
                {
                        temp=P2;
                        temp=temp&0x3c;        
                }
}
void write_cmd(uchar cmd)//写指令数据到LCD
{
        LCD_RS=0;
        LCD_RW=0;
        LCD_EN=0;
        P0=cmd;
        delay1ms(5);
        LCD_EN=1;
        delay1ms(5);
        LCD_EN=0;
}
void write_dat(uchar dat)//写显示数据到LCD
{
        LCD_RS=1;
        LCD_RW=0;
        LCD_EN=0;
        P0=dat;
        delay1ms(5);
        LCD_EN=1;
        delay1ms(5);
        LCD_EN=0;
}
void lcd_pos(uchar X,uchar Y)//设定显示位置
{
        uchar pos;
        if(X==0)
        {X=0x80;}
        else if(X==1)
        {X=0x90;}
        else if(X==2)
        {X=0x88;}
        else if(X==3)
        {X=0x98;}
        pos=X+Y;
        write_cmd(pos);
}
void lcd_init()//LCD初始化
{
        LCD_PSB=1;
        write_cmd(0x30);
        delay1ms(5);
        write_cmd(0x0c);
        delay1ms(5);
        write_cmd(0x01);
        delay1ms(5);
}

使用特权

评论回复
han001|  楼主 | 2017-6-6 15:33 | 显示全部楼层
红色代码部分,小白自己又做了些修改。但依然存在问题,这次的问题是,按键后51%也不显示了,直接是全屏都是5,小白不解,还请各位大侠指点一下迷津,在下感激不尽!
代码如下:
                                                case 0x2c:          //增加水位比                               
                                                add0++;
                                                m=0;
                                                n=0;
                                                if(add0==1)
                                                {
                                                        write_cmd(0x01);
                                                        delay1ms(5);                                         
       
                                                        delay(20);
                                                        lcd_pos(0,0);
                                                        i=0;
                                                        while(dis0[i]!='\0')
                                                        {
                                                                write_dat(dis0[i]);
                                                                i++;
                                                        }
       
                                                        delay(20);
                                                        lcd_pos(1,0);
                                                        i=0;
                                                        while(dis4[i]!='\0')
                                                        {
                                                                write_dat(dis4[i]);
                                                                i++;
                                                        }
       
                                                        delay(20);
                                                        lcd_pos(2,0);
                                                        i=0;
                                                        while(dis5[i]!='\0')
                                                        {
                                                                write_dat(dis5[i]);
                                                                i++;
                                                        }
       
                                                        delay(20);
                                                        lcd_pos(3,0);
                                                        i=0;
                                                        while(dis1[i]!='\0')
                                                        {
                                                                write_dat(dis1[i]);
                                                                i++;
                                                        }
                                                        break;
                                                }

                                                else if(add0>1&&add0<51)
                                                {
                                                        write_cmd(0x01);
                                                        delay1ms(5);                                         
       
                                                        delay(20);
                                                        lcd_pos(0,0);
                                                        i=0;
                                                        while(dis0[i]!='\0')
                                                        {
                                                                write_dat(dis0[i]);
                                                                i++;
                                                        }
       
                                                        delay(20);
                                                        lcd_pos(1,0);
                                                        i=0;
                                                        while(dis4[i]!='\0')
                                                        {
                                                                write_dat(dis4[i]);
                                                                i++;
                                                        }
       
                                                        delay(20);
                                                        lcd_pos(2,0);
                                                        i=0;
                                                        while(dis5[i]!='\0')
                                                        {
                                                                write_dat(dis5[i]);
                                                                i++;
                                                        }                                          
                                                        lcd_pos(2,6);
                                                        while(dis12[m][n]!='\0')
                                                        {
                                                                write_dat(dis12[m][n]);
                                                        }
                                                        n++;
                                                        if(n==9)
                                                        {       
                                                                m++;
                                                                n=0;
                                                        }
                                                        if(n==9&&m==4)
                                                        {
                                                                n=0;
                                                                m=0;
                                                        }
       
                                                        delay(20);
                                                        lcd_pos(3,0);
                                                        i=0;
                                                        while(dis1[i]!='\0')
                                                        {
                                                                write_dat(dis1[i]);
                                                                i++;
                                                        }
                                                        break;       
                                                }

使用特权

评论回复
wangyy608| | 2017-6-6 15:38 | 显示全部楼层
估计难得有人看完
先确定是按键的问题还是显示的问题,再针对性的检查调试

使用特权

评论回复
han001|  楼主 | 2017-6-6 15:41 | 显示全部楼层
wangyy608 发表于 2017-6-6 15:38
估计难得有人看完
先确定是按键的问题还是显示的问题,再针对性的检查调试 ...

关键是小白只知道问题所在,不知问题的源在哪啊。

使用特权

评论回复
han001|  楼主 | 2017-6-6 15:43 | 显示全部楼层
QQ 1831378103, 空间相册12864,密码12864. 里面有视频,视频可以更加直观。望您能赏脸观看,为小白指点一下迷津。在下感激不尽!

使用特权

评论回复
pywmiss| | 2017-6-6 16:48 | 显示全部楼层
把程序下载进去....然后就看运行结果的....这种程序..我很怕
现在都是单步运行....一步步看结果...这样比较好找出故障

使用特权

评论回复
wangyy608| | 2017-6-6 16:50 | 显示全部楼层
本帖最后由 wangyy608 于 2017-6-6 16:54 编辑

看了红色部分
1.变量都没有初始化,可能有问题;
2.if判断有多个条件应该要分别加上(),如if( (n==9)||(n==19)||(n==29)||(n==39) ),if( (n==9)&&(m==4) );
3.变量的取值范围没有搞清楚,按照你定义的数值,这里n可以是0~9,m可以是0~4;应该是这样?
{
        write_dat(dis12[m][n]);
         n++;
         if(n>9)
         {        
                n = 0;
                 m++;
                 if( m>4 )                 {
                              m = 0;
                 }
        }
}

4.确定按键能够响应,有点怀疑?这个软件能运行起来?太乱了

使用特权

评论回复
han001|  楼主 | 2017-6-6 17:47 | 显示全部楼层
pywmiss 发表于 2017-6-6 16:48
把程序下载进去....然后就看运行结果的....这种程序..我很怕
现在都是单步运行....一步步看结果...这样比较 ...

小白是一枚在校生,代码还不是那么美,假期会强化一下C的,谢谢提醒!

使用特权

评论回复
han001|  楼主 | 2017-6-6 17:56 | 显示全部楼层
wangyy608 发表于 2017-6-6 16:50
看了红色部分
1.变量都没有初始化,可能有问题;
2.if判断有多个条件应该要分别加上(),如if( (n==9)||(n= ...

呃~,小白还是一名在校生,代码没那么美,以后会尽力。谢谢您!
同时,小白有下面的话要说。
1.小白定义的是全局变量,全局变量不赋值的话,不是默认值为0的嘛?如果小白没记错的话。
2.多谢提醒加括号的问题,小白铭记在心。这个if语句写错啦,只是if(n==9),不好意思,忘记修改啦
3.的确小白范围写错了~
4.确定按键可以响应,这个板子比较特别。为了消除您的疑惑,特附矩阵键盘的一个小程序供您了解。
5.谢谢您的帮助,在下感激不尽!

使用特权

评论回复
han001|  楼主 | 2017-6-6 17:59 | 显示全部楼层
wangyy608 发表于 2017-6-6 16:50
看了红色部分
1.变量都没有初始化,可能有问题;
2.if判断有多个条件应该要分别加上(),如if( (n==9)||(n= ...

代码:(PS~可能不美,将就着看吧
#include <reg52.h>
sbit datacs=P2^6;
sbit chipcs=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key;
sbit row1=P2^5; //行端口定义
sbit row2=P2^4;
sbit row3=P2^3;
sbit row4=P2^2;
sbit col1=P1^7; //列端口定义
sbit col2=P1^6;
sbit col3=P2^0;
sbit col4=P2^1;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 共 阴 数 码 管 显 示 段 码
0~9,A-F
/*数码管显示函数*/
void display(unsigned char num)
{
P0=table[num];
//P1=0xff;
datacs=1;
datacs=0;
P0=0x00; // 代表 8 位全亮
chipcs=1;
chipcs=0;
} /*
按键扫描函数*/
void keyScan(void)
{
//P3=0x00;
col1=0;col2=1;col3=1;col4=1;
temp=P2&0x3f;
if(col1==0) //假设第一列有按键
{
if(temp!=0x3f) //没有按键退出这次对第一列键盘扫描
{
temp=P2&0x3C; // 3CH=00111100, 目的是先把 P2.2、 P2.3、 P2.4、 P2.5
这中间四位先置 1, 即预读先置 1, 做好输入的准备
switch(temp)
{
case 0x38: key=12; break;
// 38H=00111000, 只看中间四位, 其中只有 P2.2=0, 代表第 4 行第 1 列为低电平, 所在
键值恰好是 12(即 C)
case 0x34:key=8;break;
// 34H=00110100, 只看中间四位, 其中只有 P2.3=0, 代表第 3 行第 1 列为低电平, 所在键
值恰好是 8
case 0x2C:key=4;break;
// 2CH=00101100, 只看中间四位, 其中只有 P2.4=0, 代表第 2 行第 1 列为低电平, 所在键
值恰好是 4
case 0x1C:key=0;break;
// 1CH=00011100, 只看中间四位, 其中只有 P2.5=0, 代表第 0 行第 1 列为低电平, 所在键
值恰好是 0
}
}
}
col1=1;col2=0;col3=1;col4=1;
temp=P2;
temp=temp&0x3f;
if(col2==0)
{
if(temp!=0x3f)
{
temp=P2&0x3C;
switch(temp)
{
case 0x38: key=13; break; //’ 0’ 键被按下时导通, 则对应端口变为
低电平
case 0x34:key=9;break;
case 0x2C:key=5;break;
case 0x1C:key=1;break;
}
}
}
col1=1;col2=1;col3=0;col4=1;
temp=P2;
temp=temp&0x3f;
if(temp!=0x3f)
{
temp=P2&0x3C;
switch(temp)
{
case 0x38: key=14; break; //’ 0’ 键被按下时导通, 则对应端口变为
低电平
case 0x34:key=10;break;
case 0x2C:key=6;break;
case 0x1C:key=2;break;
}
}
col1=1;col2=1;col3=1;col4=0;
temp=P2;
temp=temp&0x3f;
if(temp!=0x3f)
{
temp=P2&0x3C;
switch(temp)
{
case 0x38: key=15; break; //’ 0’ 键被按下时导通, 则对应端口变为
低电平
case 0x34:key=11;break;
case 0x2C:key=7;break;
case 0x1C:key=3;break;
}
}
}
void main()
{
datacs=0;
chipcs=0;
// P1=0xff;
while(1)
{
P3=0xff;
keyScan();
display(key);
}
}

使用特权

评论回复
ningling_21| | 2017-6-6 18:32 | 显示全部楼层
“”1.小白定义的是全局变量,全局变量不赋值的话,不是默认值为0的嘛?如果小白没记错的话“”

这个不一定是0

使用特权

评论回复
shahexu| | 2017-6-6 19:49 | 显示全部楼层
程序打断点,单步运行看看程序跑到那边了

使用特权

评论回复
han001|  楼主 | 2017-6-6 20:38 | 显示全部楼层
ningling_21 发表于 2017-6-6 18:32
“”1.小白定义的是全局变量,全局变量不赋值的话,不是默认值为0的嘛?如果小白没记错的话“”

这个不一 ...

大白。
好吧,小白一直以为是全局变量不赋值就默认为0呢,记住了,现在就去赋初值。

使用特权

评论回复
han001|  楼主 | 2017-6-6 20:40 | 显示全部楼层
shahexu 发表于 2017-6-6 19:49
程序打断点,单步运行看看程序跑到那边了

谢谢您,呃,小白前半句话明白(程序打断点,单步运行看看程序),后面不懂(跑到那边了),还请您指点一二

使用特权

评论回复
fengfeng的恒| | 2017-6-7 14:58 | 显示全部楼层
没看完代码,建议屏蔽其他部分,只保留显示部分,给指定参数,看是否能正常显示;如果通过的话,再针对按键功能做单步调试。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

34

帖子

1

粉丝