找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1465|回复: 6
打印 上一主题 下一主题
收起左侧

关于51单片机控制矩阵程序,为什么上电就显示8呢?

[复制链接]
跳转到指定楼层
楼主
ID:609989 发表于 2019-10-15 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题。这个项目因为使用输入口较多,所以用了矩阵控制。
但是 为什么:我上电开始读数据,数码管就会显示“8”呢?我删除掉初始化开始读数据后,他就正常了。我不知道为什么,请指导下。大神们。
程序“我只放了矩阵这一块”:
uchar keycl()
{
    uchar a,b;
    P2=0x0f;
    i=P2;//读取P1低4位,放在i
    P2=0xf0;
    j=P2;//不用说也知道吧
    a=i+j;//行+列
        switch(a)//16种情况
        {
            case 0x7e:b=0;break;
            case 0xbe:b=1;break;
            case 0xde:b=2;break;
            case 0xee:b=3;break;
            case 0x7d:b=4;break;
            case 0xbd:b=5;break;
            case 0xdd:b=6;break;
            case 0xed:b=7;break;
            case 0x7b:b=8;break;
            case 0xbb:b=9;break;
            case 0xdb:b=10;break;
            case 0xeb:b=11;break;
            case 0x77:b=12;break;
            case 0xb7:b=13;break;
            case 0xd7:b=14;break;
            case 0xe7:b=15;break;
            default:b=0xff ;break;
    }
       return(b);//函数返回值
}
“矩阵调用程序”
    ch451_init();                //显示初始化
    ch451_write(0x0401);        //显示开
    ch451_write(0x0600);        //闪烁全关
    while(1)
    {
   
         key=keyl();//读键盘值,key=函数返回值
       ch451_write( CH451_DIG1|bc[key] );    //就是这一句,我上电后就会读数据,会显示“8”,我把这一句删除掉就好了。
        if(key!=0xff)//有键按下么?
        {
            delayms(20);
             if(key!=0xff)//真的有么?有的 就继续往下走
            {
            
                while(P2!=0xf0);//你松开了按键么
                do{delayms(20);}
                while(P2!=0xf0);//你真的松开了么
                ch451_write( CH451_DIG1|bc[key] );
            }
        }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:609989 发表于 2019-10-15 18:00 | 只看该作者
上面有个地方错了: uchar “keycl”()写错了,应该是key1.
回复

使用道具 举报

板凳
ID:503018 发表于 2019-10-15 22:23 | 只看该作者
有错的地方多呀‘
回复

使用道具 举报

地板
ID:503018 发表于 2019-10-15 22:24 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
                    0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,
                                        0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{
P0=table[num];
dula=1;
dula=0;
}
void matrixkeyscan()
{
uchar temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: key=0;
           break;
case 0xde: key=1;
           break;
case 0xbe: key=2;
           break;
case 0x7e: key=3;
           break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: key=4;
           break;
case 0xdd: key=5;
           break;
case 0xbd: key=6;
           break;
case 0x7d: key=7;
           break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:  key=8;
            break;
case 0xdb:  key=9;
            break;
case 0xbb:  key=10;
            break;
case 0x7b:  key=11;
            break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:  key=12;
            break;
case 0xd7:  key=13;
            break;
case 0xb7:  key=14;
            break;
case 0x77:  key=15;
            break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
void main()
{
P0=0;
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
while(1)
{
matrixkeyscan();
}
}
回复

使用道具 举报

5#
ID:235200 发表于 2019-10-15 22:58 | 只看该作者
删除那一句就没有往显示控制器CH451中送数据,当然就没有显示了,与调不调用矩阵键盘都没关系,关键看数组be[key]存了什么值
回复

使用道具 举报

6#
ID:609989 发表于 2019-10-16 13:37 | 只看该作者
csmyldl 发表于 2019-10-15 22:58
删除那一句就没有往显示控制器CH451中送数据,当然就没有显示了,与调不调用矩阵键盘都没关系,关键看数组be[k ...

恩,我在主程序运行时把“uchar key1();”加进去就好了。但是还是没有弄别白,为什么上电key里面有数值。?
还有一个问题:我的板子P2口有输出二极管显示, P2=0xf0;(11110000)应该是低四位输出低电平,我的二极管发亮,但是现在是低四位发亮,可是高四位的二极管似亮非亮感觉电压不足的那种。我实际用电压测了一下:单片机高四位电压输出是6.2V,我的发光二极管(5V串联511的电阻和发光二极管),是不是我的单片机输出端和二极管端出现了压差导致呢?
回复

使用道具 举报

7#
ID:235200 发表于 2019-10-16 15:07 | 只看该作者
这应该是读矩阵键盘时影响了发光二极管的电压,如果能够锁定二极管的供电电压或者改变读取矩阵键盘的时间,就不会出现这种情况了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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