亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1285|回復: 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 單片機教程網

快速回復 返回頂部 返回列表