m0_67090737 2023-12-01 11:03 采纳率: 50%
浏览 5
已结题

摁摁钮(接P3.4口)无法实现点阵管播放速度调节,大家能帮我看看是什么问题吗?TAT

摁摁钮(接P3.4口)无法实现点阵管播放速度调节。


#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sfr P4SW=0xBB;
sfr P4=0xC0;
sbit P44=P4^4;
bit Hold=1;
bit ldelay=0;
uchar t=0,count=20;
typedef unsigned char uint8;
typedef char          int8;
typedef unsigned int  uint16;
#define COL_PORT  P0
#define ROW_PORT  P2
void Int0_srv() interrupt 0{
   Hold=!Hold;
}
timer0() interrupt 3{
   t++;
   if(t==count) {t=0;ldelay=1;}
   TH1=0x3c; TL1=0xb0;
}
speed0() interrupt 1{
   count+=40;
   if(count==140) count=20;
}
uint8 code DotTable1[][8]=
{
  0x00,0x10,0x7c,0x54,0x38,0x28,0x28,0x00,
    0x6c,0x54,0x7c,0x10,0x38,0x6c,0x00,0x00,
    0x00,0x00,0x00,0x3e,0x24,0xe4,0x00,0x00,
    0x00,0x14,0x7c,0x50,0x3e,0x20,0x20,0x00,
    0x44,0x54,0x7c,0x10,0x38,0x28,0x28,0x00,
    0x02,0x6a,0x3e,0x48,0x7c,0x04,0x04,0x04
};
uint8 code DotTable2[][8]=
{
    0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
    0x00,0x00,0x10,0x28,0x10,0x00,0x00,0x00,
    0x00,0x38,0x54,0x6c,0x54,0x38,0x00,0x00,
    0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00,
    0x54,0xaa,0x44,0x82,0x44,0xaa,0x54,0x00,
    0x54,0x82,0x00,0x82,0x00,0x82,0x54,0x00
};
void  Delay(int ms);
void LedDotRefresh1();
void LedDotRefresh2();
uint8 LedDotDispBuff;
void main(){
    uint8 i;
    P4SW |=0x70;            
  P44=0;
  TMOD=0x16;
  TH1=0X3c;
  TL1=0xb0;
    TH0=TL0=0xFF;
    IT0=1;
    EX0=1;
  TR0=1;
  ET0=1;
    TR1=1;
    ET1=1;
  EA=1;
  while(1){
  if(Hold){
  if(ldelay){
     ldelay=0;
   for(LedDotDispBuff=6;LedDotDispBuff!=0xff;LedDotDispBuff--) 
       for(i=0;i<1000/8;i++)   
          LedDotRefresh1();
  }
  }
    else{
    if(ldelay){
     ldelay=0;
   for(LedDotDispBuff=6;LedDotDispBuff!=0xff;LedDotDispBuff--) 
       for(i=0;i<1000/8;i++)   
          LedDotRefresh2();
    }
  }
}
void LedDotRefresh1()   
{
   uint8 i;
   for(i=0;i<8;i++)        
     {
       COL_PORT=~DotTable1[LedDotDispBuff][i]; 
        ROW_PORT=0xF0+i;   
               Delay(1);    
        ROW_PORT=0xF8;                     
     }
     }
void LedDotRefresh2()   
{
   uint8 i;
   for(i=0;i<8;i++)        
     {
       COL_PORT=~DotTable2[LedDotDispBuff][i]; 
        ROW_PORT=0xF0+i;   
               Delay(1);    
        ROW_PORT=0xF8;                     
     }
     }
void Delay(int ms)
{
   uint16 i;
   do{
       i=790;
       while(--i); 
   } while(--ms);
}

  • 写回答

19条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-12-01 11:03
    关注
    获得0.45元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    1. 问题分析

    根据代码和问题描述,可以推测出以下可能的问题:

    1. 摁摁钮(接P3.4口)无效。
    2. 点阵管的播放速度无法调节。

    下面我们将逐个分析这些问题。

    2. 摁摁钮无效

    首先,我们需要确定摁摁钮接口是否正确连接。根据代码中的注释,我们可以得知:

    sfr P4SW=0xBB;
    sfr P4=0xC0;
    sbit P44=P4^4;
    

    sfr P4SW 是用于配置 P4 口的功能的寄存器,P4 口将被配置成摁摁钮的输入,而sbit P44 则表示 P4 口的第 4 位,即 P3.4 口。

    在主函数 main() 中也可以找到相应的代码去设置 P4SW 寄存器:

    P4SW |=0x70;
    P44=0;
    

    我们可以通过查看51单片机的手册来确认 P4SW 的设置是正确的。手册链接

    此外,如果 P4SW 设置正确,那么请确保摁摁钮的硬件连接也是正确的(例如,上拉电阻),以便正确读取摁摁钮的输入状态。


    3. 点阵管的播放速度无法调节

    根据代码,我们可以确定以下几点来调节点阵管的播放速度:

    1. 定时器中断
    2. 按钮中断

    在代码中,定时器中断使用了定时器 T0 和中断号 3,而按钮中断使用了外部中断 INT0 和中断号 0。

    定时器中断的中断向量为 timer0(),我们可以在其中找到对播放速度的调节:

    void timer0() interrupt 3 {
       t++;
       if(t==count) {t=0;ldelay=1;}
       TH1=0x3c; TL1=0xb0;
    }
    

    具体来说,t 表示计数器,当 t 等于 count 时,播放速度发生变化,并将 ldelay 设置为 1。因此,我们需要确定 count 的初始值,以及它是否在合理的范围内调整。

    void speed0() interrupt 1{
       count+=40;
       if(count==140) count=20;
    }
    

    按钮中断通过外部中断 INT0 来实现,它的中断向量为 Int0_srv(),我们需要确认按钮中断的设置是否正确。

    void Int0_srv() interrupt 0 {
       Hold=!Hold;
    }
    

    根据代码中的逻辑,Hold 用于控制播放的暂停和继续,因此,我们需要确认 Hold 变量的初始值和它是否在所需范围内变化。


    4. 总结

    综上所述,为了解决摁摁钮无效和点阵管播放速度无法调节的问题,我们需要分别确认以下几个方面:

    1. 摁摁钮是否正确连接并且能够正常工作;
    2. P4SW 寄存器的设置是否正确;
    3. timer0() 中定时器的设置,以及 count 变量是否被合理调节;
    4. Int0_srv() 中按钮中断的设置,以及 Hold 变量的合理使用。

    根据问题描述和代码分析,我们可以根据需要进行硬件和软件的调试,并确保所有的变量和寄存器都在合理的范围内使用。

    希望以上分析对你有所帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月9日
  • 创建了问题 12月1日