标题: stc15单片机按键无法显示 [打印本页]

作者: 1045964948    时间: 2021-8-2 15:09
标题: stc15单片机按键无法显示
我写了一个按键检测程序按下后只显示00,按键不管用不知道哪里有问题希望有大佬帮忙解答一下

单片机源程序如下:
#include <STC15F2K60S2.H>
#define uint unsigned int
#define uchar unsigned char
uchar sce,temp,i;
const uchar LED7Code[]={0xC0,0xF9,0xA4,0xB0,
                        0x99,0x92,0x82,0xF8,        
                        0x80,0x90,0x88,0x83,
                                                0xC6,0xA1,0x86,0x8E        
                       };
void  anjian()
{
  uchar aa,aa1,aa2;
   P1=0xf0;
   if(P1!=0xf0)
   {
    P2=0xff;
     aa=P1;
         P1=0x0f;
         if(P1!=0x0f)
         {aa1=P1;}
   }
   aa2=aa|aa1;
   switch(aa2)
   {
     case  0xee:sce=0;break;
         case  0xed:sce=1;break;
         case  0xeb:sce=2;break;
         case  0xe7:sce=3;break;
         case  0xde:sce=4;break;
         case  0xdd:sce=5;break;
         case  0xdb:sce=6;break;
         case  0xd7:sce=7;break;
         case  0xbe:sce=8;break;
         case  0xbd:sce=9;break;
         case  0xbb:sce=10;break;
         case  0xb7:sce=11;break;
         case  0x7e:sce=12;break;
         case  0x7d:sce=13;break;
         case  0x7b:sce=14;break;
         case  0x77:sce=15;break;
         default:break;
   }
}

void IO_Init()
{
        P0M0 = 0x00;P0M1 = 0x00;  
        P1M0 = 0x00;P1M1 = 0x00;
        P2M0 = 0x00;P2M1 = 0x00;
        P3M0 = 0x00;P3M1 = 0x00;
        P4M0 = 0x00;P4M1 = 0x00;
        P5M0 = 0x00;P5M1 = 0x00;
        P6M0 = 0x00;P6M1 = 0x00;
        P7M0 = 0x00;P7M1 = 0x00;
        P0 = 0x00;P1 = 0x00;P2 = 0xff;P3 = 0x00;
        P4 = 0x00;P5 = 0x00;P6 = 0x00;P7 = 0x00;
}


void main()
{
P2=0;
IO_Init();
while(1)
{
    anjian();
        P0=LED7Code[sce];
}
}   


作者: 开心就好hhhh    时间: 2021-8-2 15:59
你程序写的互相矛盾呐,比如下面:
P1=0xf0;
   if(P1!=0xf0)
就很奇怪,你都已经定义了让P0=0xf0了,if语句里当然条件不成立,就进不了if语句,然后 aa2=aa|aa1;也就没有用了,因为你没有改变这三个参数的值,也就是说还是0,所以后面就都错了,所以当然无法通过按键改变显示的值了
作者: 1045964948    时间: 2021-8-2 16:16
开心就好hhhh 发表于 2021-8-2 15:59
你程序写的互相矛盾呐,比如下面:
P1=0xf0;
   if(P1!=0xf0)

后面我把这个删了还是不行
作者: lkc8210    时间: 2021-8-2 16:36
Proteus 某些版本的单片机脚灌电流能力不足
引致不能拉底电平
如P1=B11110000
按下某键
会出现P1=B11110100
而不是P1=B10110000

解决方法:
1. 上真东西
2. 取巧用以下电路代替


作者: 1045964948    时间: 2021-8-2 17:18
lkc8210 发表于 2021-8-2 16:36
Proteus 某些版本的单片机脚灌电流能力不足
引致不能拉底电平
如P1=B11110000

但是这样不就是相当于独立按键了吗,请问一下没有实物不用这种电路还有其他办法吗
作者: lkc8210    时间: 2021-8-2 17:25
1045964948 发表于 2021-8-2 17:18
但是这样不就是相当于独立按键了吗,请问一下没有实物不用这种电路还有其他办法吗

我也想知道
作者: 1045964948    时间: 2021-8-2 18:04
lkc8210 发表于 2021-8-2 17:25
我也想知道

我换了开关还是不行
作者: wulin    时间: 2021-8-2 18:51
1045964948 发表于 2021-8-2 18:04
我换了开关还是不行

给你一个示例参考
矩阵键盘数码管显示 仿真示例.zip (103.67 KB, 下载次数: 5)


作者: 1045964948    时间: 2021-8-2 19:26
wulin 发表于 2021-8-2 18:51
给你一个示例参考

我这个程序在51中运行也没问题,就是在15中就没变化
作者: wulin    时间: 2021-8-2 20:27
1045964948 发表于 2021-8-2 19:26
我这个程序在51中运行也没问题,就是在15中就没变化

1T单片机太快了,在主循环最后加1ms延时试试。
作者: 1045964948    时间: 2021-8-3 08:55
wulin 发表于 2021-8-2 20:27
1T单片机太快了,在主循环最后加1ms延时试试。

额,还是没有变化,我看51的仿真里面按键按下后是高电平被拉低,然后我看15里面是低电平被拉高,会不会是这个原因
作者: lkc8210    时间: 2021-8-3 09:15
1045964948 发表于 2021-8-3 08:55
额,还是没有变化,我看51的仿真里面按键按下后是高电平被拉低,然后我看15里面是低电平被拉高,会不会是 ...

如我所说,灌电流不足以拉低电平
作者: 开心就好hhhh    时间: 2021-8-3 15:15
1045964948 发表于 2021-8-3 08:55
额,还是没有变化,我看51的仿真里面按键按下后是高电平被拉低,然后我看15里面是低电平被拉高,会不会是 ...

接下拉电阻试试看,15的io口上电复位高电平来着
作者: SURUBU1976    时间: 2021-8-4 11:26
        P0M1 = 0;        P0M0 = 0;        //éèÖÃÎa׼˫Ïò¿ú
        P1M1 = 0;        P1M0 = 0;        //éèÖÃÎa׼˫Ïò¿ú
        P2M1 = 0;        P2M0 = 0;        //éèÖÃÎa׼˫Ïò¿ú
        P3M1 = 0;        P3M0 = 0;        //éèÖÃÎa׼˫Ïò¿ú
        P4M1 = 0;        P4M0 = 0;        //éèÖÃÎa׼˫Ïò¿ú
        P5M1 = 0;        P5M0 = 0;        //éèÖÃÎa׼˫Ïò¿ú
        P6M1 = 0;        P6M0 = 0;        //éèÖÃÎa׼˫Ïò¿ú
        P7M1 = 0;        P7M0 = 0;        //éèÖÃÎa׼˫Ïò¿ú
作者: SURUBU1976    时间: 2021-8-4 11:28
        P0M1 = 0;        P0M0 = 0;        //设置为准双向IO口
        P1M1 = 0;        P1M0 = 0;       
        P2M1 = 0;        P2M0 = 0;       
        P3M1 = 0;        P3M0 = 0;       
        P4M1 = 0;        P4M0 = 0;       
        P5M1 = 0;        P5M0 = 0;       
        P6M1 = 0;        P6M0 = 0;       
        P7M1 = 0;        P7M0 = 0;       
作者: 1045964948    时间: 2021-8-7 19:00
谢谢大家我在P1口加了下拉电阻问题得到解决
作者: 1045964948    时间: 2021-8-7 19:00
但是开发板上面的矩阵按键我加不了下拉电阻所以还是不行,目前我在想办法解决
作者: xuyaqi    时间: 2021-8-7 20:36
1045964948 发表于 2021-8-7 19:00
但是开发板上面的矩阵按键我加不了下拉电阻所以还是不行,目前我在想办法解决

stc15 P1口 有ADC功能,硬件结构和普通51不一样,不要用P1口既做输出又做输入来读组合按键键值,换其他口。
作者: 1045964948    时间: 2021-8-10 11:55
xuyaqi 发表于 2021-8-7 20:36
stc15 P1口 有ADC功能,硬件结构和普通51不一样,不要用P1口既做输出又做输入来读组合按键键值,换其他口 ...

好的感谢感谢我换成P6不需要任何上拉或下拉就可以实现功能了
作者: Letitia    时间: 2021-8-11 13:22
做电路图得注意某些特殊功能的引脚




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1