我的加減計數器的個位一直是0,計數是從第三位開始的;
#include <stc8h.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1 = P1^0; // 加
sbit k2 = P1^1; // 減
sbit k3 = P1^2; // 復位
void key(void);
void display(void);
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f}; // 數碼管段碼
uchar m = 0, n = 0; // 初始化為 0000
// 延時函數
void delayms(uint xms) {
uint i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--);
}
// 數碼管顯示程序
void display(void) {
P2 = 0x08; // 個位
P0 = table[m % 10]; // 顯示個位數字
delayms(5);
P2 = 0x04; // 十位
P0 = table[m / 10]; // 顯示十位數字
delayms(5);
P2 = 0x02; // 百位
P0 = table[n % 10]; // 顯示百位數字
delayms(5);
P2 = 0x01; // 千位
P0 = table[n / 10]; // 顯示千位數字
delayms(5);
}
// 按鍵處理程序
void key() {
if (k1 == 0) { // 檢測加按鍵是否按下
delayms(10); // 延時消抖
if (k1 == 0) { // 再次檢測
m++;
if (m >= 100) {
m = 0;
n++;
if (n >= 100) {
m = 99; // 最大顯示 9999
n = 99;
}
}
}
while (k1 == 0); // 等待松開
}
if (k2 == 0) { // 檢測減按鍵
delayms(10); // 延時消抖
if (k2 == 0) {
if (m == 0 && n == 0) {
m = 0; // 最小值 0000
n = 0;
} else {
if (m == 0) {
m = 99;
n--;
} else {
m--;
}
}
}
while (k2 == 0); // 等待松開
}
if (k3 == 0) { // 檢測復位按鍵
delayms(10);
if (k3 == 0) {
m = 0; // 復位顯示 0000
n = 0;
}
while (k3 == 0); // 等待松開
}
}
// 主函數
void main() {
// 配置端口模式
P2M0 = 0xff;
P2M1 = 0x00;
P1M0 = 0xff;
P1M1 = 0x00;
P0M0 = 0xff;
P0M1 = 0x00;
P4M0 = 0xff;
P4M1 = 0x00;
while (1) {
key(); // 檢測按鍵
display(); // 刷新顯示
}
}
|