




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
PIC單片機如何從匯編轉向PICC一、如何從匯編轉向PICC首先要求你要有C語言的基礎。C代碼的頭文件一定要有#include,它是很多頭文件的集合,C編譯器在pic.h中根據你的芯片自動載入相應的其它頭文件。這點比匯編好用。載入的頭文件中其實是聲明芯片的寄存器和一些函數。staticvolatileunsignedcharTMR0@0x01;staticvolatileunsignedcharPCL@0x02;staticvolatileunsignedcharSTATUS@0x03;可以看出和匯編的頭文件中定義寄存器是差不多的。如下:TMR0EQU0X01;PCLEQU0X02;STATUSEQU0X03;都是把無聊的地址定義為大家公認的名字。1、如何賦值?如對TMR0附值,匯編中:MOVLW200;MOVWFTMR0;當然得保證當前頁面在0,不然會出錯。C語言:TMR0=200;//無論在任何頁面都不會出錯。可以看出來C是很直接了當的。并且最大好處是操作一個寄存器時候,不用考慮頁面的問題。一切由C自動完成。2、如何位操作?匯編中的位操作是很容易的。在C中更簡單。C的頭文件中已經對所有可能需要位操作的寄存器的每一位都有定義名稱:如:PORTA的每一個I/O口定義為:RA0、RA1、RA2。。。RA7。OPTION的每一位定義為:PS0、PS1、PS2、PSA、T0SE、T0CS、INTEDG、RBPU。可以對其直接進行運算和附值。如:RA0=0;RA2=1;在匯編中是:BCFPORTA,0;BSFPORTA,2;可以看出2者是大同小異的,只是C中不需要考慮頁面的問題。3、內存分配問題在匯編中定義一個內存是一件很小心的問題,要考慮太多的問題,稍微不注意就會出錯。比如16位的運算等。用C就不需要考慮太多。下面給個例子:16位的除法(C代碼):INTX=5000;INTY=1000;INTZ=X/Y;而在匯編中則需要花太多精力。給一個小的C代碼,用RA0控制一個LED閃爍:#includevoidmain(){intx;CMCON=0B111;//掉A口比較器,要是有比較器功能的話。ADCON1=0B110;//掉A/D功能,要是有A/D功能的話。TRISA=0;//RA口全為輸出。loop:RA0=!RA0;for(x=60000;--x;){;}//延時gotoloop;}說說RA0=!RA0的意思:PIC對PORT寄存器操作都是先讀取----修改----寫入。上句的含義是程序先讀RA0,然后取反,最后把運算后的值重新寫入RA0,這就實現了閃爍的功能。二、淺談PICC的位操作由于PIC處理器對位操作是最高效的,所以把一些BOOL變量放在一個內存的位中,既可以達到運算速度快,又可以達到最大限度節省空間的目的。在C中的位操作有多種選擇。*********************************************如:charx;x=x|0B00001000;charx;x=x&0B11011111;把上面的變成公式則是:#definebitset(var,bitno)(var|=1《#definebitclr(var,bitno)(var&=~(1《則上面的操作就是:charx;bitset(x,4);charx;bitclr(x,5);*************************************************但上述的方法有缺點,就是對每一位的含義不直觀,最好是能在代碼中能直觀看出每一位代表的意思,這樣就能提高編程效率,避免出錯。如果我們想用X的0-2位分別表示溫度、電壓、電流的BOOL值可以如下:unsignedcharx@0x20;bittemperature@(unsigned)&x*8+0;bitvoltage@(unsigned)&x*8+1;bitcurrent@(unsigned)&x*8+2;這樣定義后X的位就有一個形象化的名字,不再是枯燥的1、2、3、4等數字了。可以對X全局修改,也可以對每一位進行操作:char=255;temperature=0;if(voltage)。。.。。.*****************************************************************還有一個方法是用C的struct結構來定義,如:structcypok{temperature:1;voltage:1;current:1;none:4;}x@0x20;這樣就可以用x.temperature=0;if(x.current)。。.。等操作了。**********************************************************上面的方法在一些簡單的設計中很有效,但對于復雜的設計中就比較吃力。如象在多路工業控制上。前端需要分別收集多路的多路信號,然后再設定控制多路的多路輸出。如:有2路控制,每一路的前端信號有溫度、電壓、電流。后端控制有電機、喇叭、繼電器、LED。如果用匯編來實現的話,是很頭疼的事情,用C來實現是很輕松的事情,這里也涉及到一點C的內存管理(其實C的最大優點就是內存管理)。采用如下結構:unioncypok{structout{motor:1;relay:1;speaker:1;led1:1;led2:1;}out;structin{none:5;temperature:1;voltage:1;current:1;}in;charx;};unioncypokan1;unioncypokan2;上面的結構有什么好處呢?細分了信號的路an1和an2;細分了每一路的信號的類型(是前端信號in還是后端信號out):an1.in;an1.out;an2.in;an2.out;然后又細分了每一路信號的具體含義,如:an1.in.temperature;an1.out.motor;an2.in.voltage;an2.out.led2;等這樣的結構很直觀的在2個內存中就表示了2路信號。并且可以極其方便的擴充。如添加更多路的信號,只需要添加:unioncypokan3;unioncypokan4;從上面就可以看出用C的巨大好處。三、PICC之延時函數和循環體優化。很多朋友說C中不能精確控制延時時間,不能象匯編那樣直觀。其實不然,對延時函數深入了解一下就能設計出一個理想的框架出來。一般的我們都用for(x=100;--x;){;}此句等同與x=100;while(--x){;};或for(x=0;x《100;x++){;}。來寫一個延時函數。在這里要特別注意:X=100,并不表示只運行100個指令時間就跳出循環。可以看看編譯后的匯編:x=100;while(--x){;}匯編后:movlw100bcf3,5bcf3,6movwf_delayl2decfsz_delaygotol2return從代碼可以看出總的指令是是303個,其公式是8+3*(X-1)。注意其中循環周期是X-1是99個。這里總結的是x為char類型的循環體,當x為int時候,其中受X值的影響較大。建議設計一個char類型的循環體,然后再用一個循環體來調用它,可以實現精確的長時間的延時。下面給出一個能精確控制延時的函數,此函數的匯編代碼是最簡潔、最能精確控制指令時間的:voiddelay(charx,chary){charz;do{z=y;do{;}while(--z);}while(--x);}其指令時間為:7+(3*(Y-1)+7)*(X-1)如果再加上函數調用的call指令、頁面設定、傳遞參數花掉的7個指令。則是:14+(3*(Y-1)+7)*(X-1)。如果要求不是特別嚴格的延時,可以用這個函數:voiddelay(){unsignedintd=1000;while(--d){;}}此函數在4M晶體下產生10003us的延時,也就是10mS。如果把D改成2000,則是20003uS,以此類推。有朋友不明白,為什么不用while(x--)后減量,來控制設定X值是多少就循環多少周期呢?現在看看編譯它的匯編代碼:bcf3,5bcf3,6movlw10movwf_delayl2decf_delayincfsz_delay,wgotol2return可以看出循環體中多了一條指令,不簡潔。所以在PICC中最好用前減量來控制循環體。再談談這樣的語句:for(x=100;--x;){;}和for(x=0;x《100;x++){;}從字面上看2者意思一樣,但可以通過匯編查看代碼。后者代碼雍長,而前者就很好的匯編出了簡潔的代碼。所以在PICC中最好用前者的形式來寫循環體,好的C編譯器會自動把增量循環化為減量循環。因為這是由處理器硬件特性決定的。PICC并不是一個很智能的C編譯器,所以還是人腦才是第一的,掌握一些經驗對寫出高效,簡潔的代碼是有好處的。四、深入探討PICC之位操作1、用位操作來做一些標志位,也就是BOOL變量.可以簡單如下定義:bita,b,c;PICC會自動安排一個內存,并在此內存中自動安排一位來對應a,b,c.由于我們只是用它們來簡單的表示一些0,1信息,所以我們不需要詳細的知道它們的地址\位究竟是多少,只管拿來就用好了。2、要是需要用一個地址固定的變量來位操作,可以參照PIC.H里面定義寄存器。如:用25H內存來定義8個位變量.staticvolatileunsignedcharmyvar@0x25;staticvolatilebitb7@(unsigned)&myvar*8+7;staticvolatilebitb6@(unsigned)&myvar*8+6;staticvolatilebitb5@(unsigned)&myvar*8+5;staticvolatilebitb4@(unsigned)&myvar*8+4;staticvolatilebitb3@(unsigned)&myvar*8+3;staticvolatilebitb2@(unsigned)&myvar*8+2;staticvolatilebitb1@(unsigned)&myvar*8+1;staticvolatilebitb0@(unsigned)&myvar*8+0;這樣即可以對myvar操作,也可以對B0--B7直接位操作.但不好的是,此招在低檔片子,如C5X系列上可能會出問題.還有就是表達起來復雜,你不覺得輸入代碼累么?呵呵3、這也是一些常用手法#definetestbit(var,bit)((var)&(1《《(bit)))//測試某一位,可以做BOOL運算#definesetbit(var,bit)((var)|=(1《《(bit)))//把某一位置1#d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新鄉學院《現代食品營養與安全自科類》2023-2024學年第一學期期末試卷
- 興安職業技術學院《配器Ⅰ》2023-2024學年第一學期期末試卷
- 2024屆山東省臨沂市經濟開發區中考數學模擬試題含解析
- 甘肅省高臺縣重點達標名校2024年中考數學五模試卷含解析
- 廣東韶關曲江重點中學2024屆中考數學最后沖刺模擬試卷含解析
- 2025員工三級安全培訓考試試題【考點提分】
- 2025公司廠級員工安全培訓考試試題有答案
- 2025年項目部安全培訓考試試題答案4A
- 2024-2025企業級安全培訓考試試題及答案【名校卷】
- 2025年項目部安全管理人員安全培訓考試試題附答案【A卷】
- 益母草顆粒的保肝作用機制
- 婚姻家庭法教學課件
- 部編版語文四年級下冊第四單元大單元作業設計
- 金融大數據銀行項目使用手冊
- 《裝飾構造與施工工藝實習》課程標準
- 中考數學解題技巧專題巧用旋轉進行計算全國公開課一等獎百校聯賽微課賽課特等獎課件
- 環境設計創新創業項目計劃書
- 新概念第一冊單詞默寫表
- 海邁工程量清單計價軟件使用說明書樣本
- 工程倫理試題及答案
- 廣告公司年度合作協議-帶附件
評論
0/150
提交評論