標(biāo)題: C語(yǔ)言如何分離每一位顯示變量? [打印本頁(yè)]

作者: samxon    時(shí)間: 2023-11-19 16:07
標(biāo)題: C語(yǔ)言如何分離每一位顯示變量?
請(qǐng)幫忙看看,為什么分離不出正確的結(jié)果,現(xiàn)在分離結(jié)果的0.03, 我需要的是771

uchar adc_result;
uint adcresult_0,adcresult_1,adcresult_2;


                     adc_result = 771;
                        adcresult_0= (adc_result/100)%100;
                        adcresult_1= (adc_result/10)%10;
                        adcresult_2= adc_result%10;

                        DisplayData[0]=DIG_CODE[adcresult_0]|0x80;
                        DisplayData[1]=DIG_CODE[adcresult_1];
                        DisplayData[2]=DIG_CODE[adcresult_2];


作者: Hephaestus    時(shí)間: 2023-11-19 16:33
uchar adc_result;
adc_result = 771;

上面這兩句反復(fù)的看,直到看出問(wèn)題為止。
作者: csmyldl    時(shí)間: 2023-11-19 16:40
adcresult_0= (adc_result/100)%100;
adcresult_1= (adc_result/10)%10;
adcresult_2= adc_result%10;
這三行應(yīng)該為:
adcresult_0= adc_result/100;
adcresult_1= (adc_result/10)%10;
adcresult_2= adc_result%10;
作者: Hephaestus    時(shí)間: 2023-11-19 16:48
csmyldl 發(fā)表于 2023-11-19 16:40
adcresult_0= (adc_result/100)%100;
adcresult_1= (adc_result/10)%10;
adcresult_2= adc_result%10; ...

這三行你寫(xiě)錯(cuò)了,樓主是對(duì)的。
作者: samxon    時(shí)間: 2023-11-19 17:10
csmyldl 發(fā)表于 2023-11-19 16:40
adcresult_0= (adc_result/100)%100;
adcresult_1= (adc_result/10)%10;
adcresult_2= adc_result%10; ...

還是不顯示小數(shù)點(diǎn)后的數(shù)。

uchar adc_result;
uint adcresult_0,adcresult_1,adcresult_2;
uchar GetADCResult();

        adc_result = GetADCResult();       

                        //0-1-2母線電壓顯示
                        //3-4-5功率顯示
                        if(adc_result<10)
                        {
                        adcresult_0= adc_result/100;
                        adcresult_1= adc_result/10%10;
                        adcresult_2= adc_result%10;
                        DisplayData[0]=DIG_CODE[adcresult_0]|0x80;
                        DisplayData[1]=DIG_CODE[adcresult_1];
                        DisplayData[2]=DIG_CODE[adcresult_2];
                        }
                        else if(adc_result>10)
                        {
                        adcresult_0= adc_result/10;
                        adcresult_1= adc_result%10;
                        adcresult_2= (adc_result*10)%10;
                        DisplayData[0]=DIG_CODE[adcresult_0];
                        DisplayData[1]=DIG_CODE[adcresult_1]|0x80;
                        DisplayData[2]=DIG_CODE[adcresult_2];
                        }                       

uchar GetADCResult()
{

        ADC_CONTR = 0x89;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x10)); //等待ADC轉(zhuǎn)換完成
        ADC_CONTR &= ~0x10; //CLOSE ADC
        return (ADC_RES*256+ADC_RESL)*(5.05)/1024/0.08;       
}
作者: 人中狼    時(shí)間: 2023-11-19 17:13
搞清除法的結(jié)果是什么,搞清取余的結(jié)果是什么,搞清要的是哪一位數(shù)字,板凳的錯(cuò)了其中一行代碼
作者: samxon    時(shí)間: 2023-11-19 17:30
人中狼 發(fā)表于 2023-11-19 17:13
搞清除法的結(jié)果是什么,搞清取余的結(jié)果是什么,搞清要的是哪一位數(shù)字,板凳的錯(cuò)了其中一行代碼

懷疑是不是ADC沒(méi)有傳小數(shù)位過(guò)來(lái)
作者: samxon    時(shí)間: 2023-11-19 17:34
人中狼 發(fā)表于 2023-11-19 17:13
搞清除法的結(jié)果是什么,搞清取余的結(jié)果是什么,搞清要的是哪一位數(shù)字,板凳的錯(cuò)了其中一行代碼

真的沒(méi)發(fā)現(xiàn)錯(cuò)誤,我用excel模擬計(jì)算沒(méi)有錯(cuò)誤
作者: Hephaestus    時(shí)間: 2023-11-19 17:42
samxon 發(fā)表于 2023-11-19 17:34
真的沒(méi)發(fā)現(xiàn)錯(cuò)誤,我用excel模擬計(jì)算沒(méi)有錯(cuò)誤

把我在沙發(fā)的發(fā)言讀100遍。
作者: samxon    時(shí)間: 2023-11-19 17:57
Hephaestus 發(fā)表于 2023-11-19 17:42
把我在沙發(fā)的發(fā)言讀100遍。

老師,已看101遍,還是發(fā)現(xiàn)不了問(wèn)題。第三位始終顯示0
adc_result = 12.76543;

                        //0-1-2母線電壓顯示
                        //3-4-5功率顯示
                        if(adc_result<10)
                        {
                        adcresult_0= adc_result/100;
                        adcresult_1= adc_result/10%10;
                        adcresult_2= adc_result%10;
                        DisplayData[0]=DIG_CODE[adcresult_0]|0x80;
                        DisplayData[1]=DIG_CODE[adcresult_1];
                        DisplayData[2]=DIG_CODE[adcresult_2];
                        }
                        else if(adc_result>10)
                        {
                        adcresult_0= adc_result/10;
                        adcresult_1= adc_result%10;
                        adcresult_2= adc_result*10%10;
                        DisplayData[0]=DIG_CODE[adcresult_0];
                        DisplayData[1]=DIG_CODE[adcresult_1]|0x80;
                        DisplayData[2]=DIG_CODE[adcresult_2];
                        }                       

作者: 君工創(chuàng)    時(shí)間: 2023-11-19 17:58
Hephaestus 發(fā)表于 2023-11-19 17:42
把我在沙發(fā)的發(fā)言讀100遍。

被門(mén)檻石絆腳了,只要你看出問(wèn)題了,就是一大進(jìn)步。
作者: 君工創(chuàng)    時(shí)間: 2023-11-19 18:09
君工創(chuàng) 發(fā)表于 2023-11-19 17:58
被門(mén)檻石絆腳了,只要你看出問(wèn)題了,就是一大進(jìn)步。

                        adcresult_0= adc_result/100;
                        adcresult_1= adc_result/10%10;
                        adcresult_2= adc_result%10;
中間行錯(cuò)了,應(yīng)改為,adcresult_0= adc_result/100;
                                adcresult_1= adc_result%100/10;
                                adcresult_2= adc_result%10;
作者: 指北針    時(shí)間: 2023-11-19 18:10
沙發(fā)的內(nèi)容很重要的,
作者: fj51hei    時(shí)間: 2023-11-19 18:24
實(shí)際看看每個(gè)寄存器在遠(yuǎn)行后的值,然后按自己寫(xiě)程序的思路手工算算運(yùn)行后的值就可以知道問(wèn)題出在哪里
作者: Hephaestus    時(shí)間: 2023-11-19 18:49
你們居然都看不懂我在沙發(fā)的發(fā)言,我在說(shuō)清楚一些
根據(jù):uchar adc_result;

可知下面的語(yǔ)句:
adc_result=771;
編譯器會(huì)翻譯成:
adc_result=3;
作者: 指北針    時(shí)間: 2023-11-19 18:50
好好看看沙發(fā)的回復(fù),問(wèn)題就在那里
作者: 君工創(chuàng)    時(shí)間: 2023-11-19 19:15
樓主沒(méi)看出沙發(fā)的問(wèn)題呢。
作者: 鵜鶘    時(shí)間: 2023-11-19 19:30
samxon 發(fā)表于 2023-11-19 17:57
老師,已看101遍,還是發(fā)現(xiàn)不了問(wèn)題。第三位始終顯示0
adc_result = 12.76543;

都跟你說(shuō)了,就是哪兩句話的問(wèn)題,要是看100遍不行的話,那就看200遍....

不過(guò)我可以提示你一下,adc_result = 257;行不行?如果行的話,那就只好請(qǐng)你忠實(shí)地按照C規(guī)則執(zhí)行下行語(yǔ)句:

while ("adc_result = 257" 行);
作者: 鵜鶘    時(shí)間: 2023-11-19 19:39
Hephaestus 發(fā)表于 2023-11-19 16:48
這三行你寫(xiě)錯(cuò)了,樓主是對(duì)的。

都是對(duì)的。
作者: samxon    時(shí)間: 2023-11-19 20:06
Hephaestus 發(fā)表于 2023-11-19 18:49
你們居然都看不懂我在沙發(fā)的發(fā)言,我在說(shuō)清楚一些
根據(jù):uchar adc_result;

如果變成3了,為什么第二位又顯示正常呢
作者: Hephaestus    時(shí)間: 2023-11-19 20:18
samxon 發(fā)表于 2023-11-19 20:06
如果變成3了,為什么第二位又顯示正常呢

把樓主的發(fā)言默寫(xiě)100遍,樓主要顯示7.71,實(shí)際顯示0.03
作者: wulin    時(shí)間: 2023-11-19 20:44
本帖最后由 wulin 于 2023-11-19 21:04 編輯

        uint adc_result = 771;
//        uint adcresult_0,adcresult_1,adcresult_2;
        
        
//        adc_result = 771;
//        adcresult_0= (adc_result/100)%100;
//        adcresult_1= (adc_result/10)%10;
//        adcresult_2= adc_result%10;
        
        DisplayData[0]=DIG_CODE[adc_result/100%10]|0x80;
        DisplayData[1]=DIG_CODE[adc_result/10%10];
        DisplayData[2]=DIG_CODE[adc_result%10];
作者: 蛋進(jìn)涼絕    時(shí)間: 2023-11-19 20:48
uchar adc_result;
作者: 蛋進(jìn)涼絕    時(shí)間: 2023-11-19 20:50
uchar adc_result;
adc_result = 771;
771-256-256-256=3



作者: samxon    時(shí)間: 2023-11-19 21:06
#define uint unsigned int
#define uchar unsigned char
uint adc_result;
adc_result=12.5
一樣分離不出小數(shù)點(diǎn)后的數(shù)
                      adcresult_0= adc_result/10;
                        adcresult_1= adc_result%10;
                        adcresult_2= adc_result*10%10;
                        DisplayData[0]=DIG_CODE[adcresult_0];
                        DisplayData[1]=DIG_CODE[adcresult_1]|0x80;
                        DisplayData[2]=DIG_CODE[adcresult_2];

作者: samxon    時(shí)間: 2023-11-19 21:09
#define uint unsigned int;
uint adc_result=12.3
adcresult_2= adc_result*10%10;
DisplayData[2]=DIG_CODE[adcresult_2];
還是分離不出第三位
作者: Hephaestus    時(shí)間: 2023-11-19 21:14
samxon 發(fā)表于 2023-11-19 21:06
#define uint unsigned int
#define uchar unsigned char
uint adc_result;

uint adc_result;
adc_result=12.5

這次矛盾出在這兩句
作者: samxon    時(shí)間: 2023-11-19 21:24
Hephaestus 發(fā)表于 2023-11-19 21:14
uint adc_result;
adc_result=12.5

float adc_result;
adc_result = 12.5

作者: 人中狼    時(shí)間: 2023-11-19 21:26
數(shù)據(jù)類型要符合目標(biāo)的數(shù)據(jù)類型
作者: Hephaestus    時(shí)間: 2023-11-19 21:36
samxon 發(fā)表于 2023-11-19 21:24
float adc_result;
adc_result = 12.5

還是不對(duì),float不能用/(整除)和%兩個(gè)運(yùn)算。
作者: zhuls    時(shí)間: 2023-11-19 21:40
如果:
    uchar adc_result;  //那么后面的“adc_result = 771;"這個(gè)就不對(duì)了,除非你的uchar 不是 “unsigned char”

  這個(gè):
     adcresult_0= (adc_result/100)%100;//=>最好能寫(xiě)成adc_result/100)%10;雖然結(jié)果是一樣的。
   而且  adcresult_0也不用定義成uint,除非你的uint是“unsigned char”;雖然結(jié)果是一樣的。

還是按常規(guī)化的書(shū)寫(xiě)格式比較好,非常規(guī)的格式指不定會(huì)有什么異常發(fā)生。



作者: zhuls    時(shí)間: 2023-11-19 21:46
samxon 發(fā)表于 2023-11-19 17:30
懷疑是不是ADC沒(méi)有傳小數(shù)位過(guò)來(lái)

uchar GetADCResult()//  uchar這個(gè)怎么會(huì)有小數(shù)點(diǎn)回傳?有小數(shù)點(diǎn)是float
作者: 君工創(chuàng)    時(shí)間: 2023-11-19 22:07
樓主定義的變量是:uchar adc_result;
作者: Hephaestus    時(shí)間: 2023-11-19 22:15
zhuls 發(fā)表于 2023-11-19 21:40
如果:
    uchar adc_result;  //那么后面的“adc_result = 771;"這個(gè)就不對(duì)了,除非你的uchar 不是 “u ...

你以為寫(xiě)成char或者unsigned char就是8位了?naive!我用過(guò)char是16位的編譯器,你見(jiàn)識(shí)太少。
作者: samxon    時(shí)間: 2023-11-20 08:47
Hephaestus 發(fā)表于 2023-11-19 21:36
還是不對(duì),float不能用/(整除)和%兩個(gè)運(yùn)算。

感謝你的指導(dǎo),把C教程數(shù)據(jù)類型又看了一遍,現(xiàn)在正常了。
作者: zhuls    時(shí)間: 2023-11-20 08:49
Hephaestus 發(fā)表于 2023-11-19 22:15
你以為寫(xiě)成char或者unsigned char就是8位了?naive!我用過(guò)char是16位的編譯器,你見(jiàn)識(shí)太少。

你用的16位的是什么編譯器?說(shuō)出來(lái)讓我見(jiàn)識(shí)一下。
作者: 1657531323    時(shí)間: 2023-11-20 08:50
應(yīng)改為:adcresult_0= adc_result/100;                                 adcresult_1= adc_result%100/10;
作者: qq603599910    時(shí)間: 2023-11-20 10:00
這個(gè)我也偶爾會(huì)煩這樣的錯(cuò)誤,因?yàn)榻?jīng)常會(huì)處理十進(jìn)制5-6位數(shù),然后全局變量定義時(shí)沒(méi)有考慮到大數(shù)值超標(biāo)問(wèn)題.
作者: jiban530    時(shí)間: 2023-11-20 10:04
數(shù)據(jù)類型錯(cuò)了,后面的一切都是白干。這個(gè)很重要
作者: Hephaestus    時(shí)間: 2023-11-20 13:51
zhuls 發(fā)表于 2023-11-20 08:49
你用的16位的是什么編譯器?說(shuō)出來(lái)讓我見(jiàn)識(shí)一下。

你去ti官網(wǎng)找spru514z這份文檔看看。
作者: csmyldl    時(shí)間: 2023-11-20 14:16
uchar adc_result;
adc_result = 771;
adc_result的取值范圍只能是0-255,adc_result = 771;后,默認(rèn)adc_result的值是255
作者: Hephaestus    時(shí)間: 2023-11-20 14:31
csmyldl 發(fā)表于 2023-11-20 14:16
uchar adc_result;
adc_result = 771;
adc_result的取值范圍只能是0-255,adc_result = 771;后,默認(rèn)adc ...

又錯(cuò)了,數(shù)據(jù)大于類型所能容納的時(shí)候,是截?cái)喔呶坏摹D惆?71換成二進(jìn)制就能知道為什么你以為是255,事實(shí)卻是3
作者: zhuls    時(shí)間: 2023-11-20 17:05
Hephaestus 發(fā)表于 2023-11-20 13:51
你去ti官網(wǎng)找spru514z這份文檔看看。

學(xué)習(xí)了~

然而,文檔中所說(shuō)的中wide character(w_char) ,并不是character(char),不是同一回事。如同undigned char 和char 一樣有區(qū)別的。
而且,據(jù)我所知,C51是不支持w_char的,雖然我無(wú)法確定樓主用的是不是C51。

歡迎探討~~
作者: Hephaestus    時(shí)間: 2023-11-20 18:45
zhuls 發(fā)表于 2023-11-20 17:05
學(xué)習(xí)了~

然而,文檔中所說(shuō)的中wide character(w_char) ,并不是character(char),不是同一回 ...



這是基本數(shù)據(jù)類型,跟wchar有個(gè)蛋關(guān)系???

wchar是字符串才要有的,用于區(qū)分ASCII與UTF-8 Unicode編碼,你對(duì)上位機(jī)編程一無(wú)所知才會(huì)混淆這兩個(gè)基本概念。

作者: zhuls    時(shí)間: 2023-11-20 19:40
Hephaestus 發(fā)表于 2023-11-20 18:45
這是基本數(shù)據(jù)類型,跟wchar有個(gè)蛋關(guān)系???

wchar是字符串才要有的,用于區(qū)分ASCII與UTF-8 Unico ...

是,你說(shuō)的對(duì),但這只是不同平臺(tái)的表現(xiàn)~~
作者: mtt661    時(shí)間: 2023-11-21 12:13
Hephaestus 發(fā)表于 2023-11-19 16:33
uchar adc_result;
adc_result = 771;

確實(shí)要反復(fù)看,771-若干個(gè)256后,就是3  uchar改uint
作者: Hephaestus    時(shí)間: 2023-11-21 13:59
mtt661 發(fā)表于 2023-11-21 12:13
確實(shí)要反復(fù)看,771-若干個(gè)256后,就是3  uchar改uint

不用反復(fù),只要把771轉(zhuǎn)成二進(jìn)制或十六進(jìn)制,就能看出問(wèn)題來(lái)。




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