搜索
bottom↓
回复: 2

4*4键盘问题通过433模块发射

[复制链接]

出0入0汤圆

发表于 2009-3-11 15:19:19 | 显示全部楼层 |阅读模式
我的程序有一点小问题,开机时LCD显示000000,当我按键盘的时候,数据从第二位开始显示,即我输入1的时候,正常应该是100000,定时我显示的是010000,当我按完五位数后,后面若再有键按下,就从第一位开始显示了,我认真的检查过程序,不知道问题出在那里,希望高人指点指点,谢谢!我的程序如下:
#include< W77E58.H>
#define uchar unsigned char
#define uint unsigned int
#define KEY P2
#define DATA P0
sbit RS=P3^3;         //1602LCD控制接口
sbit RW=P3^4;         //1602LCD读写接口
sbit E=P3^5;         //1602LCD使能接口       
uint m=0;
uchar n=0;
uchar v=0;
uchar key_num[6]={0,0,0,0,0,0};

uchar code keycode[12] =
{
0xee,0xde,0xbe,
0xed,0xdd,0xbd,
0xeb,0xdb,0xbb,
0xe7,0xd7,0xb7

};
void delay(uchar k)
{
        uchar m,n;
        for(m=0;m<20;m++)
        for(n=0;n<k;n++);

}

void  write_com(uchar com)       
{
    E=0;
    RW=0;
    RS=0;
    P0=com;
    E=1;
    delay(10);
}

void write_dat(uchar dat)
{
    E=0;
    RW=0;
    RS=1;
    P0=dat;
    E=1;
   delay(10);
   
}

void LCD_init()
{
        write_com(0x38);        //8bit I/F;2-linedisplay;5x8 font
        write_com(0x04);        // screen shifting
        write_com(0x0c);        //Display on;cursor off;cursor-blinking off
        write_com(0x01);    //clear screen
       
}
uchar key_scan(void)
{
        uchar i=0xff,keyval=0;


        KEY=0xf0;   //将行线拉低

        if (KEY != 0xf0)         //表示有键按下
        {               
        keyval = (KEY & 0xf0); //取被改变的高4位

                KEY=0x0f;   //再将列线拉低
                keyval |= (KEY & 0x0f); //取被改变的低4位
        
        if (keyval != v)
        {
                    for (i = 0;i<12;i++) if(keyval == keycode) break; //在数组中搜索符合的条件
   
                    if (i>=12) i=0xff;

            v =  keyval;m=0;
        }
        else i=0xff;
        }

        return i;
}

void key_test(void)
{
    uchar val =0;
        uchar a=0;

    val = key_scan();
    if (val != 0xff)
    {
                a=val+1;
                n++;
        if (n>=6)
                n=0;
                if(a<=11)
{
        key_num[n] = a;
}
        if(a==11)
{
        key_num[n]=0;
}
        if(a==12)
{
        key_num[n]=11;
}

    }
   
}

void display()
{
        write_com(0x80);
        if(key_num[0]<10)
{
         write_dat(key_num[0]+0x30);
}
        else
{
        write_dat(key_num[0]+0x37);
}
        write_com(0x81);
        if(key_num[1]<10)
{
         write_dat(key_num[1]+0x30);
}
        else
{
        write_dat(key_num[1]+0x37);
}

         write_com(0x82);
         if(key_num[2]<10)
{
        write_dat(key_num[2]+0x30);
}
        else
{
        write_dat(key_num[2]+0x37);
}
         write_com(0x83);
         if(key_num[3]<10)
{
        write_dat(key_num[3]+0x30);
}
        else
{
        write_dat(key_num[3]+0x37);
}
        write_com(0x84);
         if(key_num[4]<10)
{
        write_dat(key_num[4]+0x30);
}
        else
{
        write_dat(key_num[4]+0x37);
}
        write_com(0x85);
         if(key_num[5]<10)
{
        write_dat(key_num[5]+0x30);
}
        else
{
        write_dat(key_num[5]+0x37);
}
       
}



void main (void)
{   
        TMOD=0X20;
        TR1=1;
        TH1=0XFA;
        TL1=0XFA;
        SCON1=0X40;
        PCON=0X00;
        EA=1;
        ES1=1;
    LCD_init();
        while(1)
        {
        key_test();
        TI_1=0;//置位
        SBUF1 =key_num[0];   //发送数据
        while(!TI_1);//等待数据发送完       
        TI_1=0;//置位
        SBUF1 =key_num[1];   //发送数据
        while(!TI_1);//等待数据发送完       
        TI_1=0;//置位
        SBUF1 =key_num[2];   //发送数据
        while(!TI_1);//等待数据发送完       
        TI_1=0;//置位
        SBUF1 =key_num[3];   //发送数据
        while(!TI_1);//等待数据发送完       
        TI_1=0;//置位
        SBUF1 =key_num[4];   //发送数据
        while(!TI_1);//等待数据发送完       
        TI_1=0;//置位
        SBUF1 =key_num[5];   //发送数据
        while(!TI_1);//等待数据发送完       
        display();
        delay(10);  
        if (m++ == 50)
        {m=0;
        v=0;
        }


}

}

出0入0汤圆

发表于 2009-3-11 18:52:22 | 显示全部楼层
电路呢?

出0入0汤圆

 楼主| 发表于 2009-3-12 12:20:35 | 显示全部楼层
电路就不用看了,通过程序很容易想的出来的,我的硬件是没有问题的,只是在按键显示的时候有点问题,今天已经解决了,但是我今天又想到了一个问题,怎么让我的显示按一下显示一位,我现在是开机显示000000,每按一下,就会把上面的数据覆盖,我想换一种显示方式,想找高人提供一下思路。谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 13:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表