• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

P1 = (P1 & 0XF0) | i

oh_耗子 2018-10-21 浏览量:1180
#include<reg51.h>

sbit keyout1 = P2^7;
sbit keyout2 = P2^6;
sbit keyout3 = P2^5;
sbit keyout4 = P2^4;
sbit keyin1 = P2^3;
sbit keyin2 = P2^2;
sbit keyin3 = P2^1;
sbit keyin4 = P2^0;

unsigned char code LED[] = {0xfc 0x60 0xda 0xf2 0x66 0xb9 0xbe 0xe0
                              0xfe 0xf6 0xee 0xfe 0x9c 0xfc 0x9e 0x8E};
unsigned char code keymap[4][4] = {{ 0x31 0x32 0x33 0x26 } //Êý×Ö¼ü1¡¢Êý×Ö¼ü2¡¢Êý×Ö¼ü3¡¢ÏòÉϼü
                                   { 0x34 0x35 0x36 0x25 } //Êý×Ö¼ü4¡¢Êý×Ö¼ü5¡¢Êý×Ö¼ü6¡¢Ïò×ó¼ü
                                   { 0x37 0x38 0x39 0x28 } //Êý×Ö¼ü7¡¢Êý×Ö¼ü8¡¢Êý×Ö¼ü9¡¢Ïòϼü
                                   { 0x30 0x1B 0x0D 0x27 }  //Êý×Ö¼ü0¡¢ESC¼ü¡¢  »Ø³µ¼ü¡¢ ÏòÓÒ¼ü
                                  };
unsigned char keysta[4][4] = {{1111}{1111}{1111}{1111}};
unsigned char Ledbuf[] = {0x00 0x00 0x00 0x00 0x000x000x000x00}; //ÊýÂë¹Ü¿ª¹ØÏû³ý¹íÓ°

void ShowNumber(unsigned long num);
void keyaction(unsigned char keycode);
void keydriver();
void keyscan();
void ledscan();

int main()
{
    TMOD &= 0XF0;
    TMOD |= 0X01;
    TH0 = 0XFC;
    TL0 = 0X18;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
    Ledbuf[0] = LED[0];
    
    while(1)
    {
      keydriver();
    }
}
void ShowNumber(unsigned long num)
{
  signed int a;
    unsigned char buf[8];
    
    for(a = 0; a < 8; a++)
    {
      buf[a] = num % 10;
        num = num / 10;
    }
    for(a = 8; a >= 1; a--)
    {
      if(buf[a] == 0)
        {
          Ledbuf[a] = 0x00;
        }
        else
        {
          break;
        }
        for(; a >= 0; a--)
        {
           Ledbuf [a]= LED[buf[a]];
        }
    }
}
void keyaction(unsigned char keycode)
{
  static unsigned char add;
    static unsigned char result;
    
    if((keycode >= 0x30) && (keycode <= 0x39))
    {
      add = (add * 10) + (keycode - 0x30);  //°Ñ¼üÅÌÂë±ä³É
        ShowNumber(add);
    }
    else if(keycode == 0x26)
    {
      result += add;
    add = 0;
    ShowNumber(result);        
    }
    else if(keycode == 0x0d)
    {
      result += add;
        add = 0;
        ShowNumber(result);
    }
    else if(keycode == 0x1d)
    {
      result =0;
        add = 0;
        ShowNumber(add);
    }
}
void keydriver()
{
    unsigned char j i;
  unsigned char backup[4][4] = {{1111}{1111}{1111}{1111}};
    
    for(i = 0; i < 4; i++)
     for(j = 0; j < 4; j++)
      {
          if(keysta[i][j] != backup[i][j])
            {
              if(backup == 0)
                {
                    keyaction(keymap[i][j]);
                }
                backup[i][j] = keysta[i][j];
            }
            //backup[i][j] = keysta[i][j];
        }
}
void keyscan()
{
    unsigned char i;
    unsigned char keyout = 0;
    static unsigned char keybuf[4][4] = {{0xff 0xff 0xff 0xff}
                                         {0xff 0xff 0xff 0xff}
                                         {0xff 0xff 0xff 0xff}
                                         {0xff 0xff 0xff 0xff}
                                        };
    
    //¾ØÕó°´¼üɨÃ軺³å
    //½«Ò»ÐÐËĸö°´¼üÖµÒÆÈ뻺³åÇø£¬Íê³ÉÏû¶¶
    keybuf[keyout][0] = (keybuf[keyout][0] << 1) | keyin1;  
      keybuf[keyout][1] = (keybuf[keyout][1] << 1) | keyin2;
        keybuf[keyout][2] = (keybuf[keyout][2] << 1) | keyin3;
        keybuf[keyout][3] = (keybuf[keyout][3] << 1) | keyin4;
                                                            
        for(i = 0; i < 4; i++)  
                                                            //ÿÐÐËĸö°´¼üËùÒÔÑ­»·ËÄ´Î
        {
          if((keybuf[keyout][i] & 0x0f) == 0x00)  //Á¬ÐøËÄ´ÎɨÃèÖµ¶¼ÊÇÁ㣬ËùÒÔ°´ÏÂ
            {
              keysta[keyout][i] = 0;
            }
            else if((keybuf[keyout][i] & 0x0f) == 0x0f)
            {
              keysta[keyout][i] = 1;
            }
        }
        keyout++;         //ÏÂÒ»ÐÐɨÃè
        keyout &= 0x03;  // ÖØпªÊ¼Ò»´ÎɨÃè
        
        switch(keyout)
        {
          case 0: keyout4 = 1; keyout1 = 0; break;
            case 1: keyout1 = 1; keyout2 = 0; break;
            case 2: keyout2 = 1; keyout3 = 0; break;
            case 3: keyout3 = 1; keyout4 = 0; break;
            default: break;    
        }
}
void ledscan()
{
  static unsigned char i = 0;
    
    P0 = 0x00; //ÏûÒþ
    
    //P1 = (P1 & 0XF0) | i;
    P1 = 0XF0;
    P0 = Ledbuf[i];
    if(i < 8)
    {
      i++;
    }
    else
    {
      i = 0;
    }
}
void InterruptTimer0() interrupt 1 //½øÈëÖжÏ1ms£¬Íê³É¼üÅ̵ÄɨÃèºÍÊýÂë¹ÜÏÔʾ
{
  TH0 = 0XFC;
    TL0 = 0X18;
    
    keyscan();
  ledscan();
}

为什么C51和C52执行上面的程序是两种结果

3 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 芯片都不一样了,速度也不同,寄存器也有可能 不同了
    • 发布于 2018-10-22
    • 举报
    • 评论 0
    • 4
    • 0

其他答案 数量:10
  • 太长了

    请描述下有什么不同。

    • 发布于2018-10-21
    • 举报
    • 评论 0
    • 4
    • 0

  • 硬件不同呗。

    描述一下你的问题,这么长代码,看完也不知道不同的现象是什么

    • 发布于2018-10-21
    • 举报
    • 评论 0
    • 4
    • 0

  • 不太可能,是不是硬件问题,内核都一样的
    • 发布于2018-10-21
    • 举报
    • 评论 0
    • 4
    • 0

  • 主要是驱动数码管灯的顺序不一样
    • 发布于2018-10-22
    • 举报
    • 评论 0
    • 4
    • 0

  • C52的flash更大,定时器多了一个,这是唯一的区别,如果代码都一样的话效果应该是一样的。

    • 发布于2018-10-29
    • 举报
    • 评论 0
    • 1
    • 0

  • 你要看下两个芯片用的晶振是否一致,不同的话,那么两者运行时的指令周期是不一样的,定时器的时间间隔也会不同。所以程序中与定时器相关的按键扫描都会受到影响。问题可能就出在这里。
    • 发布于2018-10-30
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个程序的执行结果应该是一样的,你看一下其它的电路连接是否还有不一致的地方
    • 发布于2018-11-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 如果代码一模一样,建议查看硬件原理图查找原因
    • 发布于2018-11-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个要检查一下你的硬件问题,有可能是你的硬件的问题
    • 发布于2018-11-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 一般都是你的硬件连接或者软件的配置问题,要在重点检查一下这两个的地方
    • 发布于2018-11-27
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

P1 = (P1 & 0XF0) | i