微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 独立键盘流水灯,为什么多了P2 = 0xf0;就不能工作?

独立键盘流水灯,为什么多了P2 = 0xf0;就不能工作?

时间:10-02 整理:3721RD 点击:

P2为独立键盘,P0接流水灯,为什么主函数下多了P2 = 0xf0;就不能工作(按下键盘后立即熄灭),而去掉P2 = 0xf0;反而正常工作呢?请大虾帮忙分析下,谢谢。这个问题想了好久还是没想通,特此来求教。
# include <reg51.h>
# include <intrins.h>
sbit sw1 = P2^4;
sbit sw2 = P2^5;
unsigned int n=0, val=0;
void delay(unsigned int i)
{
   unsigned int j;
   for(j=0; j<i; j++);
}
int main ()
{
   P0 = 0xfe;
   P2 = 0xf0;
   TMOD = 0x01;
   TH0 = ( 65536-50000)/256;
   TL0 = ( 65536-50000)%256;
   TR0 = 1;
   ET0 = 1;
   EA = 1;
while(1)
{
    switch(val)
    {
       case 1: for(n=0; n<8; n++){P0 = _crol_(P0, 1);delay(10000);} break;
       case 2: for(n=0; n<8; n++){P0 = _crol_(P0, 1);delay(30000);} break;
    }
}
}
void T() interrupt 1
{
    if(sw1 == 0)
      val = 1;
    if(sw2 == 0)
       val = 2;
}

不是复制的,自己写的。
还有unsigned int j;
for(j=0; j<i; j++);
j已经赋值了。

i 是delay(10000)的形参。

与你的按键有关吧,if(sw1==0)if(sw2==0) 为何又要给P2 0xf0;

因为我本来想这样的:
void T() interrupt 1
{
     if((P2&0xf0) != 0xf0)
     {
          if(sw1 == 0)
         {
             val = 1;
         }
         if (sw2 == 0)
         {
            val = 2;
         }
    }
}
按下键就熄灭。还有我把P2=0xf0的高四位拉高来检测键盘,理论上没错啊。低四位是扫描用的。

你的按键应该是每个都有接地;若是扫描键盘,检测完P2!=0XF0后,应该有个把低4位逐个为0来判断哪个键按下的函数

1、main函数无返回值,为什么用int型的?
2、sw1==0的时候val=1;当再使sw2==0的时候,貌似sw1还是0,并没有给P2重新赋值?

我刚试了,可以啊,都可以正常运行和闪亮额、、、

就我的单片机而言,
P2=0xf0;对程序没有影响。
因为单片机刚上电时,端口都为高点平,即P2口为:1111 1111 。
而:P2=0xf0->1111 0000,P2口的高四位没有改变,直到人为按下才会改变,执行。
(Ps:我的P2口高四位为独立键盘、、板子为Tx-1C)

程序已经好了,是硬件问题。 当然变量 i 最好先赋值,谢谢。

软件是好的,是硬件的问题,谢谢。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top