|
|||||||||||
| 技術(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ī) |
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 于 2005/3/21 16:06:00 發(fā)布:
上面的指針,是怎么定義的,又是如何取址,??? 左移置位怎么搞得這么復(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 于 2005/3/21 16:47:00 發(fā)布:
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 于 2005/3/21 18:01:00 發(fā)布:
看這程序是為難人! 正常的程序員不會(huì)這么編程!除非有什么特別的理由! |
|
| 5樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/3/21 19:32:00 發(fā)布:
沒(méi)作者這么想的這么復(fù)雜 不就是PORTA=xxx, NOP()之類函數(shù)嗎,C里面都有,不用自己寫(xiě)(而且寫(xiě)得復(fù)雜^2) |
|
| 6樓: | >>參與討論 |
| 作者: xwj 于 2005/3/21 19:33:00 發(fā)布:
他可能就是為了不讓你看懂才這樣寫(xiě)的 |
|
| 7樓: | >>參與討論 |
| 作者: xwj 于 2005/3/21 19:40:00 發(fā)布:
呵呵,再仔細(xì)看了下并不難懂,他那樣定義對(duì)操作的是哪位一目了然 |
|
| 8樓: | >>參與討論 |
| 作者: xzhenggen 于 2005/3/22 9:34:00 發(fā)布:
雖然對(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í)所 于 2005/3/22 9:47:00 發(fā)布:
富農(nóng)寫(xiě)法,俺這貧農(nóng)也看不懂 |
|
| 10樓: | >>參與討論 |
| 作者: coke 于 2005/3/22 13:57:00 發(fā)布:
可能是這家伙的C語(yǔ)言水平有點(diǎn)高。 |
|
| 11樓: | >>參與討論 |
| 作者: and 于 2005/3/22 14:03:00 發(fā)布:
預(yù)處理之后的文件 估計(jì)是為了刻意降低可讀性。 |
|
| 12樓: | >>參與討論 |
| 作者: 李冬發(fā) 于 2005/3/22 14:16:00 發(fā)布:
N人的作品,長(zhǎng)見(jiàn)識(shí) |
|
| 13樓: | >>參與討論 |
| 作者: gjp_sh 于 2005/3/22 15:51:00 發(fā)布:
有點(diǎn)暈 蒙人的吧,可能只是一些庫(kù)函數(shù),被他寫(xiě)了原代碼,故意晃人的 |
|
| 14樓: | >>參與討論 |
| 作者: landway 于 2005/3/22 16:00:00 發(fā)布:
沒(méi)這么麻煩的必要吧? |
|
| 15樓: | >>參與討論 |
| 作者: gbchang 于 2005/3/22 16:17:00 發(fā)布:
直接看編譯器轉(zhuǎn)換出來(lái)的匯編,再回頭自己用C表述一下,看結(jié)果。 直接看編譯器轉(zhuǎn)換出來(lái)的匯編, 再回頭自己用C表述一下, 看結(jié)果怎樣,是不是一定要這樣, 如果是,那就該拜師了. 如果不是這么復(fù)雜,那就是為了可讀性而做. 另外,最好丟開(kāi)這個(gè)程序代碼,自己重新選擇/設(shè)計(jì)算法, 也許會(huì)有意想不到的收獲呢,可能又簡(jiǎn)單,又易懂. |
|
| 16樓: | >>參與討論 |
| 作者: cf100 于 2005/3/27 13:51:00 發(fā)布:
習(xí)慣不同造成對(duì)C的寫(xiě)法上有很大的差別 有的C程序可讀性并不好,編程完成功能就行,又不是教學(xué)程序,要讓別人看得懂。 不過(guò)簡(jiǎn)明的程序在編程時(shí)便于修改,使用中便于維護(hù)。 |
|
| 17樓: | >>參與討論 |
| 作者: xyele 于 2005/3/27 15:41:00 發(fā)布:
靠,可讀性太差了 |
|
| 18樓: | >>參與討論 |
| 作者: 溜溜 于 2005/3/27 15:45:00 發(fā)布:
我看呢,有些可以不看的 * (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è) 于 2005/3/27 19:05:00 發(fā)布:
9494,程序簡(jiǎn)易為好~~~~~~~~~ |
|
| 20樓: | >>參與討論 |
| 作者: t14495716 于 2005/3/28 7:49:00 發(fā)布:
了解 |
|
| 21樓: | >>參與討論 |
| 作者: xwj 于 2005/3/28 10:54:00 發(fā)布:
如果看不懂建議去看看這個(gè)帖子,會(huì)有幫助的 |
|
| 22樓: | >>參與討論 |
| 作者: 邊緣地帶 于 2005/3/28 12:11:00 發(fā)布:
不錯(cuò),軟件的人水平可以。 |
|
| 23樓: | >>參與討論 |
| 作者: 小易 于 2005/3/28 12:57:00 發(fā)布:
可讀性太差,其實(shí)作者就是想蒙人 讓別人難以看懂他的程序。 匯編都能給你整成C程序,何況本來(lái)是C的呢? 我想編這樣程序的人自己看著也不會(huì)舒服。 這個(gè)程序明擺著就是讓你看著難受。 有什么樣的老板就有什么樣的職員。 如果只是憑這些雕蟲(chóng)小技賴以自保,那就危險(xiǎn)了。 技術(shù)上沒(méi)有什么可取之處。 這是個(gè)做什么樣的人的程序。 |
|
| 24樓: | >>參與討論 |
| 作者: cf100 于 2005/3/31 10:32:00 發(fā)布:
這種寫(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 于 2005/3/31 12:15:00 發(fā)布:
混淆器處理后的結(jié)果? |
|
| 26樓: | >>參與討論 |
| 作者: 老狼 于 2005/3/31 20:31:00 發(fā)布:
并不難理解呀,你耐心點(diǎn) |
|
| 27樓: | >>參與討論 |
| 作者: IceAge 于 2005/4/1 6:41:00 發(fā)布:
特別的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 于 2005/4/1 6:56:00 發(fā)布:
看上去像是預(yù)編譯宏被展開(kāi)后的生成的結(jié)果, 不是原程序 |
|
|
|
| 免費(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) |