各位好:
我是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
}
}
|