音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

如此的繁瑣的代碼,怎么理解.真是氣憤!我的C語(yǔ)言水平有限......

作者:xzhenggen 欄目:單片機(jī)
如此的繁瑣的代碼,怎么理解.真是氣憤!我的C語(yǔ)言水平有限......
unsigned CHAR HPLCC1000_Parameters[31];

void __inline uwait(int u_sec)
{
  while (u_sec > 0) {
       __asm volatile ("nop");
       __asm volatile ("nop");
       __asm volatile ("nop");
       __asm volatile ("nop");
       __asm volatile ("nop");
       __asm volatile ("nop");
       __asm volatile ("nop");
       __asm volatile ("nop");
      u_sec--;
    }
}

unsigned CHAR HPLCC1000_init(void)
{
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x1A + 0x20) &= ~(1 << 6);
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x11 + 0x20) |= 1 << 4;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x11 + 0x20) |= 1 << 6;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x11 + 0x20) |= 1 << 7;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 4;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 6;
  return 1;
}

unsigned CHAR HPLCC1000_read(unsigned CHAR addr)
{
  int cnt;
  unsigned CHAR din;
  unsigned CHAR data = 0;
  addr <<= 1;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 4);
  for (cnt = 0; cnt < 7; cnt++)
    {
      if (addr & 0x80)
        * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;       
      else
        * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 7);
      * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 6);
      * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 6;
      addr <<= 1;
    }
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 7);
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 6);
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 6;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x11 + 0x20) &= ~(1 << 7);
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 4;
  for (cnt = 7; cnt >= 0; cnt--)
  {
      * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 6);
      din = ((* (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x10 + 0x20) & (1 << 7)) != 0);
      if (din)         data = (data << 1) | 0x01;
      else        data = (data << 1) & 0xfe;
      * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 6;
    }
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 4;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x11 + 0x20) |= 1 << 7;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
  return data;
}

inline static unsigned CHAR HPLCC1000_write(unsigned CHAR addr, unsigned CHAR data){
   CHAR cnt = 0;
  addr <<= 1;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 4);
  for (cnt = 0; cnt < 7; cnt++) {
      if (addr & 0x80)
          * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
      else
        * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 7);

      * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 6);
      * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 6;
      addr <<= 1;
    }
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 6);
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 6;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 4;

  for (cnt = 0; cnt < 8; cnt++) {
      if (data & 0x80)
        * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
      else
        * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 7);

      * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 6);
      * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 6;
      data <<= 1;
    }
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 4;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 6;
  return 1;
}

unsigned CHAR chipcon_cal(void)
{
  HPLCC1000_write(0x0B, 0x00);<
2樓: >>參與討論
xzhenggen
上面的指針,是怎么定義的,又是如何取址,???


左移置位怎么搞得這么復(fù)雜.
以下兩句怎么理解:
* (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 4);
(1 << 7) | (33 << 0), (((3 << 5) | (1 << 3)) | (3 << 1)) | (1 << 0),
    






3樓: >>參與討論
coke
RE
* (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20)
應(yīng)該是兩個(gè)volatile unsigned CHAR型指針的指針相位與.

* (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 4);
然后再與后面一個(gè)常數(shù)(0x10)相與的結(jié)果給前一個(gè)指針的指針(兩個(gè)相與的新結(jié)果).

(1 << 7) | (33 << 0), 是0B 1000 0000 | 0B0010 0001 =0XA1.
以此類推.

4樓: >>參與討論
mabaoqiu
看這程序是為難人!
正常的程序員不會(huì)這么編程!除非有什么特別的理由!

5樓: >>參與討論
農(nóng)民講習(xí)所
沒(méi)作者這么想的這么復(fù)雜
不就是PORTA=xxx, NOP()之類函數(shù)嗎,C里面都有,不用自己寫(xiě)(而且寫(xiě)得復(fù)雜^2)

6樓: >>參與討論
xwj
他可能就是為了不讓你看懂才這樣寫(xiě)的
 
7樓: >>參與討論
xwj
呵呵,再仔細(xì)看了下并不難懂,他那樣定義對(duì)操作的是哪位一目了然
 
8樓: >>參與討論
xzhenggen
雖然對(duì)位操作一目了然,但也太費(fèi)勁了,
指針地址操作過(guò)于繁瑣.
#define DAC0  (*(unsigned CHAR pdata *)0x20)
將變量DAC0以指針?lè)绞皆O(shè)置外部數(shù)據(jù)存儲(chǔ)器的地址為0x20

下面這一句,我還是迷惑不解:
  * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) &= ~(1 << 7);
  ???


9樓: >>參與討論
農(nóng)民講習(xí)所
富農(nóng)寫(xiě)法,俺這貧農(nóng)也看不懂
 
10樓: >>參與討論
coke
可能是這家伙的C語(yǔ)言水平有點(diǎn)高。
 
11樓: >>參與討論
and
預(yù)處理之后的文件
估計(jì)是為了刻意降低可讀性。

12樓: >>參與討論
李冬發(fā)
N人的作品,長(zhǎng)見(jiàn)識(shí)
 
13樓: >>參與討論
gjp_sh
有點(diǎn)暈
蒙人的吧,可能只是一些庫(kù)函數(shù),被他寫(xiě)了原代碼,故意晃人的

14樓: >>參與討論
landway
沒(méi)這么麻煩的必要吧?
 
15樓: >>參與討論
gbchang
直接看編譯器轉(zhuǎn)換出來(lái)的匯編,再回頭自己用C表述一下,看結(jié)果。
直接看編譯器轉(zhuǎn)換出來(lái)的匯編,
再回頭自己用C表述一下,
看結(jié)果怎樣,是不是一定要這樣,

如果是,那就該拜師了.
如果不是這么復(fù)雜,那就是為了可讀性而做.

另外,最好丟開(kāi)這個(gè)程序代碼,自己重新選擇/設(shè)計(jì)算法,
也許會(huì)有意想不到的收獲呢,可能又簡(jiǎn)單,又易懂.

16樓: >>參與討論
cf100
習(xí)慣不同造成對(duì)C的寫(xiě)法上有很大的差別
    有的C程序可讀性并不好,編程完成功能就行,又不是教學(xué)程序,要讓別人看得懂。
    不過(guò)簡(jiǎn)明的程序在編程時(shí)便于修改,使用中便于維護(hù)。

17樓: >>參與討論
xyele
靠,可讀性太差了
 
18樓: >>參與討論
溜溜
我看呢,有些可以不看的
    * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
上面這句其實(shí)與* (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
一個(gè)意思,
呵呵!對(duì)不對(duì)?我沒(méi)試哦!應(yīng)該是的吧。

19樓: >>參與討論
沙漠可樂(lè)
9494,程序簡(jiǎn)易為好~~~~~~~~~
 
20樓: >>參與討論
t14495716
了解
 
21樓: >>參與討論
xwj
如果看不懂建議去看看這個(gè)帖子,會(huì)有幫助的
 

教你理解復(fù)雜的C-C++聲明(hopeasy)

22樓: >>參與討論
邊緣地帶
不錯(cuò),軟件的人水平可以。
 
23樓: >>參與討論
小易
可讀性太差,其實(shí)作者就是想蒙人
讓別人難以看懂他的程序。

匯編都能給你整成C程序,何況本來(lái)是C的呢?
我想編這樣程序的人自己看著也不會(huì)舒服。

這個(gè)程序明擺著就是讓你看著難受。
有什么樣的老板就有什么樣的職員。

如果只是憑這些雕蟲(chóng)小技賴以自保,那就危險(xiǎn)了。

技術(shù)上沒(méi)有什么可取之處。
這是個(gè)做什么樣的人的程序。

24樓: >>參與討論
cf100
這種寫(xiě)法最好是不要用
我今天有點(diǎn)空,就仔細(xì)看了一下程序,如果真要那么寫(xiě)的話,用匯編可能效率還要高點(diǎn)。
那么以上的程序是否一定就高效或節(jié)省資源?
那我來(lái)找二個(gè)改進(jìn)的地方:
1、for (cnt = 7; cnt >= 0; cnt--)
  顯然如果用for (cnt = 8; cnt > 0; cnt--) 要節(jié)省程序代碼。
  在這里cnt只用于一個(gè)八次循環(huán)的計(jì)數(shù),與循環(huán)體內(nèi)無(wú)關(guān)。
2、for (i = 1; i < 31; i++)
  這類循環(huán)大量出現(xiàn),i同時(shí)作為HPLCC1000_Parameters數(shù)組下標(biāo)
  由此可以看出,HPLCC1000_Parameters[0]數(shù)組被定義占RAM而不用,典型的PC機(jī)的編程方式。
  再說(shuō)前面的指針用得那么多,在最需要用指針來(lái)進(jìn)行數(shù)組操作時(shí),為什么又不用了?

指針是C語(yǔ)言的特點(diǎn),就象是燒菜用的味精,但用多了效果并不好。
使用C語(yǔ)言的指針要看什么場(chǎng)合,如果在PICC中,過(guò)多使用指針,有時(shí)反而會(huì)造成程序可讀性變差,而同時(shí),如果不能及時(shí)釋放內(nèi)存,指針也可能會(huì)占用大量的RAM(指針屬于間接尋址)。

25樓: >>參與討論
fsclub
混淆器處理后的結(jié)果?
 
26樓: >>參與討論
老狼
并不難理解呀,你耐心點(diǎn)
 
27樓: >>參與討論
IceAge
特別的cpu, 特別的compiler, 就會(huì)出現(xiàn)這種寫(xiě)法
 * (volatile unsigned CHAR *)(unsigned int )& * (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7;
并不完全等同于
* (volatile unsigned CHAR *)(0x12 + 0x20) |= 1 << 7

(unsigned int) 的作用是告訴compiler (0x12 + 0x20)是一個(gè)16-bit(若int是 16-bit)的指針。 因?yàn)榍度胧絚pu 的尋址方式千奇百怪,指針可以是8-bit ,16-bit ,32-bit, 甚至 24-bit。 而并不是所有的C compiler 都像C51 那樣做出不符合標(biāo)準(zhǔn)的擴(kuò)展(如sbit, code,  xdata 之類).



28樓: >>參與討論
IceAge
看上去像是預(yù)編譯宏被展開(kāi)后的生成的結(jié)果, 不是原程序
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
串口鼠標(biāo)疑惑。
高頻噪聲模擬發(fā)生器國(guó)產(chǎn)的有嗎??jī)r(jià)格多少?
哪里有不受2k代碼限制的keil下載
串口緩沖池的遍歷,懇請(qǐng)幫忙改正!(有源碼)
串行中斷程序
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)