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

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 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行