找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 254|回复: 4
收起左侧

求助单片机加减计数器程序 为什么是从第三位开始计数?

[复制链接]
ID:1139469 发表于 2024-12-12 10:09 | 显示全部楼层 |阅读模式
我的加减计数器的个位一直是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();                // 刷新显示
    }
}

回复

使用道具 举报

ID:161164 发表于 2024-12-12 15:29 | 显示全部楼层
代码要配合电路
请提供原理图
回复

使用道具 举报

ID:1130621 发表于 2024-12-12 20:43 | 显示全部楼层
线接错了?从左边计数?
回复

使用道具 举报

ID:1109793 发表于 2024-12-13 19:00 | 显示全部楼层
在主函数WHILE前边加上m = 12;n=34;先看看显示顺序对不对
话说0-9999的四位计数,为啥不直接用int,还要搞这么麻烦?
回复

使用道具 举报

ID:27161 发表于 2024-12-14 12:42 | 显示全部楼层
可能线接错了,检查一下吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表