![]() |
發布時間: 2021-9-3 22:56
正文摘要:此頭文可以比較方便快捷的按位來設定每個端口的模式,可以給初學者帶來不少便利。 IO口模式設置時,從左至右為從高到低 7~0 端口, “O”為大寫字母“O”,不是數字“0”,4位之間用下劃線“_”分割。 D 準雙向 ... |
heicad 發表于 2021-9-3 23:11 C的魅力在于比較基礎,程序員可以自由使用資源,比較靈活 |
都是大師級 |
這個厲害啊,使用的話太方便了 |
感謝樓主分享!51因您而精彩! 可以試試STC官方最新的 STC-ISP V6.91及以上版本的 ISP燒錄/輔助開發工具包一體化軟件的 工具 有 I/O配置工具![]() |
謝謝樓主分享,對我很有用 |
我用函數 也寫了一個 。 作者的 想法是好的 。 /*************************************************************************** 函數名稱: 功能描述:stc8a8k64d4 GPIO 配置 D 為雙向口 ,P為 推挽 ,H為高阻 ,O 為開漏 參 數: 無 返 回:無 備 注:舉例 set_gpio_mode(0 , "DDDD HOPD") ****************************************************************************/ void set_gpio_mode( unsigned char gpio , char n[] ) { unsigned char M1 , M0 , i ; for( i= 0 ; i < 9 ; i ++ ) { if( i == 4 ) continue ; M1 <<= 1 ; M0 <<= 1 ; switch( n[i] ) { case 'D' : // 00 { M1 &= ~0x01 ; M0 &= ~0x01 ; } break ; case 'P' : // 01 { M1 &= ~0x01 ; M0 |= 0x01 ; } break ; case 'H' : // 10 { M1 |= 0x01 ; M0 &= ~0x01 ; } break ; case 'O' : // 11 { M1 |= 0x01 ; M0 |= 0x01 ; } break ; } } switch( gpio ) { case 0 : //P0 { P0M1 = M1 , P0M0 = M0 ; } break ; case 1 : //P1 { P1M1 = M1 , P1M0 = M0 ; } break ; case 2 : //P2 { P2M1 = M1 , P2M0 = M0 ; } break ; case 3 : //P3 { P3M1 = M1 , P3M0 = M0 ; } break ; case 4 : //P4 { P4M1 = M1 , P4M0 = M0 ; } break ; case 5 : //P5 { P5M1 = M1 , P5M0 = M0 ; } break ; case 6 : //P6 { P6M1 = M1 , P6M0 = M0 ; } break ; case 7 : //P7 { P7M1 = M1 , P7M0 = M0 ; } break ; } } |
都是高手,都把觀點擺出來討論是好事,感謝樓主供獻那么實用的 IO模式設置 頭文件. 對于初學者可以帶來很大的幫助. 到了高手階段,可有自己更好的辦法,或者是直接就可以二進 十六進制 心算了. |
開源精神值得肯定,但確實沒啥必要。 |
你說直接了當說,然后說了:“單片機編程是有級別劃分的,一是流水燈、二是多任務、三是CPU應用率、四是任意移植程序” 下文呢?后續你把這4點,和你主張的端口模式 對應起來呀!!,我讀了通篇都沒有看你對應。好吧,略過這一句,我們再往下面看。 我說給提供給有需要的人,顯然,你屬于不需要的人,那你不要下載就可以了,我也沒求你用對不對? 這個頭文件,我做做也就是2分鐘的事情,并不辛苦,所以不需要用的的人感激,要說辛苦,為了讓有需要,想用的人明白怎么用,寫注釋用了5分鐘,這勉強算辛苦吧,然后,回復你的錯誤論調,告訴你,你以為的“更優” 其中的缺陷,花了半小時,這才算真正的辛苦。當然,也不需要你理解,不需要你感激。 然后,你有不同的觀點,可以啊,但是,至少要是:正確的,并且是你的觀點。 對不對?結果呢? 你給的例子,是STC官方就有的,壓根不是你自己的,然后,你覺得更好~~,實際呢?你測試過么?我告訴你效率低,占空間大,你扯去應用率。這罷了,我們再往下看。 你說: 每個人對單片機編程的側重點是不一樣的,我也不可能要求所有人接受我注重CPU應用率和注重仿真的觀點, 所以請問:針對這點來說,你主張的端口的設置的方式,相較于我提供端口設置方式,在CPU應用率 上有什么提高呢? 所以,你說了簡單來說,又說直來直去的說,說到最后,你還是兜了個圈子之后,說了一堆 “地球是圓的”,關于你覺得我提供的方案不如你推薦的方案的理由,事實根據,一樣都沒有說…… |
188610329 發表于 2022-7-28 23:11 要直來直去,簡單的很啊,直截了當說,單片機編程是有級別劃分的,一是流水燈、二是多任務、三是CPU應用率、四是任意移植程序,你也已經說的清清楚楚“此頭文可以比較方便快捷的按位來設定每個端口的模式,可以給初學者帶來不少便利。”既然你這個頭文件是為了方便初學者,有人提出不同看法也很正常,我也說的清清楚楚,樓主把自己辛辛苦苦編寫的關于STC單片機端口操作的頭文件奉獻出來,需要的網友一定是非常感激,每個人對單片機編程的側重點是不一樣的,我也不可能要求所有人接受我注重CPU應用率和注重仿真的觀點,我的這種編程方法太累人了,我說STM32端口設置更復雜,并不是證明我懂STM32,這個論壇懂STM32的多了是了,我僅僅學會STM32的端口操作和流水燈,STM32就漲價了,我是個窮光蛋,用不起STM32,單片機編程只是我的一個業余愛好,我的水平太一般了。 |
kmsj 發表于 2022-5-1 15:29 你說了一大堆, 實在是…… 除了把問題描述的 模糊不清,完全不明白你要表達什么意思。 我說了,我分享出來,是讓有需要的人可以下載使用,不需要任何感激。沒有需要的也可以 直接繞道。 你覺得你有更完美的方案,你也可以另發一貼給 有需要的人,我也不會去你的帖子說好還是不好。 但是,你在我的帖子里說,這個方法,不如怎么怎么樣,那么,我自然要告訴你,你所說的“不如怎么怎么樣” 缺點在哪里。 然后,你再回復,就直接扯到18B20去了。我也不知道你扯這么遠是為了什么,你說不在乎開機初始化那點時間,為了讓程序更容易解讀,那么,事實上,針對端口設置,你所謂的 還不如怎么怎么樣 的方案,更容易解讀了么? 然后,你又說你不是代碼越短 占用CPU運行之間越短,那么,你提出的方案,代碼長度拉長,然后占用CPU運行時間更短了么? 你在18提出的各種論調,都不足以支撐你之前12樓的提出的主張, 真的不知道你這洋洋灑灑寫這么一大篇,想說明什么?想要體現 你會STM32 ? 我只是提供給大家一個 STC的端口模式設置方案,你要在這帖子里 討論 STM端口的設置方案?還是說你要我再出一個 STM的端口設置方案? 好歹你也是搞技術的,討論問題直來直去不行?? 非要那么多彎彎繞繞? |
樓主所言:“同時回復 12 樓: 有沒有必要看實際效果”我認為樓主并沒有把“實際效果” 看清楚,任何單片機程序就是一個大循環,端口配置的代碼在主函數到大循環之間,并沒有在大循環內部,所以,端口配置的代碼再復雜,影響單片機的實際運行時間很小很小,我寧愿一個端口一個端口的配置,哪怕默認的設置我也設置一遍,就算明知是無用的代碼也無所謂,是為了讓我的程序更容易理解,時間長了我自己還能看懂。就算我浪費1000個字節的代碼用來設置端口,最多就是單片機通電之后到主程序的大循環延長了0.001秒,也就是開機時間延長了0.001秒,這0.001秒能影響什么?我用的單片機是8K的ROM,我的程序5K左右就能編完,我節約幾百個字節的ROM有何意義?除非我的單片機只有4K的ROM,我會節約每一個語句,甚至用匯編來編,那是另當別論。 樓主所言:“用你的方式,總共:192個字節 直接設置 之需要48個字節, 還沒有算運行時間”,每個人的編程重點是不一樣的,我的編程重點放在CPU應用率,我的每一段程序都是用CPU應用率約束出來的,最重要的就是,不是代碼越短占用CPU運行時間越短,我主程序大循環里軟件延時的時間最多只有幾十微秒,包括按鍵去抖動,18B20之類的程序,沒有用長延時的辦法都解決了,比如我用10步讀出2個18B20的溫度值,一共花了0.1秒讀出溫度值,溫度是漸變,不是突變,我花一秒鐘讀出溫度值都不會影響我的程序,看下來我的18B20的程序非常復雜,然而實際運行效果是十幾個循環周期我才運行一步18B20的程序,和那些在一個循環周期完成18B20的程序,我的18B20程序CPU運行效率要高出10倍都不止。 樓主所言:“一不小心還會中招,而這個頭文件的好處,就是能通吃。再也不用查手冊和核對頭文件來防止中招了”,我編單片機還有一個重點是仿真,編程中招,那是家常便飯,靠查手冊和核對頭文件來防止中招,我認為不是主要的,仿真才是解決中招的最好辦法,我中過的招,任何手冊和書本以及各種資料上都沒有,只有靠仿真解決。由于AVR單片機漲價,被迫使用STC單片機,主要用STC1K08H替代AVR的ATMEGA8,由于STC的仿真并不好用,我就用89C51的老式仿真器仿真,所以我的程序就在89C51、STC、AVR之間移植過來移植過去。 綜上所述,每個人編單片機的重點不是一模一樣的,AVR單片機的端口操作比STC單片機還要復雜,STM32的端口操作更是復雜,STC單片機的端口操作對我而言算是比較簡單的了。樓主把自己辛辛苦苦編寫的關于STC單片機端口操作的頭文件奉獻出來,需要的網友一定是非常感激,但不是所有人都需要,所以樓主沒有必要讓所有人接受你的觀點,就像我也不可能讓所有人接受我注重CPU應用率和注重仿真的觀點。 |
這個很實用,方便很多了! |
這個很實用,方便很多了! |
hp34401a 發表于 2022-4-21 16:40 你也許對 "代碼也不大" 有點誤解. H 頭文件,無論多大都不會影響 “代碼” 大小, 大多時候,引用 宏處理 最終“代碼”反而會大,引用 宏定義 最終代碼反而小。 同時回復 12 樓: 有沒有必要看實際效果。 假定 P1.0 P1.1 為推挽輸出, P1.2 - P1.5 為準雙向口, P1.6 高阻, P1.7 開漏, 用你那個方法,或者 用宏處理大多需要 4 次設置, 總共需要 24個字節,而直接設置值需要6個字節, 如果 P0~P7 全盤設定一次, 用你的方式,總共:192個字節 直接設置 之需要48個字節, 還沒有算運行時間。 不想說哪個好,哪個不好, 只是想給,喜歡用 PxM0 = ?? PxM1 = ?? 的朋友,一個可以比較直觀快捷的,并且不增加“代碼尺寸” 的設置方法, 尤其是 STC15 系列 和STC12系列的頭文件里面 PxM0,和 PxM1 還是反的,一不小心還會中招,而這個頭文件的好處,就是能通吃。再也不用查手冊和核對頭文件來防止中招了。 |
kmsj 發表于 2022-3-31 15:36 網上有一個宏處理的,很方便,代碼也不大,可以百度一下。 另外還可以使用STC的庫函數處理。 1309 |
這個確實非常方便,我之前用工具高手寫的工具計算,也算是很方便,現分享出來。 |
1.81 MB, 下載次數: 28, 下載積分: 黑幣 -5
非常佩服樓主的執著,個人認為沒有必要,每次配置端口都要看手冊,的確很麻煩。![]() 好記性不如爛筆頭,我把手冊里的端口配置表用制表符做進程序里,編新程序的時候從老程序里復制一下,看著這個表配置端口也很方便,只要記清楚&=~是置0,|=是置1就可以了。 // ─────────────────────────────── // | PnM1.x | PnM0.x | Pn.x 口工作模式 | // ─────────────────────────────── // | 0 | 0 | 準雙向口 | // ─────────────────────────────── // | 0 | 1 | 推挽輸出 | // ─────────────────────────────── // | 1 | 0 | 高阻輸入 | // ─────────────────────────────── // | 1 | 1 | 開漏輸出 | // ─────────────────────────────── // 80 40 20 10 | 08 04 02 01 // X.7 X.6 X.5 X.4 | X.3 X.2 X.1 X.0 P1M1 &= ~0x03 ; P1M0 |= 0x03 ; // P1.0 P1.1 為推挽輸出 P1M1 &= ~0xfc ; P1M0 &= ~0xfc ; // P1.2 - P1.7 為準雙向口 P3M1 &= ~0x08 ; P3M0 |= 0x08 ; // P3.3 為推挽輸出 P3M1 &= ~0x30 ; P3M0 |= 0x30 ; // P3.4 P3.5 為推挽輸出 P5M1 &= ~0x10 ; P5M0 |= 0x10 ; // P5.4 為推挽輸出 也把這段表格和程序復制在這里,看看能不能對齊?需要的可以直接復制。 |
有這個,確實是簡單、實用、方便 |
這很方便的,懶得翻手冊了。 |
感謝樓主分享,很實用。 |
好家伙,里面那么多宏定義,編寫者肛了多久啊![]() |
真的實用啊! |
真不錯,實用 |
這個還真是很實用,謝謝分享。 |
有了這個方便多了,簡單易記,謝謝分享! |
有了這個真方便,這是官方出的嗎? |