久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1348|回復: 26
打印 上一主題 下一主題
收起左側

stc8g1k17的三位數碼管顯示問題

[復制鏈接]
跳轉到指定樓層
樓主
三位數碼管的顯示問題,因為之前的掃描方式亮度不均勻,換了下面這種掃描方式,但更換后發現數值顯示有問題 如我輸入值為 1.1  數碼管三位 應為 1  .   1     0  ; 實際顯示我拍照了 請看大圖        
調試了一下 disx 值 固定為 0 ,1  , 2 , 3時 對應的位選上顯示的數值都是正常的 ,但是設為 disx++; 后就不正常了 。
小白技術不太行 尋求幫助,給我點思路 ,我自己修改就可以的 感謝
#include    "smg.h"
#include    "STC8H.H"
#include     "button.h"
#include    "eeprom.h"
extern void abc(int c);
// 數碼管位選引腳定義
#define DIGIT1 P13
#define DIGIT2 P15
#define DIGIT3 P17
#define DIGIT4 P10
unsigned char segmentCodes[] = {
    0x3F, // 0
    0x06, // 1
    0x5b, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F, // 9
    0x80, // .

};

void smg_io_init()
{
    P1M0 |= 0xee;
    P1M1 &= ~0xee;
    P3M0 |= 0x31;
    P3M1 &= ~0x31;
    P5M0 |= 0x30;
    P5M1 &= ~0x30;

    SEG_A  = 0;
    SEG_B  = 0;
    SEG_C  = 0;
    SEG_D  = 0;
    SEG_E  = 0;
    SEG_F  = 0;
    SEG_G  = 0;
    SEG_DP = 0;  
}

char dppos = 0; // 默認小數點位置在最后一位(百分位)
char displayBuffer[4] = {0}; // 存儲待顯示的數字,包括整數、小數點和兩位小數部分
char disx     =    0;
char AJ ;

void DisplayVoltage(double voltage) {
    unsigned int  sw,gw,x1, x2,number,xs;
    float abc;
    number   =   (int)voltage;
    abc = voltage - number;
    // 將電壓值轉換為整數和小數部分
    sw = number/10 ;
    gw = number%10 ;
    abc *= 100;
    x1 = (int)abc/10;
    x2 = (int)abc%10;
    xs = 10;

    // 設置顯示緩沖區
    if (voltage >= 10.00) {

        displayBuffer[0] = sw ;  // 十位數
        displayBuffer[1] = gw ;
        displayBuffer[3] = xs ;
        displayBuffer[2] = x1;//

        dppos=2;
    } else {
        displayBuffer[0] = gw ; // 個位數
        displayBuffer[3] = xs; // 個位數
        displayBuffer[1] = x1; // 個位數
        displayBuffer[2] = x2; // 小數點后一位

        dppos=1;
    }
}
int f;
extern x1;
unsigned int  digit  ;
void DisplayVoltage1() {

    unsigned char mask = 0x01;
     f++;  
    DIGIT1 = 1;
    DIGIT2 = 1;
    DIGIT3 = 1;

    // 根據digitIndex選中對應的數碼管
    switch (disx) {
    case 0:
        DIGIT1 = 0;
        DIGIT2 = 1;
        DIGIT3 = 1;
        break;
    case 1:
        DIGIT1 = 1;
        DIGIT2 = 0;
        DIGIT3 = 1;
        break;
    case 2:
        DIGIT1 = 1;
        DIGIT2 = 1;
        DIGIT3 = 0;
        break;
    case 3:
        if(dppos ==  1) {
            DIGIT1 = 0;
            DIGIT2 = 1;
            DIGIT3 = 1;
        }
        else if(dppos ==  2) {
            DIGIT1 = 1;
            DIGIT2 = 0;
            DIGIT3 = 1;
        }  
        break;
    }
            digit =  displayBuffer[disx];

        switch (f-1) {

          case 0: SEG_A = (segmentCodes[digit] &   mask) ?      1 : 0; break;
          case 1: SEG_B = (segmentCodes[digit] & (mask << 1)) ? 1 : 0; break;
          case 2: SEG_C = (segmentCodes[digit] & (mask << 2)) ? 1 : 0; break;
          case 3: SEG_D = (segmentCodes[digit] & (mask << 3)) ? 1 : 0; break;
          case 4: SEG_E = (segmentCodes[digit] & (mask << 4)) ? 1 : 0; break;
          case 5: SEG_F = (segmentCodes[digit] & (mask << 5)) ? 1 : 0; break;
          case 6: SEG_G = (segmentCodes[digit] & (mask << 6)) ? 1 : 0; break;
          case 7: SEG_DP =(segmentCodes[digit] & (mask << 7)) ? 1 : 0; break;
        }

    if (f == 9) {
        disx++;
        if(disx > 3)           
           disx=0;      
    }

else if(f  >  9 )   f = 0;



}------------------------------------------------------------------------------
void Timer0_Init()                //100微秒@11.0592MHz
{   
    //定時器時鐘12T模式
    TMOD &= 0xf0;                        //設置定時器模式
    TMOD |= 0x01;
    TL0 = 0xCD;                                //設置定時初始值
    TH0 = 0xD4;                                                        //設置定時初始值
    TF0 = 0;                                //清除TF0標志
    TR0 = 1;                                //定時器0開始計時
    ET0 = 1;
    EA  = 1;
}
void TM0_Isr() interrupt 1 //每隔兩毫秒
{      
    DisplayVoltage1();

    TL0 = 0xCD;                                //設置定時初始值
    TH0 = 0xD4;                                                //設置定時初始值
}

51hei圖片_20241224174546.jpg (747.83 KB, 下載次數: 0)

51hei圖片_20241224174546.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1141252 發表于 2024-12-24 21:09 | 只看該作者
連接數碼管的IO口設置為強推模式了嗎
回復

使用道具 舉報

板凳
ID:1141252 發表于 2024-12-24 21:11 | 只看該作者
連接數碼管的IO口設置為強推模式了么
回復

使用道具 舉報

地板
ID:1133081 發表于 2024-12-24 21:13 | 只看該作者
把原理圖發上來
回復

使用道具 舉報

5#
ID:1109793 發表于 2024-12-25 07:48 | 只看該作者
一個8位機,float,double都用上了。還用了乘
mask<<這里直角用0x01<<不行嗎?弄個變量會更快嗎?后面的?運算有意義嗎?
SEG是段碼,設計時不在同一組IO里面嗎?這么費勁。
白色阻焊不好,透明度不行。還是綠色好看。
回復

使用道具 舉報

6#
ID:1135888 發表于 2024-12-25 09:21 | 只看該作者
power-man 發表于 2024-12-24 21:09
連接數碼管的IO口設置為強推模式了嗎

設置了 推挽了
回復

使用道具 舉報

7#
ID:1135888 發表于 2024-12-25 09:33 | 只看該作者
WL0123 發表于 2024-12-24 21:13
把原理圖發上來

板子不是自己設計的 是給的測試   他的板子  有一個IO口 P12 跟數碼管 按鍵 還有一個燈同時復用了,有點沒想明白怎么做
回復

使用道具 舉報

8#
ID:1135888 發表于 2024-12-25 09:37 | 只看該作者
xiaobendan001 發表于 2024-12-25 07:48
一個8位機,float,double都用上了。還用了乘
mask

,剛開始做這個好多地方不會,您說的這個 我后面都會注意 去改的,剛開始打 的是綠色的,測試的時候不小心燒了 ,后面打板的時候看見有白色的阻焊,就像試一下,打出來發現,好看是挺好看的,但是透明度不行,線路不如綠色的清楚
回復

使用道具 舉報

9#
ID:1109793 發表于 2024-12-25 12:51 | 只看該作者
實在看不太懂,你這意思是每2MS調用一次顯示,每次顯示F++,然后只更新8段的一段,8個段更新完成后再更新一個位。為啥要這樣呢?八個段一次更新完了直接顯示不好嗎?為何要搞這么復雜?你是覺得2ms更新太快了?芯片大概是SSOP20的,應該有一個完整的口給你用的啊。
況且在F==9的時候更新了位,此時直接F = 0;不行嗎?還要再等下一次才能F = 0;
回復

使用道具 舉報

10#
ID:1135888 發表于 2024-12-25 14:16 | 只看該作者
不是自己設計的板子 ,布置的% 這個P12 同時與 按鍵 數碼管 燈三方連接復用  按鍵與數碼管 用定時器分時復用解決了 但燈實在解決不來哦
回復

使用道具 舉報

11#
ID:1109793 發表于 2024-12-25 15:56 | 只看該作者
左語杰 發表于 2024-12-25 14:16
不是自己設計的板子 ,布置的% 這個P12 同時與 按鍵 數碼管 燈三方連接復用  按鍵與數碼管 用定時器分時復 ...

還是先把原理圖弄出來吧
回復

使用道具 舉報

12#
ID:1135888 發表于 2024-12-25 16:00 | 只看該作者
xiaobendan001 發表于 2024-12-25 12:51
實在看不太懂,你這意思是每2MS調用一次顯示,每次顯示F++,然后只更新8段的一段,8個段更新完成后再更新一 ...

嗯吶,  注釋上是兩毫秒是之前的沒改 實際是 50us 進一次中斷  ,就想設計每一段的掃描時間相同 保證 亮度一樣  , 最早的一版是 一次更新八個段 ,即一個段碼 ,但是亮度顯示不均勻   
回復

使用道具 舉報

13#
ID:1135888 發表于 2024-12-25 16:22 | 只看該作者
我上午發了原理圖 不知道 為什么 沒發出來      C:\Users\JS16\Desktop
回復

使用道具 舉報

14#
ID:1135888 發表于 2024-12-25 16:24 | 只看該作者
原理圖來了

51hei截圖_20241225092700.png (99.77 KB, 下載次數: 0)

51hei截圖_20241225092700.png
回復

使用道具 舉報

15#
ID:1133081 發表于 2024-12-25 17:02 | 只看該作者
左語杰 發表于 2024-12-25 09:33
板子不是自己設計的 是給的測試   他的板子  有一個IO口 P12 跟數碼管 按鍵 還有一個燈同時復用了,有點 ...

板子不是你自己設計的,原理圖也還原不了,那你還寫什么程序?所有軟件都是基于硬件條件編寫的。stc8g1k17-20做個三位數碼管顯示的電壓表是輕而易舉的事。你那數碼管動態顯示代碼寫得實在不敢恭維。數碼管、按鍵、還有一個燈同時復用,沒有原理圖誰能搞得清你怎么接線的。
回復

使用道具 舉報

16#
ID:1109793 發表于 2024-12-25 18:28 | 只看該作者
左語杰 發表于 2024-12-25 16:00
嗯吶,  注釋上是兩毫秒是之前的沒改 實際是 50us 進一次中斷  ,就想設計每一段的掃描時間相同 保證 亮 ...

你這樣才亮度不均勻吧,在更新段碼前要先消隱的。
回復

使用道具 舉報

17#
ID:1109793 發表于 2024-12-25 18:47 | 只看該作者
左語杰 發表于 2024-12-25 16:00
嗯吶,  注釋上是兩毫秒是之前的沒改 實際是 50us 進一次中斷  ,就想設計每一段的掃描時間相同 保證 亮 ...

事實上只要時序弄對了,50US和2MS的關系不大,顯示效果也幾乎一樣的
回復

使用道具 舉報

18#
ID:1109793 發表于 2024-12-25 18:57 | 只看該作者

居然可以這樣搞,限流接在COM上面,目前的數碼管這樣其實亮度均勻性也還好,即便要分時均衡亮度,在每次更新段數據前要關閉所有段再打開應該亮的吧。那個板子上大面積的空閑,不至于省這5顆電阻吧。板子看起來好像沒有什么大的耗電,還用一顆類似2575這么大的零件。我實際用一顆限流電阻驅動8個LED燈,同時點亮居然亮度都一樣的,基本上看不到亮度不一樣的。
回復

使用道具 舉報

19#
ID:1133081 發表于 2024-12-25 21:29 | 只看該作者

單就這個硬件設計就決定了數碼管筆段亮度不容易搞均勻。此電路如不是高手炫技就是初學者的習作。單片機引腳使用混亂無序,還搞些復用,18個I/O口不夠用?
回復

使用道具 舉報

20#
ID:161164 發表于 2024-12-25 23:11 | 只看該作者
你的代碼段位只有點亮,沒有熄滅啊
回復

使用道具 舉報

21#
ID:1135888 發表于 2024-12-26 09:50 | 只看該作者
WL0123 發表于 2024-12-25 21:29
單就這個硬件設計就決定了數碼管筆段亮度不容易搞均勻。此電路如不是高手炫技就是初學者的習作。單片機引 ...

他給的io口確實是不夠用的  4個獨立按鍵  11個數碼管   2個2ADC檢測  1個PCA 的pwm 還有一個io口用于某個元器件的使能腳
回復

使用道具 舉報

22#
ID:1135888 發表于 2024-12-26 09:54 | 只看該作者
lkc8210 發表于 2024-12-25 23:11
你的代碼段位只有點亮,沒有熄滅啊

是這個嗎   有熄滅位選 啊  case 0:
        DIGIT1 = 0;
        DIGIT2 = 1;
        DIGIT3 = 1;
        break;
    case 1:
        DIGIT1 = 1;
        DIGIT2 = 0;
        DIGIT3 = 1;
        break;
    case 2:
        DIGIT1 = 1;
        DIGIT2 = 1;
        DIGIT3 = 0;
        break;    只有選中的位選是亮的
回復

使用道具 舉報

23#
ID:1135888 發表于 2024-12-26 09:57 | 只看該作者
lkc8210 發表于 2024-12-25 23:11
你的代碼段位只有點亮,沒有熄滅啊

抱歉 我上一句理解錯了       是段選點亮了 到下一位的時候沒有熄滅
回復

使用道具 舉報

24#
ID:1109793 發表于 2024-12-26 11:24 | 只看該作者
左語杰 發表于 2024-12-26 09:54
是這個嗎   有熄滅位選 啊  case 0:
        DIGIT1 = 0;
        DIGIT2 = 1;

不是CASE0的問題。是每次更新段之前都先熄滅,更新完了再打開。
回復

使用道具 舉報

25#
ID:1133081 發表于 2024-12-26 11:32 | 只看該作者
左語杰 發表于 2024-12-26 09:50
他給的io口確實是不夠用的  4個獨立按鍵  11個數碼管   2個2ADC檢測  1個PCA 的pwm 還有一個io口用于某個 ...

IO口不夠用可以通過合理規劃IO口復用。比如驅動數碼管的8個段,3個位只有第一位有小數點,另兩位的小數點空閑,可以分時復用驅動兩個LED。4個按鍵可以與兩路ADC檢測分時復用(只要被檢模擬量動態范圍大于0小于VCC,按鍵分別接地和VCC即可準確識別),也可以另開一路ADC同時檢測4個按鍵。這樣可以輕松節省4-5個IO口,既不影響數碼管和ADC功能,編程也不復雜。
回復

使用道具 舉報

26#
ID:1135888 發表于 2024-12-26 17:37 | 只看該作者
WL0123 發表于 2024-12-26 11:32
IO口不夠用可以通過合理規劃IO口復用。比如驅動數碼管的8個段,3個位只有第一位有小數點,另兩位的小數點 ...

好的 ,感謝 我重打一個板試一試 老師目前還沒有要求完全跟原版一樣 ,我試試您這個方案,這個板我也不放,繼續試一試 ,感謝
回復

使用道具 舉報

27#
ID:1109793 發表于 2024-12-26 19:25 | 只看該作者
左語杰 發表于 2024-12-26 17:37
好的 ,感謝 我重打一個板試一試 老師目前還沒有要求完全跟原版一樣 ,我試試您這個方案,這個板我也不放 ...

我覺得不如使用數碼管芯片比如TM1650這樣的,電路更簡潔,還能調整亮度,電阻也省了。還支持按鍵,省很多IO
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久精品在线 | 黄色一级毛片 | 欧美一级全黄 | 国产精品久久久久久久久久 | 成人久久 | 一级视频黄色 | 欧美一级在线观看 | 天天精品在线 | 成人在线中文字幕 | 中文字幕av网站 | 欧美另类视频在线 | 日韩a视频 | 欧美亚洲一区二区三区 | 国产在线视频一区二区 | 一级毛片在线播放 | 国产免国产免费 | 成人精品一区二区三区中文字幕 | 亚洲欧洲一区二区 | 91国自产 | 澳门永久av免费网站 | 免费a级毛片在线播放 | 午夜精品福利视频 | 午夜精品网站 | 国产精品亚洲视频 | 欧美视频三区 | 国产999精品久久久久久 | 亚洲一区精品在线 | 一级黄色日本片 | 国产精品久久久久久久三级 | 成人午夜精品 | 久久久亚洲一区 | 精品视频久久久久久 | 天天躁人人躁人人躁狂躁 | 成年人在线观看视频 | 欧美性网站 | av手机免费在线观看 | 天色综合网 | 国产精品黄色 | 欧美黄在线观看 | 九色网址| 成人免费视频网站在线观看 |