从机的按键控制主机的LED灯,可是按键按下去灯不亮,是不是程序的问题?

2019-07-15 07:19发布

代码和仿真图如下,求各位帮忙看看是什么问题,谢谢。
主机代码
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#define   uchar   unsigned  char
#define   uint    unsigned  int


uchar   key_bpard;


uchar   D_ADDR;


/********************************************************************/
void   delay(uint  tt)
{
   uchar  i;
   for(;tt>0;tt--)
   {
      for(i=0;i<2;i++);
   }
}


/********************************************************************/
uchar  GET_KEY(void)
{
   uchar  lin_on,lin_tw;
   P1=0XF0;
   if((P1&0x0f)!=0xf0)
   {
      delay(20);
          if((P1&0x0f)!=0xf0)
          {
             lin_on=0xfe;
                 while((lin_on&0x10)!=0)
                 {
                    P1=lin_on;
                        if((P1&0XF0)!=0XF0)
                        {
                           lin_tw=(P1&0XF0)|0X0F;
                           return((~lin_tw)+(~lin_on));
                        }
                        else
                        {
                                   lin_on=(lin_on<<1)|0x01;
                        }
                 }
          }
   }
   return(0);
}


/********************************************************************/
void  CHOSE_key(void)
{
   uchar  i;
   P1=0XF0;
   if((P1&0x0f)!=0xf0)
   {
     i=GET_KEY();
     P1=0XF0;
     while((P1&0xf0)!=0xf0);
   }
   switch(i)
   {
      case 136:key_bpard=1;
                  break;
          case 72:key_bpard=2;
                  break;
          case 40:key_bpard=3;
                  break;
          case 24:key_bpard=4;
                  break;
          case 132:key_bpard=5;
                  break;
          case 68:key_bpard=6;
                  break;
          case 36:key_bpard=7;
                  break;
          case 20:key_bpard=8;
                  break;
          case 130:key_bpard=9;
                  break;
          case 66:key_bpard=0;
                 break;
          case 34:break;
          case 18:break;
          case 129:break;
          case 65:break;
          case 33:D_ADDR=0x02;break;
          case 17:D_ADDR=0x01;break;


   }
}
void  send_buf(void)
{
  
          SBUF=D_ADDR;
          while(!ti);
          TI=0;
          SBUF=key_bpard;
          while(!TI);
          TI=0;
          delay(3000);
}


void  main(void)
{
    IP=0x00;
        TMOD = 0x21; /*定时器1工作方式2;定时器0工作方式0*/
        SCON = 0x50; /*串口工作方式1,接收允许*/
        PCON = 0x00; /*波特率 不 加倍*/
        TH1 = 0xFD; /*波特率 9600*/
        TL1 = 0xFD;
        TR1 = 1;/*定时器1开*/
        PS = 1; /*串口中断优先级 高*/
        EA = 1; /*开总中断*/
        //ES = 1; /*开串口中断*/
   while(1)
   {
          CHOSE_key();
          send_buf();
   }
}


void   dushu(void)          interrupt   4          using 1         //串口接收中断
{
      while(RI==0);
          P2=SBUF;
      RI=0;
}
从机1代码
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#define   uchar   unsigned  char
#define   uint    unsigned  int

uchar  count;
uchar  rbuf[3];
uchar  KEY_BORD;
uchar   tab[10]={0x40,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x00,0x98};
/********************************************************************/
void   delay(uint  tt)
{
   uchar  i;
   for(;tt>0;tt--)
   {
      for(i=0;i<2;i++);
   }
}
void  main(void)
{
    IP=0x00;
        TMOD = 0x21; /*定时器1工作方式2;定时器0工作方式0*/
        SCON = 0x50; /*串口工作方式1,接收允许*/
        PCON = 0x00; /*波特率 不加倍*/
        TH1 = 0xFD; /*波特率 9600*/
        TL1 = 0xFD;
        TR1 = 1;/*定时器1开*/
        PS = 1; /*串口中断优先级 高*/
        EA = 1; /*开总中断*/
        ES = 1; /*开串口中断*/
   while(1)
   {
      KEY_BORD=P1;
          delay(2);
          P2=tab[rbuf[1]];
   }
}
void   dushu(void)          interrupt   4          using 1         //串口接收中断
{
    while(RI==0);
        rbuf[count]=SBUF;
    RI=0;
        if(rbuf[0]==0x01)
        {
          count=count+1;
          if(count>1)
          {
             count=0;
                 SBUF=KEY_BORD;
             while(!TI);
             TI=0;
          }

        }
        else
        {
          count=0;
        }
}

从机2代码
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#define   uchar   unsigned  char
#define   uint    unsigned  int


uchar  count;
uchar  rbuf[3];
uchar  KEY_BORD;
uchar   tab[10]={0x40,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x00,0x98};
/********************************************************************/
void   delay(uint  tt)
{
   uchar  i;
   for(;tt>0;tt--)
   {
      for(i=0;i<2;i++);
   }
}
void  main(void)
{
    IP=0x00;
        TMOD = 0x21; /*定时器1工作方式2;定时器0工作方式0*/
        SCON = 0x50; /*串口工作方式1,接收允许*/
        PCON = 0x00; /*波特率 不加倍*/
        TH1 = 0xFD; /*波特率 9600*/
        TL1 = 0xFD;
        TR1 = 1;/*定时器1开*/
        PS = 1; /*串口中断优先级 高*/
        EA = 1; /*开总中断*/
        ES = 1; /*开串口中断*/
   while(1)
   {
      KEY_BORD=P1;
          delay(2);
          P2=tab[rbuf[1]];
   }
}
void   dushu(void)          interrupt   4          using 1         //串口接收中断
{
    while(RI==0);
        rbuf[count]=SBUF;
    RI=0;
        if(rbuf[0]==0x02)
        {
          count=count+1;
          if(count>1)
          {
             count=0;
                 SBUF=KEY_BORD;
             while(!TI);
             TI=0;
          }
        }
        else
        {
          count=0;
        }
}


仿真图.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。