各位好:
我是C51单片机初学者, 做了一个用中断INT0 INT1作加減数, 靜态数码管显示
程序执行时, 我发现当开始时, Count=0, 数码管显示0
我一按键触发 INT1 (減), 显示由0变成5, 我按INT0加后再減, 也是減到0后, 再継续按INT1就显示 5-4-3-2-1-0-9-8...
unsigned char 不是不能有负数吗! 请教一下, 第一次显示5时, 其实Count的数值真正是多少呢?
謝謝
程序如下: (用普中HC6800-EM3开发板)
// 處理器 : STC89C52RC @11.0592Mhz
// 内 容:通过中断接口P3.2 作加键 P3.3 作減键
// 让靜态数码管累加或递減 显示0~
#include <reg52.h> // 使用reg52.h头文件
#define uchar unsigned char // 用uchar代替unsigned char,无符号字符型数。
#define uint unsigned int // 用uint代替unsigned int,无符号整型数。
#define SMG_Port P0 // 定义 SMG_Port 替代 P0
sbit KEY_ADD = P3^2; // 定义位变数 KEY 代替P3.2端口
sbit KEY_DEC = P3^3; // 定义位变数 KEY 代替P3.2端口
uchar Count = 0; // 定义次變变数 Count 置为 0
uchar code PSMGChar[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, // 共阳数码管数组 0,1,2,3,4,5,6,7
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; // 共阳数码管数组 8,9,A,B,C,D,E,F
void Delay(uint t){ // 延时程序,延时时间为 10ms*t
uint i,j;
for(i=0; i<t; i++)
for(j=0; j<1827; j++);
}
void INT_Init(void) { // 外部中断INT初始化
EA = 1; // 全局中断 开
EX0 = 1; // INT0外部中断 允许
IT0 = 1; // 下降沿触发, 即按下由高电平转为低电平瞬间
EX1 = 1; // INT1外部中断 允许
IT1 = 1; // 下降沿触发, 即按下由高电平转为低电平瞬间
}
void INT0_Key(void) interrupt 0 using 1 { // INT0外部中断程序
EX0 = 0; // INT0外部中断关闭
if(KEY_ADD == 0) { // 如果K1按下
Delay(3); // 延时消抖
if(KEY_ADD == 0) { // 如果K1真按下
Delay(3); // 延时消抖
Count++; // Count累加1
}
}
Delay(10); // 延时100ms后再等待跳回主程序执行
EX0 = 1; // INT0外部中断 允许
}
void INT1_Key(void) interrupt 2 using 2 { // INT1外部中断程序
EX1 = 0; // INT1外部中断关闭
if(KEY_DEC == 0) { // 如果K5按下
Delay(3); // 延时消抖
if(KEY_DEC == 0) { // 如果K5真按下
Delay(3); // 延时消抖
Count--; // Count递減1
}
}
Delay(10); // 延时300ms后再等待跳回主程序执行
EX1 = 1; // INT1外部中断 允许
}
void main(void) { // 主程序
INT_Init(); // INT 外部中断0初始化
while(1) { // 主循环
SMG_Port = PSMGChar[Count%10]; // 靜态数码管显示累加数除10的余数
Delay(10); // 延时100ms
}
}
|