我的加减计数器的个位一直是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(); // 刷新显示
}
}
|