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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1501|回復(fù): 26
收起左側(cè)

stc8g1k17的三位數(shù)碼管顯示問題

[復(fù)制鏈接]
ID:1135888 發(fā)表于 2024-12-24 17:56 | 顯示全部樓層 |閱讀模式
三位數(shù)碼管的顯示問題,因?yàn)橹暗膾呙璺绞搅炼炔痪鶆颍瑩Q了下面這種掃描方式,但更換后發(fā)現(xiàn)數(shù)值顯示有問題 如我輸入值為 1.1  數(shù)碼管三位 應(yīng)為 1  .   1     0  ; 實(shí)際顯示我拍照了 請看大圖        
調(diào)試了一下 disx 值 固定為 0 ,1  , 2 , 3時(shí) 對應(yīng)的位選上顯示的數(shù)值都是正常的 ,但是設(shè)為 disx++; 后就不正常了 。
小白技術(shù)不太行 尋求幫助,給我點(diǎn)思路 ,我自己修改就可以的 感謝
#include    "smg.h"
#include    "STC8H.H"
#include     "button.h"
#include    "eeprom.h"
extern void abc(int c);
// 數(shù)碼管位選引腳定義
#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; // 默認(rèn)小數(shù)點(diǎn)位置在最后一位(百分位)
char displayBuffer[4] = {0}; // 存儲待顯示的數(shù)字,包括整數(shù)、小數(shù)點(diǎn)和兩位小數(shù)部分
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;
    // 將電壓值轉(zhuǎn)換為整數(shù)和小數(shù)部分
    sw = number/10 ;
    gw = number%10 ;
    abc *= 100;
    x1 = (int)abc/10;
    x2 = (int)abc%10;
    xs = 10;

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

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

        dppos=2;
    } else {
        displayBuffer[0] = gw ; // 個(gè)位數(shù)
        displayBuffer[3] = xs; // 個(gè)位數(shù)
        displayBuffer[1] = x1; // 個(gè)位數(shù)
        displayBuffer[2] = x2; // 小數(shù)點(diǎn)后一位

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

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

    // 根據(jù)digitIndex選中對應(yīng)的數(shù)碼管
    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
{   
    //定時(shí)器時(shí)鐘12T模式
    TMOD &= 0xf0;                        //設(shè)置定時(shí)器模式
    TMOD |= 0x01;
    TL0 = 0xCD;                                //設(shè)置定時(shí)初始值
    TH0 = 0xD4;                                                        //設(shè)置定時(shí)初始值
    TF0 = 0;                                //清除TF0標(biāo)志
    TR0 = 1;                                //定時(shí)器0開始計(jì)時(shí)
    ET0 = 1;
    EA  = 1;
}
void TM0_Isr() interrupt 1 //每隔兩毫秒
{      
    DisplayVoltage1();

    TL0 = 0xCD;                                //設(shè)置定時(shí)初始值
    TH0 = 0xD4;                                                //設(shè)置定時(shí)初始值
}
51hei圖片_20241224174546.jpg
回復(fù)

使用道具 舉報(bào)

ID:1141252 發(fā)表于 2024-12-24 21:09 | 顯示全部樓層
連接數(shù)碼管的IO口設(shè)置為強(qiáng)推模式了嗎
回復(fù)

使用道具 舉報(bào)

ID:1141252 發(fā)表于 2024-12-24 21:11 | 顯示全部樓層
連接數(shù)碼管的IO口設(shè)置為強(qiáng)推模式了么
回復(fù)

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2024-12-24 21:13 | 顯示全部樓層
把原理圖發(fā)上來
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-12-25 07:48 | 顯示全部樓層
一個(gè)8位機(jī),float,double都用上了。還用了乘
mask<<這里直角用0x01<<不行嗎?弄個(gè)變量會更快嗎?后面的?運(yùn)算有意義嗎?
SEG是段碼,設(shè)計(jì)時(shí)不在同一組IO里面嗎?這么費(fèi)勁。
白色阻焊不好,透明度不行。還是綠色好看。
回復(fù)

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-25 09:21 | 顯示全部樓層
power-man 發(fā)表于 2024-12-24 21:09
連接數(shù)碼管的IO口設(shè)置為強(qiáng)推模式了嗎

設(shè)置了 推挽了
回復(fù)

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-25 09:33 | 顯示全部樓層
WL0123 發(fā)表于 2024-12-24 21:13
把原理圖發(fā)上來

板子不是自己設(shè)計(jì)的 是給的測試   他的板子  有一個(gè)IO口 P12 跟數(shù)碼管 按鍵 還有一個(gè)燈同時(shí)復(fù)用了,有點(diǎn)沒想明白怎么做
回復(fù)

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-25 09:37 | 顯示全部樓層
xiaobendan001 發(fā)表于 2024-12-25 07:48
一個(gè)8位機(jī),float,double都用上了。還用了乘
mask

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-25 14:16 | 顯示全部樓層
不是自己設(shè)計(jì)的板子 ,布置的% 這個(gè)P12 同時(shí)與 按鍵 數(shù)碼管 燈三方連接復(fù)用  按鍵與數(shù)碼管 用定時(shí)器分時(shí)復(fù)用解決了 但燈實(shí)在解決不來哦
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-12-25 15:56 | 顯示全部樓層
左語杰 發(fā)表于 2024-12-25 14:16
不是自己設(shè)計(jì)的板子 ,布置的% 這個(gè)P12 同時(shí)與 按鍵 數(shù)碼管 燈三方連接復(fù)用  按鍵與數(shù)碼管 用定時(shí)器分時(shí)復(fù) ...

還是先把原理圖弄出來吧
回復(fù)

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-25 16:00 | 顯示全部樓層
xiaobendan001 發(fā)表于 2024-12-25 12:51
實(shí)在看不太懂,你這意思是每2MS調(diào)用一次顯示,每次顯示F++,然后只更新8段的一段,8個(gè)段更新完成后再更新一 ...

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

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-25 16:22 | 顯示全部樓層
我上午發(fā)了原理圖 不知道 為什么 沒發(fā)出來      C:\Users\JS16\Desktop
回復(fù)

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-25 16:24 | 顯示全部樓層
原理圖來了
51hei截圖_20241225092700.png
回復(fù)

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2024-12-25 17:02 | 顯示全部樓層
左語杰 發(fā)表于 2024-12-25 09:33
板子不是自己設(shè)計(jì)的 是給的測試   他的板子  有一個(gè)IO口 P12 跟數(shù)碼管 按鍵 還有一個(gè)燈同時(shí)復(fù)用了,有點(diǎn) ...

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

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-12-25 18:28 | 顯示全部樓層
左語杰 發(fā)表于 2024-12-25 16:00
嗯吶,  注釋上是兩毫秒是之前的沒改 實(shí)際是 50us 進(jìn)一次中斷  ,就想設(shè)計(jì)每一段的掃描時(shí)間相同 保證 亮 ...

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

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-12-25 18:47 | 顯示全部樓層
左語杰 發(fā)表于 2024-12-25 16:00
嗯吶,  注釋上是兩毫秒是之前的沒改 實(shí)際是 50us 進(jìn)一次中斷  ,就想設(shè)計(jì)每一段的掃描時(shí)間相同 保證 亮 ...

事實(shí)上只要時(shí)序弄對了,50US和2MS的關(guān)系不大,顯示效果也幾乎一樣的
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-12-25 18:57 | 顯示全部樓層

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

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2024-12-25 21:29 | 顯示全部樓層

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

使用道具 舉報(bào)

ID:161164 發(fā)表于 2024-12-25 23:11 | 顯示全部樓層
你的代碼段位只有點(diǎn)亮,沒有熄滅啊
回復(fù)

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-26 09:50 | 顯示全部樓層
WL0123 發(fā)表于 2024-12-25 21:29
單就這個(gè)硬件設(shè)計(jì)就決定了數(shù)碼管筆段亮度不容易搞均勻。此電路如不是高手炫技就是初學(xué)者的習(xí)作。單片機(jī)引 ...

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

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-26 09:54 | 顯示全部樓層
lkc8210 發(fā)表于 2024-12-25 23:11
你的代碼段位只有點(diǎn)亮,沒有熄滅啊

是這個(gè)嗎   有熄滅位選 啊  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;    只有選中的位選是亮的
回復(fù)

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-26 09:57 | 顯示全部樓層
lkc8210 發(fā)表于 2024-12-25 23:11
你的代碼段位只有點(diǎn)亮,沒有熄滅啊

抱歉 我上一句理解錯(cuò)了       是段選點(diǎn)亮了 到下一位的時(shí)候沒有熄滅
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-12-26 11:24 | 顯示全部樓層
左語杰 發(fā)表于 2024-12-26 09:54
是這個(gè)嗎   有熄滅位選 啊  case 0:
        DIGIT1 = 0;
        DIGIT2 = 1;

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

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2024-12-26 11:32 | 顯示全部樓層
左語杰 發(fā)表于 2024-12-26 09:50
他給的io口確實(shí)是不夠用的  4個(gè)獨(dú)立按鍵  11個(gè)數(shù)碼管   2個(gè)2ADC檢測  1個(gè)PCA 的pwm 還有一個(gè)io口用于某個(gè) ...

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

使用道具 舉報(bào)

ID:1135888 發(fā)表于 2024-12-26 17:37 | 顯示全部樓層
WL0123 發(fā)表于 2024-12-26 11:32
IO口不夠用可以通過合理規(guī)劃IO口復(fù)用。比如驅(qū)動數(shù)碼管的8個(gè)段,3個(gè)位只有第一位有小數(shù)點(diǎn),另兩位的小數(shù)點(diǎn) ...

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

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-12-26 19:25 | 顯示全部樓層
左語杰 發(fā)表于 2024-12-26 17:37
好的 ,感謝 我重打一個(gè)板試一試 老師目前還沒有要求完全跟原版一樣 ,我試試您這個(gè)方案,這個(gè)板我也不放 ...

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

使用道具 舉報(bào)

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91麻豆产精品久久久久久夏晴子 | 一区二区视频 | 91精品国产一区二区三区 | 三级特黄特色视频 | 紧缚调教一区二区三区视频 | 欧美日韩在线一区 | 超碰在线国产 | 久久久影院| 久久机热| 欧美性猛片aaaaaaa做受 | 国产日产久久高清欧美一区 | 中文字幕人成人 | 亚洲综合在线一区 | 亚洲a级 | 亚洲精品欧美 | 男女午夜激情视频 | 99国产精品99久久久久久 | 亚洲视频免费在线观看 | 四虎成人在线播放 | 国产精品女人久久久 | 国产精品高潮呻吟久久 | 在线国产视频 | 视频二区国产 | 亚洲乱码国产乱码精品精98午夜 | 荷兰欧美一级毛片 | 亚洲一区二区在线播放 | 国产精品视屏 | 成人午夜 | 91精品国产一二三 | 成人h视频在线观看 | 欧洲亚洲一区 | 亚洲一区二区中文字幕在线观看 | 国产免费一区 | 欧美日韩一区二区电影 | 成人久草| 中文字幕在线观看一区 | 搞黄网站在线观看 | 欧美精品福利 | 成人性生交大片免费看中文带字幕 | 欧美亚洲国产日韩 | 国产人成精品一区二区三 |