欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機靜態數碼管0~10間隔一秒測試程序 [打印本頁]

作者: 瀟博    時間: 2025-5-13 18:36
標題: 單片機靜態數碼管0~10間隔一秒測試程序
#include "reg52.h"


typedef unsigned char u8;
typedef unsigned int u16;

#define SMG_A_DP_PORT        P0//數碼管P0端口

u8 gsmg_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x6f,0x77,0x7c,
                                0x39,0x5e,0x79,0x71};//共陰0-F
u8 a=0;//給a賦值0
void ZD0_init(void)
{
          TMOD|=0X01;//選擇為定時器0模式,工作方式1
          TH0=0XFC;//給定時器賦初值,定時10ms
          TL0=0X18;
          ET0=1; //打開定時器0中斷
          EA=1;        //打開總中斷
          TR0=1;//打開定時器
}


void main()
{         

        ZD0_init();//定時器中斷0
        
        while(1)
        {
           switch(a)
                  {
                          case 0:        SMG_A_DP_PORT=~gsmg_code[0];break;
                        case 1:        SMG_A_DP_PORT=~gsmg_code[1];break;
                        case 2:        SMG_A_DP_PORT=~gsmg_code[2];break;
                        case 3:        SMG_A_DP_PORT=~gsmg_code[3];break;
                        case 4:        SMG_A_DP_PORT=~gsmg_code[4];break;
                        case 5:        SMG_A_DP_PORT=~gsmg_code[5];break;
                        case 6:        SMG_A_DP_PORT=~gsmg_code[6];break;
                        case 7:        SMG_A_DP_PORT=~gsmg_code[7];break;
                        case 8:        SMG_A_DP_PORT=~gsmg_code[8];break;
                        case 9:        SMG_A_DP_PORT=~gsmg_code[9];break;
                        case 10:SMG_A_DP_PORT=~gsmg_code[10];break;

                  }

        }
}
        
void ZD0() interrupt 1 //定時器0中斷函數
{
        static u16 i;//定義靜態變量
        TH0=0XFC;//給定時器賦初值,定時1ms
        TL0=0X18;
        i++;
        if(i==1000)
        {
                i=0;
           a++;
           
        }
        if(a==10)//a累加到10

        {
          a=0;//當a累加到10時,a就等于0
        }
}


作者: zhuls    時間: 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達到要求?
作者: xiaobendan001    時間: 2025-5-14 07:27
switch的確沒有必要。if還是可以有的。
作者: 123156fsadf    時間: 2025-5-14 10:18
zhuls 發表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達 ...

取余的計算速度好像比等于慢很多
作者: 瀟博    時間: 2025-5-14 10:24
xiaobendan001 發表于 2025-5-14 07:27
switch的確沒有必要。if還是可以有的。

多謝  我一個初學者 自己研究的
作者: 瀟博    時間: 2025-5-14 10:25
zhuls 發表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達 ...

多謝提醒  剛開始學
作者: cy009    時間: 2025-5-14 10:54
zhuls 發表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達 ...

確定 "a=a%11" 可以滿足要求?

作者: fj51hei    時間: 2025-5-14 10:57
zhuls 發表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達 ...

if(a==10)?直接a=a%11 這個怎么理解?
作者: fj51hei    時間: 2025-5-14 11:00
    case 10:SMG_A_DP_PORT=~gsmg_code[10];break;  你這程序這語句實際能被執行?
作者: gzhdssj    時間: 2025-5-14 11:40
zhuls 發表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達 ...

if占4-5個周期,%占4+div周期,一個周期短,一個代碼簡潔
作者: fj51hei    時間: 2025-5-14 13:53
gzhdssj 發表于 2025-5-14 11:40
if占4-5個周期,%占4+div周期,一個周期短,一個代碼簡潔

代碼是簡潔,但不相關理解困難
作者: xiaobendan001    時間: 2025-5-14 16:40
fj51hei 發表于 2025-5-14 10:57
if(a==10)?直接a=a%11 這個怎么理解?

不是if(a==10)和a=a%10對等,而是if(a==10)a=0;和a=a%10基本上算對等。
實際上if里面是可以增加一些別的代碼的。取余操作顯然是不行的。
作者: zhuls    時間: 2025-5-14 17:40
cy009 發表于 2025-5-14 10:54
確定 "a=a%11" 可以滿足要求?

嗯吶,,是錯了
作者: zhuls    時間: 2025-5-14 17:42
fj51hei 發表于 2025-5-14 10:57
if(a==10)?直接a=a%11 這個怎么理解?

數值錯了,應該是a=a%10
作者: zhuls    時間: 2025-5-14 17:44
gzhdssj 發表于 2025-5-14 11:40
if占4-5個周期,%占4+div周期,一個周期短,一個代碼簡潔

沒驗證過,找時間驗證一下
作者: zhuls    時間: 2025-5-14 23:29
xiaobendan001 發表于 2025-5-14 16:40
不是if(a==10)和a=a%10對等,而是if(a==10)a=0;和a=a%10基本上算對等。
實際上if里面是可以增加一些別的 ...

沒有什么行不行的,各有優缺點。
if(a==10)a=0適合于循序漸進的計數方式,僅適用于a==10,或突發a>10,則此判斷無效,對于a=0來說,約束性不強; 比如異步操作,受到干擾之類的操作。。
a=a%10 ,則是強制性的讓a都在0~9之間。
在C51中,兩者均編譯后,a=a%10 比if(a==10)a=0;多了一個字節,運行時間也長了些。
個人覺得:若MCU沒有硬件除法,則運行效率低于前者;如果是有硬件除法的MCU比如STM32xxx,2者相差無幾,這時a=a%10 代碼強度的明顯強于if(a==10)。。還有個前提,2者的a均為unsigned型的數據。

歡迎探討。

作者: xiaobendan001    時間: 2025-5-15 07:26
zhuls 發表于 2025-5-14 23:29
沒有什么行不行的,各有優缺點。
if(a==10)a=0適合于循序漸進的計數方式,僅適用于a==10,或突發a>10,則 ...

您說的對。
只是大部分書籍上面都沒有講解取余的這種用法吧。
例如我要在a=0的同時,做其他操作,比如b++;out = !out;P1 = table;呢
作者: cy009    時間: 2025-5-15 11:35
1.數碼管代碼表有錯
2.定時器初值注釋有錯





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1