沦陷理想高台 2023-04-19 20:48 采纳率: 46.4%
浏览 18
已结题

c51使用中断函数控制按键编译显示undefined identify

c51用中断控制按键实现数码管显示数字的加减,,main函数里已经声明了num,为什么在中断函数里还是不可以直接使用?

#include <reg52.h> 

#define uint unsigned int 
#define uchar unsigned char 

sbit K1 = P3^0; // 定义K1键
sbit K2 = P3^1; // 定义K2键

uchar code display_code[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 }; // 数码管段选编码,0-9

void delay(uint xms) // 延时函数
{
    uint i, j;
    for (i=xms;i>0;i--)
        for (j=112;j>0;j--);
}

void External1_Isr() interrupt 2 // 外部中断1中断服务函数
{
    delay(10); // 延时去抖
    if (K1 == 0) // 确认按下K1键
    {
        num++; // 数码管显示数值加1
        if (num > 99) num = 0; // 数据范围为00-99
    }
}

void External2_Isr() interrupt 0 // 外部中断0中断服务函数
{
    delay(10); // 延时去抖
    if (K2 == 0) // 确认按下K2键
    {
        num--; // 数码管显示数值减1
        if (num > 99) num = 99; // 数据范围为00-99
    }
}

void main()
{
    uchar num = 0; // 数码管显示数值
    uchar ten, unit; // 十位和个位数字

    IT0 = 1; // 外部中断0下降沿触发
    EX0 = 1; // 允许外部中断0
    IT1 = 1; // 外部中断1下降沿触发
    EX1 = 1; // 允许外部中断1
    EA = 1; // 允许总中断

    while(1)
    {
        ten = num / 10; // 获取十位数字
        unit = num % 10; // 获取个位数字

        P0 = display_code[ten]; // 显示十位数字
        P2 = 0xFE; // 选择第一个数码管
        delay(5); // 延时一段时间
        P2 = 0xFF; // 关闭数码管显示

        P0 = display_code[unit]; // 显示个位数字
        P2 = 0xFD; // 选择第二个数码管
        delay(5); // 延时一段时间
        P2 = 0xFF; // 关闭数码管显示
    }
}


img

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-19 22:07
    关注
    • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:C51教程 第四个51程序:中断控制--外部中断0
    • 除此之外, 这篇博客: 基于C51实现数码管的显示中的 三、实现数码管静态显示 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 🌿 本实验使用SMG1最左边那个数码管作为静态数码管,因为单片机IO口外部都增加了外部上拉电阻,因此P22、P23、P24引脚,默认就是高电平,根据38译码器输出特点,此时Y7引脚(LED8)输出有效。控制代码如下:

      /**************************************************************************************
      实验名称:静态数码管实验
      实验现象:下载程序后“数码管模块”最左边数码管显示数字0																		  
      ***************************************************************************************/
      #include "reg52.h"
      
      typedef unsigned int u16;	//对系统默认数据进行重定义
      typedef unsigned char u8;
      
      #define SMG_A_DP_PORT	P0	//使用宏定义数码管段码口
      
      //共阴极数码管显示0-F的段码数据
      u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
      				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
      
      void main()
      {	
      	SMG_A_DP_PORT=gsmg_code[0];//将数组第一个数据赋值给数码管段选口
      	while(1)
      	{
      	   	
      	}		
      }
      
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 修改了问题 4月19日
  • 创建了问题 4月19日

悬赏问题

  • ¥15 windows2019+nginx+php耗时久
  • ¥15 numpy报错,has no attribute 'bits'
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞
  • ¥15 请帮我看一下这个简易化学配平器的逻辑有什么问题吗?