找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 845|回复: 12
打印 上一主题 下一主题
收起左侧

求教uchar变量的数值问題

  [复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:860248 发表于 2025-10-16 00:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位好:
我是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
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:277550 发表于 2025-10-16 06:27 | 只看该作者
初始值
uchar Count = 0;                                              // 定义次變变数 Count 置为 0



在程序初始到正常运行过程,没有重新修改数值,那第一次显示就是初始值。
回复

使用道具 举报

板凳
ID:1133081 发表于 2025-10-16 07:13 | 只看该作者
减减小于0后并不是负数而是255、254、253、252........。静态显示个位,当然就显示 5-4-3-2-1-0-9-8...
回复

使用道具 举报

地板
ID:1064915 发表于 2025-10-16 08:18 | 只看该作者
0-1=F
F%10=5
E%10=4
D%10=3
C%10=2
B%10=1
A%10=0
9%10=9
8%10=8
7%10=7
回复

使用道具 举报

5#
ID:140489 发表于 2025-10-16 09:15 | 只看该作者
去学学吴坚鸿的教程吧,你学这种按键处理是在浪费时间
回复

使用道具 举报

6#
ID:458247 发表于 2025-10-16 09:15 | 只看该作者
初始值:0
第一次减1:0-1=255
第二次减1:255-1=254
......
回复

使用道具 举报

7#
ID:140489 发表于 2025-10-16 09:17 | 只看该作者
回复

使用道具 举报

8#
ID:94031 发表于 2025-10-16 09:48 | 只看该作者
unsigned char是0-255,没有负数。
回复

使用道具 举报

9#
ID:69038 发表于 2025-10-16 11:02 | 只看该作者
8位机中,
char:-128~127
uchar:0-255
回复

使用道具 举报

10#
ID:1109793 发表于 2025-10-16 12:20 | 只看该作者
要有负数就不能定义无符号的
另外数码管要显示-号大概是要自己处理一下,它自己应该不会
回复

使用道具 举报

11#
ID:584814 发表于 2025-10-16 15:35 | 只看该作者
当计算值超过系统规定时,就会发生溢出。溢出后的结果各不相同,此处如楼上所述是环归。
建议以后写此类代码时自己加了防溢出处理,这样就不会呵呵了。
另:在Count++;前加 if(Count == 200 ) Count = 100 ;在Count--;前加 if(Count == 0 ) Count = 100 ;
这样你的程序按加减键只会在 0-9 之间循环变化了,也适合两位数0-99。
回复

使用道具 举报

12#
ID:860248 发表于 2025-10-17 00:31 | 只看该作者
Uchar 0 再減 1 是转回255
明白了, 謝謝各位
回复

使用道具 举报

13#
ID:1132182 发表于 2025-10-17 08:59 | 只看该作者
会越界
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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