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; // 关闭数码管显示
}
}
🌿 本实验使用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)
{
}
}
num是局部变量啊,在main里才能用