欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      C語(yǔ)言學(xué)習(xí)心得

      時(shí)間:2019-05-11 23:55:01下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《C語(yǔ)言學(xué)習(xí)心得》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《C語(yǔ)言學(xué)習(xí)心得》。

      第一篇:C語(yǔ)言學(xué)習(xí)心得

      這個(gè)我從eehome貼過(guò)來(lái)的。寫的非常的好。我們用學(xué)單片機(jī)不要停在演示的基礎(chǔ)上。只能讓單片機(jī)完成局部事。這樣我們永遠(yuǎn)不會(huì)走出流水燈地獄?。?/p>

      學(xué)習(xí)單片機(jī)也已經(jīng)有幾年了,藉此機(jī)會(huì)和大家聊一下我學(xué)習(xí)過(guò)程中的一些經(jīng)歷和想法吧。也感謝一線工人提供了這個(gè)機(jī)會(huì)。希望大家有什么好的想法和建議都直接跟帖說(shuō)出來(lái)。畢竟只有交流才能夠碰撞出火花來(lái)^_^。

      ?!百u弄”也好,“吹噓”也罷,我只是想認(rèn)真的寫寫我這一路走來(lái)歷經(jīng)的總總,把其中值得注意,以及經(jīng)驗(yàn)的地方寫出來(lái),權(quán)當(dāng)是我對(duì)自己的一個(gè)總結(jié)吧。而作為看官的你,如果看到了我的錯(cuò)誤,還請(qǐng)一定指正,這樣對(duì)我以及其它讀者都有幫助,而至于你如果從中能夠收獲到些許,那便是我最大的欣慰了。姑妄言之,姑妄聽之。如果有啥好的想法和建議一定要說(shuō)出來(lái)。? 幾年前,和眾多初學(xué)者一樣,我接觸到了單片機(jī),立刻被其神奇的功能所吸引,從此不能自拔。很多個(gè)日夜就這樣陪伴著它度過(guò)了。期間也遇到過(guò)非常多的問(wèn)題,也一度被這些問(wèn)題所困惑??等到回過(guò)頭來(lái),看到自己曾經(jīng)走過(guò)的路,唏噓不已。經(jīng)?;燠E于論壇里,也看到了很多初學(xué)者發(fā)的求助帖子,看到他們走在自己曾走過(guò)的彎路上,忽然想到了自己的那段日子,心里竟然莫名的沖動(dòng),凡此總總,我總是盡自己所能去回帖。很多時(shí)候,都想寫一點(diǎn)什么東西出來(lái),希望對(duì)廣大的初學(xué)者有一點(diǎn)點(diǎn)幫助。但總是不知從何處寫起。今天借一線工人的臺(tái),唱一唱我的戲

      一路學(xué)習(xí)過(guò)來(lái)的過(guò)程中,幫助最大之一無(wú)疑來(lái)自于網(wǎng)絡(luò)了。很多時(shí)候,通過(guò)網(wǎng)絡(luò),我們都可以獲取到所需要的學(xué)習(xí)資料。但是,隨著我們學(xué)習(xí)的深入,我們會(huì)慢慢發(fā)現(xiàn),網(wǎng)絡(luò)提供的東西是有限度的,好像大部分的資料都差不多,或者說(shuō)是適合大部分的初學(xué)者所需,而當(dāng)我們想更進(jìn)一步提高時(shí),卻發(fā)現(xiàn)能夠獲取到的資料越來(lái)越少,相信各位也會(huì)有同感,鋪天蓋地的單片機(jī)資料中大部分不是流水燈就是LED,液晶,而且也只是僅僅作功能性的演示。于是有些人選擇了放棄,或者是轉(zhuǎn)移到其他興趣上面去了,而只有少部分人選擇了繼續(xù)摸索下去,結(jié)合市面上的書籍,然后在網(wǎng)絡(luò)上鍥而不舍的搜集資料,再?gòu)呐H说闹谎云Z(yǔ)中去體會(huì),不斷動(dòng)手實(shí)踐,慢慢的,也摸索出來(lái)了自己的一條路子。當(dāng)然這個(gè)過(guò)程必然是艱辛的,而他學(xué)會(huì)了之后也不會(huì)在網(wǎng)絡(luò)上輕易分享自己的學(xué)習(xí)成果。如此惡性循環(huán)下去,也就不難理解為什么初級(jí)的學(xué)習(xí)資料滿天飛,而深入一點(diǎn)的學(xué)習(xí)資料卻很少的原因了。相較于其他領(lǐng)域,單片機(jī)技術(shù)的封鎖更加容易。盡管已經(jīng)問(wèn)世了很多年了,有價(jià)值的資料還是相當(dāng)?shù)那啡?,大部分的資料都是止于入門階段或者是簡(jiǎn)單的演示實(shí)驗(yàn)。但是在實(shí)際工程應(yīng)用中卻是另外一回事。有能力的高手無(wú)暇或者是不愿公開自己的學(xué)習(xí)經(jīng)驗(yàn)。

      很多時(shí)候,我也很困惑,看到國(guó)外愛好者毫不保留的在網(wǎng)絡(luò)上發(fā)布自己的作品,我忽然感覺到一絲絲的悲哀。也許,我們真的該轉(zhuǎn)變一下思路了,幫助別人,其實(shí)也是在幫助自己。啰啰嗦嗦的說(shuō)了這么多,相信大家能夠明白說(shuō)的是什么意思。在接下來(lái)的一段日子里,我將會(huì)結(jié)合電子工程師之家舉辦的主題周活動(dòng)寫一點(diǎn)自己的想法。盡可能從實(shí)用的角度去講述。希望能夠幫助更多的初學(xué)者更上一層樓。而關(guān)于這個(gè)主題周的最大主題我想了這樣的一個(gè)名字“從單片機(jī)初學(xué)者邁向單片機(jī)工程師”。名字挺大挺響亮,給我的壓力也挺大的,但我會(huì)努力,爭(zhēng)取使這樣的一系列文章能夠帶給大家一點(diǎn)幫助,而不是看后大跌眼鏡。這樣的一系列文章主要的對(duì)象是初學(xué)者,以及想從初學(xué)者更進(jìn)一步提高的讀者。而至于老手,以及那些牛XX的人,希望能夠給我們這些初學(xué)者更多的一些指點(diǎn)哈~@_@

      我們首先來(lái)看第一章節(jié)

      從這一章開始,我們開始邁入單片機(jī)的世界。在我們開始這一章具體的學(xué)習(xí)之前,有必要給大家先說(shuō)明一下。在以后的系列文章中,我們將以51內(nèi)核的單片機(jī)為載體,C語(yǔ)言為編程語(yǔ)言,開發(fā)環(huán)境為KEIL uv3。至于為什么選用C語(yǔ)言開發(fā),好處不言而喻,開發(fā)速度快,效率高,代碼可復(fù)用率高,結(jié)構(gòu)清晰,尤其是在大型的程序中,而且隨著編譯器的不斷升級(jí),其編譯后的代碼大小與匯編語(yǔ)言的差距越來(lái)越小。而關(guān)于C語(yǔ)言和匯編之爭(zhēng),就像那個(gè)啥,每隔一段時(shí)間總會(huì)有人挑起這個(gè)話題,如果你感興趣,可以到網(wǎng)上搜索相關(guān)的帖子自行閱讀。不是說(shuō)匯編不重要,在很多對(duì)時(shí)序要求非常高的場(chǎng)合,需要利用匯編語(yǔ)言和C語(yǔ)言混合編程才能夠滿足系統(tǒng)的需求。在我們學(xué)習(xí)掌握C語(yǔ)言的同時(shí),也還需要利用閑余的時(shí)間去學(xué)習(xí)了解匯編語(yǔ)言。

      1.從點(diǎn)亮LED(發(fā)光二極管)開始

      在市面上眾多的單片機(jī)學(xué)習(xí)資料中,最基礎(chǔ)的實(shí)驗(yàn)無(wú)疑于點(diǎn)亮LED了,即控制單片機(jī)的I/O的電平的變化。

      如同如下實(shí)例代碼一般

      void main(void){ LedInit();While(1){ LED = ON;DelayMs(500);LED = OFF;DelayMs(500);} }

      程序很簡(jiǎn)單,從它的結(jié)構(gòu)可以看出,LED先點(diǎn)亮500MS,然后熄滅500MS,如此循環(huán)下去,形成的效果就是LED以1HZ的頻率進(jìn)行閃爍。下面讓我們分析上面的程序有沒有什么問(wèn)題。

      看來(lái)看出,好像很正常的啊,能有什么問(wèn)題呢?這個(gè)時(shí)候我們應(yīng)該換一個(gè)思路去想了。試想,整個(gè)程序除了控制LED = ON ; LED = OFF; 這兩條語(yǔ)句外,其余的時(shí)間,全消耗在了DelayMs(500)這兩個(gè)函數(shù)上。而在實(shí)際應(yīng)用系統(tǒng)中是沒有哪個(gè)系統(tǒng)只閃爍一只LED就其它什么事情都不做了的。因此,在這里我們要想辦法,把CPU解放出來(lái),讓它不要白白浪費(fèi)500MS的延時(shí)等待時(shí)間。寧可讓它一遍又一遍的掃描看有哪些任務(wù)需要執(zhí)行,也不要讓它停留在某個(gè)地方空轉(zhuǎn)消耗CPU時(shí)間。

      從上面我們可以總結(jié)出

      (1)無(wú)論什么時(shí)候我們都要以實(shí)際應(yīng)用的角度去考慮程序的編寫。

      (2)無(wú)論什么時(shí)候都不要讓CPU白白浪費(fèi)等待,尤其是延時(shí)(超過(guò)1MS)這樣的地方。

      下面讓我們從另外一個(gè)角度來(lái)考慮如何點(diǎn)亮一顆LED。先看看我們的硬件結(jié)構(gòu)是什么樣子的。

      我手上的單片機(jī)板子是電子工程師之家的開發(fā)的學(xué)習(xí)板。就以它的實(shí)際硬件連接圖來(lái)分析吧。如下圖所示

      (原文件名:led.jpg)

      引用圖片

      一般的LED的正常發(fā)光電流為10~20MA而低電流LED的工作電流在2mA以下(亮度與普通發(fā)光管相同)。在上圖中我們可知,當(dāng)Q1~Q8引腳上面的電平為低電平時(shí),LED發(fā)光。通過(guò)LED的電流約為(VCC-Vd)/ RA2。其中Vd為L(zhǎng)ED導(dǎo)通后的壓降,約為1.7V左右。這個(gè)導(dǎo)通壓降根據(jù)LED顏色的不同,以及工作電流的大小的不同,會(huì)有一定的差別。下面一些參數(shù)是網(wǎng)上有人測(cè)出來(lái)的,供大家參考。紅色的壓降為1.82-1.88V,電流5-8mA,綠色的壓降為1.75-1.82V,電流3-5mA,橙色的壓降為1.7-1.8V,電流3-5mA 蘭色的壓降為3.1-3.3V,電流8-10mA,白色的壓降為3-3.2V,電流10-15mA,(供電電壓5V,LED直徑為5mm)

      74HC573真值表如下:

      (原文件名:74hc573.jpg)

      引用圖片

      通過(guò)這個(gè)真值表我們可以看出。當(dāng)OutputEnable引腳接低電平的時(shí)候,并且LatchEnable引腳為高電平的時(shí)候,Q端電平與D端電平相同。結(jié)合我們的LED硬件連接圖可以知道LED_CS端為高電平時(shí)候,P0口電平的變化即Q端的電平的變化,進(jìn)而引起LED的亮滅變化。由于單片機(jī)的驅(qū)動(dòng)能力有限,在此,74HC573的主要作用就是起一個(gè)輸出驅(qū)動(dòng)的作用。需要注意的是,通過(guò)74HC573的最大電流是有限制的,否則可能會(huì)燒壞74HC573這個(gè)芯片。

      上面這個(gè)圖是從74HC573的DATASHEET中截取出來(lái)的,從上可以看出,每個(gè)引腳允許通過(guò)的最大電流為35mA 整個(gè)芯片允許通過(guò)的最大電流為75mA。在我們?cè)O(shè)計(jì)相應(yīng)的驅(qū)動(dòng)電路時(shí)候,這些參數(shù)是相當(dāng)重要的,而且是最容易被初學(xué)者所忽略的地方。同時(shí)在設(shè)計(jì)的時(shí)候,要留出一定量的余量出來(lái),不能說(shuō)單個(gè)引腳允許通過(guò)的電流為35mA,你就設(shè)計(jì)為35mA,這個(gè)時(shí)候你應(yīng)該把設(shè)計(jì)的上限值定在20mA左右才能保證能夠穩(wěn)定的工作。

      (設(shè)計(jì)相應(yīng)驅(qū)動(dòng)電路時(shí)候,應(yīng)該仔細(xì)閱讀芯片的數(shù)據(jù)手冊(cè),了解每個(gè)引腳的驅(qū)動(dòng)能力,以及整個(gè)芯片的驅(qū)動(dòng)能力)

      了解了相應(yīng)的硬件后,我們?cè)賮?lái)編寫驅(qū)動(dòng)程序。

      首先定義LED的接口 #define LED P0 然后為亮滅常數(shù)定義一個(gè)宏,由硬件連接圖可以,當(dāng)P0輸出為低電平時(shí)候LED亮,P0輸出為高電平時(shí),LED熄滅。

      #define LED_ON()LED = 0x00 //所有LED亮 #define LED_OFF()LED = 0xff //所有LED熄滅

      下面到了重點(diǎn)了,究竟該如何釋放CPU,避免其做延時(shí)空等待這樣的事情呢。很簡(jiǎn)單,我們?yōu)橄到y(tǒng)產(chǎn)生一個(gè)1MS的時(shí)標(biāo)。假定LED需要亮500MS,熄滅500MS,那么我們可以對(duì)這個(gè)1MS的時(shí)標(biāo)進(jìn)行計(jì)數(shù),當(dāng)這個(gè)計(jì)數(shù)值達(dá)到500時(shí)候,清零該計(jì)數(shù)值,同時(shí)把LED的狀態(tài)改變。unsigned int g_u16LedTimeCount = 0;//LED計(jì)數(shù)器

      unsigned char g_u8LedState = 0;//LED狀態(tài)標(biāo)志, 0表示亮,1表示熄滅

      void LedProcess(void){ if(0 == g_u8LedState)//如果LED的狀態(tài)為亮,則點(diǎn)亮LED { LED_ON();} else //否則熄滅LED { LED_OFF();} }

      void LedStateChange(void){ if(g_bSystemTime1Ms)//系統(tǒng)1MS時(shí)標(biāo)到 { g_bSystemTime1Ms = 0;g_u16LedTimeCount++;//LED計(jì)數(shù)器加一

      if(g_u16LedTimeCount >= 500)//計(jì)數(shù)達(dá)到500,即500MS到了,改變LED的狀態(tài)。{ g_u16LedTimeCount = 0;g_u8LedState =!g_u8LedState;} } }

      上面有一個(gè)變量沒有提到,就是g_bSystemTime1Ms。這個(gè)變量可以定義為位變量或者是其它變量,在我們的定時(shí)器中斷函數(shù)中對(duì)其置位,其它函數(shù)使用該變量后,應(yīng)該對(duì)其復(fù)位(清0)。我們的主函數(shù)就可以寫成如下形式(示意代碼)void main(void){ while(1){ LedProcess();LedStateChange();} }

      因?yàn)長(zhǎng)ED的亮或者滅依賴于LED狀態(tài)變量(g_u8LedState)的改變,而狀態(tài)變量的改變,又依賴于LED計(jì)數(shù)器的計(jì)數(shù)值(g_u16LedTimeCount,只有計(jì)數(shù)值達(dá)到一定后,狀態(tài)變量才改變)所以,兩個(gè)函數(shù)都沒有堵塞CPU的地方。讓我們來(lái)從頭到尾分析一遍整個(gè)程序的流程。

      程序首先執(zhí)行LedProcess();函數(shù)

      因?yàn)間_u8LedState 的初始值為0(見定義,對(duì)于全局變量,在定義的時(shí)候最好給其一個(gè)確定的值)所以LED被點(diǎn)亮,然后退出LedStateChange()函數(shù),執(zhí)行下一個(gè)函數(shù)LedStateChange()在函數(shù)LedStateChange()內(nèi)部首先判斷1MS的系統(tǒng)時(shí)標(biāo)是否到了,如果沒有到就直接退出函數(shù),如果到了,就把時(shí)標(biāo)清0以便下一個(gè)時(shí)標(biāo)消息的到來(lái),同時(shí)對(duì)LED計(jì)數(shù)器加一,然后再判斷LED計(jì)數(shù)器是否到達(dá)我們預(yù)先想要的值500,如果沒有,則退出函數(shù),如果有,對(duì)計(jì)數(shù)器清0,以便下次重新計(jì)數(shù),同時(shí)把LED狀態(tài)變量取反,然后退出函數(shù)。

      由上面整個(gè)流程可以知道,CPU所做的事情,就是對(duì)一些計(jì)數(shù)器加一,然后根據(jù)條件改變狀態(tài),再根據(jù)這個(gè)狀態(tài)來(lái)決定是否點(diǎn)亮LED。這些函數(shù)執(zhí)行所花的時(shí)間都是相當(dāng)短的,如果主程序中還有其它函數(shù),則CPU會(huì)順次往下執(zhí)行下去。對(duì)于其它的函數(shù)(如果有的話)也要采取同樣的措施,保證其不堵塞CPU,如果全部基于這種方法設(shè)計(jì),那么對(duì)于不是非常龐大的系統(tǒng),我們的系統(tǒng)依舊可以保證多個(gè)任務(wù)(多個(gè)函數(shù))同時(shí)執(zhí)行。系統(tǒng)的實(shí)時(shí)性得到了一定的保證,從宏觀上看來(lái),就是多個(gè)任務(wù)并發(fā)執(zhí)行。

      好了,這一章就到此為止,讓我們總結(jié)一下,究竟有哪些需要注意的吧。

      (1)無(wú)論什么時(shí)候我們都要以實(shí)際應(yīng)用的角度去考慮程序的編寫。

      (2)無(wú)論什么時(shí)候都不要讓CPU白白浪費(fèi)等待,尤其是延時(shí)(超過(guò)1MS)這樣的地方。(3)設(shè)計(jì)相應(yīng)驅(qū)動(dòng)電路時(shí)候,應(yīng)該仔細(xì)閱讀芯片的數(shù)據(jù)手冊(cè),了解每個(gè)引腳的驅(qū)動(dòng)能力,以及整個(gè)芯片的驅(qū)動(dòng)能力

      (4)最重要的是,如何去釋放CPU(參考本章的例子),這是寫出合格程序的基礎(chǔ)。

      附完整程序代碼(基于電子工程師之家的單片機(jī)開發(fā)板)

      #include

      sbit LED_SEG = P1^4;//數(shù)碼管段選 sbit LED_DIG = P1^5;//數(shù)碼管位選 sbit LED_CS11 = P1^6;//led控制位 sbit ir=P1^7;#define LED P0 //定義LED接口

      bit g_bSystemTime1Ms = 0;// 1MS系統(tǒng)時(shí)標(biāo) unsigned int g_u16LedTimeCount = 0;//LED計(jì)數(shù)器

      unsigned char g_u8LedState = 0;//LED狀態(tài)標(biāo)志, 0表示亮,1表示熄滅

      #define LED_ON()LED = 0x00;//所有LED亮 #define LED_OFF()LED = 0xff;//所有LED熄滅

      void Timer0Init(void){ TMOD &= 0xf0;TMOD |= 0x01;//定時(shí)器0工作方式1 TH0 = 0xfc;//定時(shí)器初始值 TL0 = 0x66;TR0 = 1;ET0 = 1;} void LedProcess(void){ if(0 == g_u8LedState)//如果LED的狀態(tài)為亮,則點(diǎn)亮LED { LED_ON();} else //否則熄滅LED { LED_OFF();} }

      void LedStateChange(void){ if(g_bSystemTime1Ms)//系統(tǒng)1MS時(shí)標(biāo)到 { g_bSystemTime1Ms = 0;g_u16LedTimeCount++;//LED計(jì)數(shù)器加一

      if(g_u16LedTimeCount >= 500)//計(jì)數(shù)達(dá)到500,即500MS到了,改變LED的狀態(tài)。{ g_u16LedTimeCount = 0;g_u8LedState =!g_u8LedState;} } }

      void main(void){ Timer0Init();EA = 1;LED_CS11 = 1;//74HC595輸出允許

      LED_SEG = 0;//數(shù)碼管段選和位選禁止(因?yàn)樗鼈兒蚅ED共用P0口)LED_DIG = 0;while(1){ LedProcess();LedStateChange();} }

      void Time0Isr(void)interrupt 1 { TH0 = 0xfc;//定時(shí)器重新賦初值 TL0 = 0x66;g_bSystemTime1Ms = 1;//1MS時(shí)標(biāo)標(biāo)志位置位 }

      “從單片機(jī)初學(xué)者邁向單片機(jī)工程師”

      第三章----模塊化編程初識(shí)

      好的開始是成功的一半

      通過(guò)上一章的學(xué)習(xí),我想你已經(jīng)掌握了如何在程序中釋放CPU了。希望能夠繼續(xù)堅(jiān)持下去。一個(gè)良好的開始是成功的一半。我們今天所做的一切都是為了在單片機(jī)編程上做的更好。

      在談?wù)摻裉斓闹黝}之前,先說(shuō)下我以前的一些經(jīng)歷。在剛開始接觸到C語(yǔ)言程序的時(shí)候,由于學(xué)習(xí)內(nèi)容所限,寫的程序都不是很大,一般也就幾百行而矣。所以所有的程序都完成在一個(gè)源文件里面。記得那時(shí)候大一參加學(xué)校里的一個(gè)電子設(shè)計(jì)大賽,調(diào)試了一個(gè)多星期,所有程序加起來(lái)大概將近1000行,長(zhǎng)長(zhǎng)的一個(gè)文件,從上瀏覽下來(lái)都要好半天。出了錯(cuò)誤簡(jiǎn)單的語(yǔ)法錯(cuò)誤還好定位,其它一些錯(cuò)誤,往往找半天才找的到。那個(gè)時(shí)候開始知道了模塊化編程這個(gè)東西,也嘗試著開始把程序分模塊編寫。最開始是把相同功能的一些函數(shù)(譬如1602液晶的驅(qū)動(dòng))全部寫在一個(gè)頭文件(.h)文件里面,然后需要調(diào)用的地方包含進(jìn)去,但是很快發(fā)現(xiàn)這種方法有其局限性,很容易犯重復(fù)包含的錯(cuò)誤。

      而且調(diào)用起來(lái)也很不方便。很快暑假的電子設(shè)計(jì)大賽來(lái)臨了,學(xué)校對(duì)我們的單片機(jī)軟件編程進(jìn)行了一些培訓(xùn)。由于學(xué)校歷年來(lái)參加國(guó)賽和省賽,因此積累了一定數(shù)量的驅(qū)動(dòng)模塊,那些日子,老師每天都會(huì)布置一定量的任務(wù),讓我們用這些模塊組合起來(lái),完成一定功能。而正是那些日子模塊化編程的培訓(xùn),使我對(duì)于模塊化編程有了更進(jìn)一步的認(rèn)識(shí)。并且程序規(guī)范也開始慢慢注意起來(lái)。此后的日子,無(wú)論程序的大小,均采用模塊化編程的方式去編寫。很長(zhǎng)一段時(shí)間以來(lái),一直有單片機(jī)愛好者在QQ上和我一起交流。有時(shí)候,他們會(huì)發(fā)過(guò)來(lái)一些有問(wèn)題的程序源文件,讓我?guī)兔π薷囊幌?。同樣是長(zhǎng)長(zhǎng)的一個(gè)文件,而且命名極不規(guī)范,從頭看下來(lái),著實(shí)是痛苦,說(shuō)實(shí)話,還真不如我重新給他們寫一個(gè)更快一些,此話到不假,因?yàn)槭诸^積累了一定量的模塊,在完成一個(gè)新的系統(tǒng)時(shí)候,只需要根據(jù)上層功能需求,在底層模塊的支持下,可以很快方便的完成。而不需要從頭到尾再一磚一瓦的重新編寫。藉此,也可以看出模塊化編程的一個(gè)好處,就是可重復(fù)利用率高。下面讓我們揭開模塊化神秘面紗,一窺其真面目。C語(yǔ)言源文件 *.c 提到C語(yǔ)言源文件,大家都不會(huì)陌生。因?yàn)槲覀兤匠懙某绦虼a幾乎都在這個(gè)XX.C文件里面。編譯器也是以此文件來(lái)進(jìn)行編譯并生成相應(yīng)的目標(biāo)文件。作為模塊化編程的組成基礎(chǔ),我們所要實(shí)現(xiàn)的所有功能的源代碼均在這個(gè)文件里。理想的模塊化應(yīng)該可以看成是一個(gè)黑盒子。即我們只關(guān)心模塊提供的功能,而不管模塊內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。好比我們買了一部手機(jī),我們只需要會(huì)用手機(jī)提供的功能即可,不需要知曉它是如何把短信發(fā)出去的,如何響應(yīng)我們按鍵的輸入,這些過(guò)程對(duì)我們用戶而言,就是是一個(gè)黑盒子。

      在大規(guī)模程序開發(fā)中,一個(gè)程序由很多個(gè)模塊組成,很可能,這些模塊的編寫任務(wù)被分配到不同的人。而你在編寫這個(gè)模塊的時(shí)候很可能就需要利用到別人寫好的模塊的借口,這個(gè)時(shí)候我們關(guān)心的是,它的模塊實(shí)現(xiàn)了什么樣的接口,我該如何去調(diào)用,至于模塊內(nèi)部是如何組織的,對(duì)于我而言,無(wú)需過(guò)多關(guān)注。而追求接口的單一性,把不需要的細(xì)節(jié)盡可能對(duì)外部屏蔽起來(lái),正是我們所需要注意的地方。C語(yǔ)言頭文件 *.h 談及到模塊化編程,必然會(huì)涉及到多文件編譯,也就是工程編譯。在這樣的一個(gè)系統(tǒng)中,往往會(huì)有多個(gè)C文件,而且每個(gè)C文件的作用不盡相同。在我們的C文件中,由于需要對(duì)外提供接口,因此必須有一些函數(shù)或者是變量提供給外部其它文件進(jìn)行調(diào)用。假設(shè)我們有一個(gè)LCD.C文件,其提供最基本的LCD的驅(qū)動(dòng)函數(shù) LcdPutChar(char cNewValue);//在當(dāng)前位置輸出一個(gè)字符 而在我們的另外一個(gè)文件中需要調(diào)用此函數(shù),那么我們?cè)撊绾巫瞿兀?/p>

      頭文件的作用正是在此??梢苑Q其為一份接口描述文件。其文件內(nèi)部不應(yīng)該包含任何實(shí)質(zhì)性的函數(shù)代碼。我們可以把這個(gè)頭文件理解成為一份說(shuō)明書,說(shuō)明的內(nèi)容就是我們的模塊對(duì)外提供的接口函數(shù)或者是接口變量。同時(shí)該文件也包含了一些很重要的宏定義以及一些結(jié)構(gòu)體的信息,離開了這些信息,很可能就無(wú)法正常使用接口函數(shù)或者是接口變量。但是總的原則是:不該讓外界知道的信息就不應(yīng)該出現(xiàn)在頭文件里,而外界調(diào)用模塊內(nèi)接口函數(shù)或者是接口變量所必須的信息就一定要出現(xiàn)在頭文件里,否則,外界就無(wú)法正確的調(diào)用我們提供的接口功能。因而為了讓外部函數(shù)或者文件調(diào)用我們提供的接口功能,就必須包含我們提供的這個(gè)接口描述文件----即頭文件。同時(shí),我們自身模塊也需要包含這份模塊頭文件(因?yàn)槠浒四K源文件中所需要的宏定義或者是結(jié)構(gòu)體),好比我們平常所用的文件都是一式三份一樣,模塊本身也需要包含這個(gè)頭文件。

      下面我們來(lái)定義這個(gè)頭文件,一般來(lái)說(shuō),頭文件的名字應(yīng)該與源文件的名字保持一致,這樣我們便可以清晰的知道哪個(gè)頭文件是哪個(gè)源文件的描述。

      于是便得到了LCD.C的頭文件LCD.h 其內(nèi)容如下。#ifndef _LCD_H_ #define _LCD_H_ extern LcdPutChar(char cNewValue);#endif

      這與我們?cè)谠次募卸x函數(shù)時(shí)有點(diǎn)類似。不同的是,在其前面添加了extern 修飾符表明其是一個(gè)外部函數(shù),可以被外部其它模塊進(jìn)行調(diào)用。#ifndef _LCD_H_ #define _LCD_H_ #endif

      這個(gè)幾條條件編譯和宏定義是為了防止重復(fù)包含。假如有兩個(gè)不同源文件需要調(diào)用LcdPutChar(char cNewValue)這個(gè)函數(shù),他們分別都通過(guò)#include “Lcd.h”把這個(gè)頭文件包含了進(jìn)去。在第一個(gè)源文件進(jìn)行編譯時(shí)候,由于沒有定義過(guò) _LCD_H_ 因此 #ifndef _LCD_H_ 條件成立,于是定義_LCD_H_ 并將下面的聲明包含進(jìn)去。在第二個(gè)文件編譯時(shí)候,由于第一個(gè)文件包含時(shí)候,已經(jīng)將_LCD_H_定義過(guò)了。因此#ifndef _LCD_H_ 不成立,整個(gè)頭文件內(nèi)容就沒有被包含。假設(shè)沒有這樣的條件編譯語(yǔ)句,那么兩個(gè)文件都包含了extern LcdPutChar(char cNewValue);就會(huì)引起重復(fù)包含的錯(cuò)誤。

      不得不說(shuō)的typedef 很多朋友似乎了習(xí)慣程序中利用如下語(yǔ)句來(lái)對(duì)數(shù)據(jù)類型進(jìn)行定義 #define uint unsigned int #define uchar unsigned char 然后在定義變量的時(shí)候 直接這樣使用 uint g_nTimeCounter = 0;不可否認(rèn),這樣確實(shí)很方便,而且對(duì)于移植起來(lái)也有一定的方便性。但是考慮下面這種情況你還會(huì) 這么認(rèn)為嗎?

      #define PINT unsigned int * //定義unsigned int 指針類型 PINT g_npTimeCounter, g_npTimeState;那么你到底是定義了兩個(gè)unsigned int 型的指針變量,還是一個(gè)指針變量,一個(gè)整形變量呢?而你的初衷又是什么呢,想定義兩個(gè)unsigned int 型的指針變量嗎?如果是這樣,那么估計(jì)過(guò)不久就會(huì)到處抓狂找錯(cuò)誤了。

      慶幸的是C語(yǔ)言已經(jīng)為我們考慮到了這一點(diǎn)。typedef 正是為此而生。為了給變量起一個(gè)別名我們可以用如下的語(yǔ)句

      typedef unsigned int uint16;//給指向無(wú)符號(hào)整形變量起一個(gè)別名 uint16 typedef unsigned int * puint16;//給指向無(wú)符號(hào)整形變量指針起一個(gè)別名 puint16 在我們定義變量時(shí)候便可以這樣定義了:

      uint16 g_nTimeCounter = 0;//定義一個(gè)無(wú)符號(hào)的整形變量 puint16 g_npTimeCounter;//定義一個(gè)無(wú)符號(hào)的整形變量的指針

      在我們使用51單片機(jī)的C語(yǔ)言編程的時(shí)候,整形變量的范圍是16位,而在基于32的微處理下的整形變量是32位。倘若我們?cè)?位單片機(jī)下編寫的一些代碼想要移植到32位的處理器上,那么很可能我們就需要在源文件中到處修改變量的類型定義。這是一件龐大的工作,為了考慮程序的可移植性,在一開始,我們就應(yīng)該養(yǎng)成良好的習(xí)慣,用變量的別名進(jìn)行定義。如在8位單片機(jī)的平臺(tái)下,有如下一個(gè)變量定義 uint16 g_nTimeCounter = 0;如果移植32單片機(jī)的平臺(tái)下,想要其的范圍依舊為16位。

      可以直接修改uint16 的定義,即

      typedef unsigned short int uint16;這樣就可以了,而不需要到源文件處處尋找并修改。

      將常用的數(shù)據(jù)類型全部采用此種方法定義,形成一個(gè)頭文件,便于我們以后編程直接調(diào)用。文件名 MacroAndConst.h 其內(nèi)容如下:

      #ifndef _MACRO_AND_CONST_H_ #define _MACRO_AND_CONST_H_

      typedef unsigned int uint16;typedef unsigned int UINT;typedef unsigned int uint;typedef unsigned int UINT16;typedef unsigned int WORD;typedef unsigned int word;typedef int int16;typedef int INT16;typedef unsigned long uint32;

      typedef unsigned long UINT32;typedef unsigned long DWORD;typedef unsigned long dword;typedef long int32;typedef long INT32;typedef signed char int8;typedef signed char INT8;typedef unsigned char byte;typedef unsigned char BYTE;typedef unsigned char uchar;typedef unsigned char UINT8;typedef unsigned char uint8;typedef unsigned char BOOL;#endif

      至此,似乎我們對(duì)于源文件和頭文件的分工以及模塊化編程有那么一點(diǎn)概念了。那么讓我們趁熱打鐵,將上一章的我們編寫的LED閃爍函數(shù)進(jìn)行模塊劃分并重新組織進(jìn)行編譯。

      在上一章中我們主要完成的功能是P0口所驅(qū)動(dòng)的LED以1Hz的頻率閃爍。其中用到了定時(shí)器,以及LED驅(qū)動(dòng)模塊。因而我們可以簡(jiǎn)單的將整個(gè)工程分成三個(gè)模塊,定時(shí)器模塊,LED模塊,以及主函數(shù) 對(duì)應(yīng)的文件關(guān)系如下

      main.c Timer.h?Timer.c--Led.h?Led.c--在開始重新編寫我們的程序之前,先給大家講一下如何在KEIL中建立工程模板吧,這個(gè)模板是我一直沿用至今。希望能夠給大家一點(diǎn)啟發(fā)。

      下面的內(nèi)容就主要以圖片為主了。同時(shí)輔以少量文字說(shuō)明。我們以芯片AT89S52為例。

      (原文件名:1.jpg)

      引用圖片

      (原文件名:2.jpg)

      引用圖片

      (原文件名:3.jpg)

      引用圖片

      (原文件名:4.jpg)

      引用圖片

      (原文件名:5.jpg)

      引用圖片

      (原文件名:6.jpg)

      引用圖片

      (原文件名:7.jpg)

      引用圖片

      (原文件名:8.jpg)

      引用圖片

      (原文件名:9.jpg)

      引用圖片

      (原文件名:10.jpg)

      引用圖片

      (原文件名:11.jpg)

      引用圖片

      (原文件名:12.jpg)

      引用圖片

      (原文件名:13.jpg)

      引用圖片

      (原文件名:14.jpg)

      引用圖片

      (原文件名:15.jpg)

      引用圖片

      (原文件名:16.jpg)

      引用圖片

      (原文件名:17.jpg)

      引用圖片

      (原文件名:18.jpg)

      引用圖片

      (原文件名:19.jpg)

      引用圖片

      (原文件名:20.jpg)

      引用圖片

      (原文件名:21.jpg)

      引用圖片

      (原文件名:22.jpg)

      引用圖片

      OK,到此一個(gè)簡(jiǎn)單的工程模板就建立起來(lái)了,以后我們?cè)傩陆ㄔ次募皖^文件的時(shí)候,就可以直接保存到src文件目錄下面了。

      下面我們開始編寫各個(gè)模塊文件。

      首先編寫Timer.c 這個(gè)文件主要內(nèi)容就是定時(shí)器初始化,以及定時(shí)器中斷服務(wù)函數(shù)。其內(nèi)容如下。#include

      bit g_bSystemTime1Ms = 0;// 1MS系統(tǒng)時(shí)標(biāo)

      void Timer0Init(void){ TMOD &= 0xf0;TMOD |= 0x01;//定時(shí)器0工作方式1 TH0 = 0xfc;//定時(shí)器初始值 TL0 = 0x66;TR0 = 1;ET0 = 1;}

      void Time0Isr(void)interrupt 1 { TH0 = 0xfc;//定時(shí)器重新賦初值 TL0 = 0x66;g_bSystemTime1Ms = 1;//1MS時(shí)標(biāo)標(biāo)志位置位 }

      由于在Led.c文件中需要調(diào)用我們的g_bSystemTime1Ms變量。同時(shí)主函數(shù)需要調(diào)用Timer0Init()初始化函數(shù),所以應(yīng)該對(duì)這個(gè)變量和函數(shù)在頭文件里作外部聲明。以方便其它函數(shù)調(diào)用。

      Timer.h 內(nèi)容如下。#ifndef _TIMER_H_ #define _TIMER_H_

      extern void Timer0Init(void);extern bit g_bSystemTime1Ms;#endif

      完成了定時(shí)器模塊后,我們開始編寫LED驅(qū)動(dòng)模塊。Led.c 內(nèi)容如下:

      #include #include “MacroAndConst.h” #include “Led.h” #include “Timer.h”

      static uint16 g_u16LedTimeCount = 0;//LED計(jì)數(shù)器 static uint8 g_u8LedState = 0;//LED狀態(tài)標(biāo)志, 0表示亮,1表示熄滅

      #define LED P0 //定義LED接口

      #define LED_ON()LED = 0x00;//所有LED亮 #define LED_OFF()LED = 0xff;//所有LED熄滅

      void LedProcess(void){ if(0 == g_u8LedState)//如果LED的狀態(tài)為亮,則點(diǎn)亮LED { LED_ON();} else //否則熄滅LED { LED_OFF();} }

      void LedStateChange(void){ if(g_bSystemTime1Ms)//系統(tǒng)1MS時(shí)標(biāo)到 { g_bSystemTime1Ms = 0;g_u16LedTimeCount++;//LED計(jì)數(shù)器加一

      if(g_u16LedTimeCount >= 500)//計(jì)數(shù)達(dá)到500,即500MS到了,改變LED的狀態(tài)。{ g_u16LedTimeCount = 0;g_u8LedState =!g_u8LedState;} } }

      這個(gè)模塊對(duì)外的借口只有兩個(gè)函數(shù),因此在相應(yīng)的Led.h 中需要作相應(yīng)的聲明。Led.h 內(nèi)容: #ifndef _LED_H_ #define _LED_H_

      extern void LedProcess(void);extern void LedStateChange(void);#endif

      這兩個(gè)模塊完成后,我們將其C文件添加到工程中。然后開始編寫主函數(shù)里的代碼。如下所示:

      #include #include “MacroAndConst.h” #include “Timer.h” #include “Led.h”

      sbit LED_SEG = P1^4;//數(shù)碼管段選 sbit LED_DIG = P1^5;//數(shù)碼管位選 sbit LED_CS11 = P1^6;//led控制位

      void main(void){ LED_CS11 = 1;//74HC595輸出允許

      LED_SEG = 0;//數(shù)碼管段選和位選禁止(因?yàn)樗鼈兒蚅ED共用P0口)LED_DIG = 0;Timer0Init();EA = 1;while(1){ LedProcess();LedStateChange();} }

      整個(gè)工程截圖如下:

      至此,第三章到此結(jié)束。

      一起來(lái)總結(jié)一下我們需要注意的地方吧

      [color=#FF0000]1.C語(yǔ)言源文件(*.c)的作用是什么 2.C語(yǔ)言頭文件(*.h)的作用是什么 3.typedef 的作用 4.工程模板如何組織

      5.如何創(chuàng)建一個(gè)多模塊(多文件)的工程

      “從單片機(jī)初學(xué)者邁向單片機(jī)工程師”之KEY主題討論

      按鍵程序編寫的基礎(chǔ)

      從這一章開始,我們步入按鍵程序設(shè)計(jì)的殿堂。在基于單片機(jī)為核心構(gòu)成的應(yīng)用系統(tǒng)中,用戶輸入是必不可少的一部分。輸入可以分很多種情況,譬如有的系統(tǒng)支持PS2鍵盤的接口,有的系統(tǒng)輸入是基于編碼器,有的系統(tǒng)輸入是基于串口或者USB或者其它輸入通道等等。在各種輸入途徑中,更常見的是,基于單個(gè)按鍵或者由單個(gè)鍵盤按照一定排列構(gòu)成的矩陣鍵盤(行列鍵盤)。我們這一篇章主要討論的對(duì)象就是基于單個(gè)按鍵的程序設(shè)計(jì),以及矩陣鍵盤的程序編寫?!虬存I檢測(cè)的原理

      常見的獨(dú)立按鍵的外觀如下,相信大家并不陌生,各種常見的開發(fā)板學(xué)習(xí)板上隨處可以看到他們的身影。

      (原文件名:1.jpg)

      引用圖片

      總共有四個(gè)引腳,一般情況下,處于同一邊的兩個(gè)引腳內(nèi)部是連接在一起的,如何分辨兩個(gè)引腳是否處在同一邊呢?可以將按鍵翻轉(zhuǎn)過(guò)來(lái),處于同一邊的兩個(gè)引腳,有一條突起的線將他們連接一起,以標(biāo)示它們倆是相連的。如果無(wú)法觀察得到,用數(shù)字萬(wàn)用表的二極管擋位檢測(cè)一下即可。搞清楚這點(diǎn)非常重要,對(duì)于我們畫PCB的時(shí)候的封裝很有益。

      它們和我們的單片機(jī)系統(tǒng)的I/O口連接一般如下:

      (原文件名:2.jpg)

      引用圖片

      對(duì)于單片機(jī)I/O內(nèi)部有上拉電阻的微控制器而言,還可以省掉外部的那個(gè)上拉電阻。簡(jiǎn)單分析一下按鍵檢測(cè)的原理。當(dāng)按鍵沒有按下的時(shí)候,單片機(jī)I/O通過(guò)上拉電阻R接到VCC,我們?cè)诔绦蛑凶x取該I/O的電平的時(shí)候,其值為1(高電平);當(dāng)按鍵S按下的時(shí)候,該I/O被短接到GND,在程序中讀取該I/O的電平的時(shí)候,其值為0(低電平)。這樣,按鍵的按下與否,就和與該按鍵相連的I/O的電平的變化相對(duì)應(yīng)起來(lái)。結(jié)論:我們?cè)诔绦蛑型ㄟ^(guò)檢測(cè)到該I/O口電平的變化與否,即可以知道按鍵是否被按下,從而做出相應(yīng)的響應(yīng)。一切看起來(lái)很美好,是這樣的嗎?

      ◎現(xiàn)實(shí)并非理想

      在我們通過(guò)上面的按鍵檢測(cè)原理得出上述的結(jié)論的時(shí)候,其實(shí)忽略了一個(gè)重要的問(wèn)題,那就是現(xiàn)實(shí)中按鍵按下時(shí)候的電平變化狀態(tài)。我們的結(jié)論是基于理想的情況得出來(lái)的,就如同下面這幅按鍵按下時(shí)候?qū)?yīng)電平變化的波形圖一樣:

      (原文件名:3.jpg)

      引用圖片

      而實(shí)際中,由于按鍵的彈片接觸的時(shí)候,并不是一接觸就緊緊的閉合,它還存在一定的抖動(dòng),盡管這個(gè)時(shí)間非常的短暫,但是對(duì)于我們執(zhí)行時(shí)間以u(píng)s為計(jì)算單位的微控制器來(lái)說(shuō),它太漫長(zhǎng)了。因而,實(shí)際的波形圖應(yīng)該如下面這幅示意圖一樣。

      (原文件名:4.jpg)

      引用圖片

      這樣便存在這樣一個(gè)問(wèn)題。假設(shè)我們的系統(tǒng)有這樣功能需求:在檢測(cè)到按鍵按下的時(shí)候,將某個(gè)I/O的狀態(tài)取反。由于這種抖動(dòng)的存在,使得我們的微控制器誤以為是多次按鍵的按下,從而將某個(gè)I/O的狀態(tài)不斷取反,這并不是我們想要的效果,假如該I/O控制著系統(tǒng)中某個(gè)重要的執(zhí)行的部件,那結(jié)果更不是我們所期待的。于是乎有人便提出了軟件消除抖動(dòng)的思想,道理很簡(jiǎn)單:抖動(dòng)的時(shí)間長(zhǎng)度是一定的,只要我們避開這段抖動(dòng)時(shí)期,檢測(cè)穩(wěn)定的時(shí)候的電平不久可以了嗎?聽起來(lái)確實(shí)不錯(cuò),而且實(shí)際應(yīng)用起來(lái)效果也還可以。于是,各種各樣的書籍中,在提到按鍵檢測(cè)的時(shí)候,總也不忘說(shuō)道軟件消抖。就像下面的偽代碼所描述的一樣。(假設(shè)按鍵按下時(shí)候,低電平有效)

      If(0 == io_KeyEnter)//如果有鍵按下了 { Delayms(20);//先延時(shí)20ms避開抖動(dòng)時(shí)期

      If(0 == io_KeyEnter)//然后再檢測(cè),如果還是檢測(cè)到有鍵按下 { return KeyValue;//是真的按下了,返回鍵值 } else { return KEY_NULL //是抖動(dòng),返回空的鍵值 } while(0 == io_KeyEnter);//等待按鍵釋放 }

      所以合理的分配好微控制的處理時(shí)間,是編寫按鍵程序的基礎(chǔ)。?乍看上去,確實(shí)挺不錯(cuò),實(shí)際中呢?在實(shí)際的系統(tǒng)中,一般是不允許這么樣做的。為什么呢?首先,這里的Delayms(20), 讓微控制器在這里白白等待了20 ms 的時(shí)間,啥也沒干,考慮我在《學(xué)會(huì)釋放CPU》一章中所提及的幾點(diǎn),這是不可取的。其次while(0 == io_KeyEnter);更是程序設(shè)計(jì)中的大忌(極少的特殊情況例外)。任何非極端情況下,都不要使用這樣語(yǔ)句來(lái)堵塞微控制器的執(zhí)行進(jìn)程。原本是等待按鍵釋放,結(jié)果CPU就一直死死的盯住該按鍵,其它事情都不管了,那其它事情不干了嗎?你同意別人可不會(huì)同意

      ◎消除抖動(dòng)有必要嗎? 的確,軟件上的消抖確實(shí)可以保證按鍵的有效檢測(cè)。但是,這種消抖確實(shí)有必要嗎?有人提出了這樣的疑問(wèn)。抖動(dòng)是按鍵按下的過(guò)程中產(chǎn)生的,如果按鍵沒有按下,抖動(dòng)會(huì)產(chǎn)生嗎?如果沒有按鍵按下,抖動(dòng)也會(huì)在I/O上出現(xiàn),我會(huì)立刻把這個(gè)微控制器錘了,永遠(yuǎn)不用這樣一款微控制器。所以抖動(dòng)的出現(xiàn)即意味著按鍵已經(jīng)按下,盡管這個(gè)電平還沒有穩(wěn)定。所以只要我們檢測(cè)到按鍵按下,即可以返回鍵值,問(wèn)題的關(guān)鍵是,在你執(zhí)行完其它任務(wù)的時(shí)候,再次執(zhí)行我們的按鍵任務(wù)的時(shí)候,抖動(dòng)過(guò)程還沒有結(jié)束,這樣便有可能造成重復(fù)檢測(cè)。所以,如何在返回鍵值后,避免重復(fù)檢測(cè),或者在按鍵一按下就執(zhí)行功能函數(shù),當(dāng)功能函數(shù)的執(zhí)行時(shí)間小于抖動(dòng)時(shí)間時(shí)候,如何避免再次執(zhí)行功能函數(shù),就成為我們要考慮的問(wèn)題了。這是一個(gè)仁者見仁,智者見智的問(wèn)題,就留給大家去思考吧。所以消除抖動(dòng)的目的是:防止按鍵一次按下,多次響應(yīng)。

      “從單片機(jī)初學(xué)者邁向單片機(jī)工程師”之KEY主題討論

      基于狀態(tài)轉(zhuǎn)移的獨(dú)立按鍵程序設(shè)計(jì))的那種,有一個(gè)小液晶屏,還有四個(gè)按鍵,功能是時(shí)鐘,鬧鐘以及秒表。在調(diào)整時(shí)間的時(shí)候,短按+鍵每次調(diào)整值加一,長(zhǎng)按的時(shí)候調(diào)整值連續(xù)增加。小的時(shí)候很好奇,這樣的功能到底是如何實(shí)現(xiàn)的呢,今天就讓我們來(lái)剖析它的原理吧。? 本章所描述的按鍵程序要達(dá)到的目的:檢測(cè)按鍵按下,短按,長(zhǎng)按,釋放。即通過(guò)按鍵的返回值我們可以獲取到如下的信息:按鍵按下(短按),按鍵長(zhǎng)按,按鍵連_發(fā),按鍵釋放。不知道大家還記得小時(shí)候玩過(guò)的電子鐘沒有,就是外形類似于CALL 機(jī)(CALL 機(jī),好像是很古老的東西了 狀態(tài)在生活中隨處可見。譬如早上的時(shí)候,鬧鐘把你叫醒了,這個(gè)時(shí)候,你便處于清醒的狀態(tài),馬上你就穿衣起床洗漱吃早餐,這一系列事情就是你在這個(gè)狀態(tài)做的事情。做完這些后你會(huì)去等車或者開車去上班,這個(gè)時(shí)候你就處在上班途中的狀態(tài)?..中午下班時(shí)間到了,你就處于中午下班的狀態(tài),諸如此類等等,在每一個(gè)狀態(tài)我們都會(huì)做一些不同的事情,而總會(huì)有外界條件促使我們轉(zhuǎn)換到另外一種狀態(tài),譬如鬧鐘叫醒我們了,下班時(shí)間到了等等。對(duì)于狀態(tài)的定義出發(fā)點(diǎn)不同,考慮的方向不同,或者會(huì)有些許細(xì)節(jié)上面的差異,但是大的狀態(tài)總是相同的。生活中的事物同樣遵循同樣的規(guī)律,譬如,用一個(gè)智能充電器給你的手機(jī)電池充電,剛開始,它是處于快速充電狀態(tài),隨著電量的增加,電壓的升高,當(dāng)達(dá)到規(guī)定的電壓時(shí)候,它會(huì)轉(zhuǎn)換到恒壓充電??偠灾?,細(xì)心觀察,你會(huì)發(fā)現(xiàn)生活中的總總都可以歸結(jié)為一個(gè)個(gè)的狀態(tài),而狀態(tài)的變換或者轉(zhuǎn)移總是由某些條件引起同時(shí)伴隨著一些動(dòng)作的發(fā)生。我們的按鍵亦遵循同樣的規(guī)律,下面讓我們來(lái)簡(jiǎn)單的描繪一下它的狀態(tài)流程轉(zhuǎn)移圖。

      (原文件名:1.jpg)

      引用圖片

      下面對(duì)上面的流程圖進(jìn)行簡(jiǎn)要的分析。首先按鍵程序進(jìn)入初始狀態(tài)S1,在這個(gè)狀態(tài)下,檢測(cè)按鍵是否按下,如果有按下,則進(jìn)入按鍵消抖狀態(tài)2,在下一次執(zhí)行按鍵程序時(shí)候,直接由按鍵消抖狀態(tài)進(jìn)入按鍵按下狀態(tài)3,在此狀態(tài)下檢測(cè)按鍵是否按下,如果沒有按鍵按下,則返回初始狀態(tài)S1,如果有則可以返回鍵值,同時(shí)進(jìn)入長(zhǎng)按狀態(tài)S4,在長(zhǎng)按狀態(tài)下每次進(jìn)入按鍵程序時(shí)候?qū)Π存I時(shí)間計(jì)數(shù),當(dāng)計(jì)數(shù)值超過(guò)設(shè)定閾值時(shí)候,則表明長(zhǎng)按事件發(fā)生,同時(shí)進(jìn)入按鍵連_發(fā)狀態(tài)S5。如果按鍵鍵值為空鍵,則返回按鍵釋放狀態(tài)S6,否則繼續(xù)停留在本狀態(tài)。在按鍵連_發(fā)狀態(tài)下,如果按鍵鍵值為空鍵則返回按鍵釋放狀態(tài)S6,如果按鍵時(shí)間計(jì)數(shù)超過(guò)連_發(fā)閾值,則返回連_發(fā)按鍵值,清零時(shí)間計(jì)數(shù)后繼續(xù)停留在本狀態(tài)。

      看了這么多,也許你已經(jīng)有一個(gè)模糊的概念了,下面讓我們趁熱打鐵,一起來(lái)動(dòng)手編寫按鍵驅(qū)動(dòng)程序吧。

      下面是我使用的硬件的連接圖。

      (原文件名:2.jpg)

      引用圖片

      硬件連接很簡(jiǎn)單,四個(gè)獨(dú)立按鍵分別接在P3^0------P3^3四個(gè)I/O上面。

      因?yàn)?1單片機(jī)I/O口內(nèi)部結(jié)構(gòu)的限制,在讀取外部引腳狀態(tài)的時(shí)候,需要向端口寫1.在51單片機(jī)復(fù)位后,不需要進(jìn)行此操作也可以進(jìn)行讀取外部引腳的操作。因此,在按鍵的端口沒有復(fù)用的情況下,可以省略此步驟。而對(duì)于其它一些真正雙向I/O口的單片機(jī)來(lái)說(shuō),將引腳設(shè)置成輸入狀態(tài),是必不可少的一個(gè)步驟。下面的程序代碼初始化引腳為輸入。void KeyInit(void){ io_key_1 = 1;io_key_2 = 1;io_key_3 = 1;io_key_4 = 1;} 根據(jù)按鍵硬件連接定義按鍵鍵值

      #define KEY_VALUE_1 0x0e #define KEY_VALUE_2 0x0d #define KEY_VALUE_3 0x0b #define KEY_VALUE_4 0x07 #define KEY_NULL 0x0f 下面我們來(lái)編寫按鍵的硬件驅(qū)動(dòng)程序。

      根據(jù)第一章所描述的按鍵檢測(cè)原理,我們可以很容易的得出如下的代碼: static uint8 KeyScan(void){ if(io_key_1 == 0)return KEY_VALUE_1;if(io_key_2 == 0)return KEY_VALUE_2;if(io_key_3 == 0)return KEY_VALUE_3;if(io_key_4 == 0)return KEY_VALUE_4;return KEY_NULL;} 其中io_key_1等是我們按鍵端口的定義,如下所示: sbit io_key_1 = P3^0;sbit io_key_2 = P3^1;sbit io_key_3 = P3^2;sbit io_key_4 = P3^3;

      KeyScan()作為底層按鍵的驅(qū)動(dòng)程序,為上層按鍵掃描提供一個(gè)接口,這樣我們編寫的上層按鍵掃描函數(shù)可以幾乎不用修改就可以拿到我們的其它程序中去使用,使得程序復(fù)用性大大提高。同時(shí),通過(guò)有意識(shí)的將與底層硬件連接緊密的程序和與硬件無(wú)關(guān)的代碼分開寫,使得程序結(jié)構(gòu)層次清晰,可移植性也更好。對(duì)于單片機(jī)類的程序而言,能夠做到函數(shù)級(jí)別的代碼重用已經(jīng)足夠了。在編寫我們的上層按鍵掃描函數(shù)之前,需要先完成一些宏定義。//定義長(zhǎng)按鍵的TICK數(shù),以及連_發(fā)間隔的TICK數(shù) #define KEY_LONG_PERIOD 100 #define KEY_CONTINUE_PERIOD 25

      //定義按鍵返回值狀態(tài)(按下,長(zhǎng)按,連_發(fā),釋放)#define KEY_DOWN 0x80 #define KEY_LONG 0x40 #define KEY_CONTINUE 0x20 #define KEY_UP 0x10

      //定義按鍵狀態(tài)

      #define KEY_STATE_INIT 0 #define KEY_STATE_WOBBLE 1 #define KEY_STATE_PRESS 2 #define KEY_STATE_LONG 3 #define KEY_STATE_CONTINUE 4 #define KEY_STATE_RELEASE 5

      接著我們開始編寫完整的上層按鍵掃描函數(shù),按鍵的短按,長(zhǎng)按,連按,釋放等等狀態(tài)的判斷均是在此函數(shù)中完成。對(duì)照狀態(tài)流程轉(zhuǎn)移圖,然后再看下面的函數(shù)代碼,可以更容易的去理解函數(shù)的執(zhí)行流程。完整的函數(shù)代碼如下: void GetKey(uint8 *pKeyValue){ static uint8 s_u8KeyState = KEY_STATE_INIT;static uint8 s_u8KeyTimeCount = 0;static uint8 s_u8LastKey = KEY_NULL;//保存按鍵釋放時(shí)候的鍵值 uint8 KeyTemp = KEY_NULL;

      KeyTemp = KeyScan();//獲取鍵值

      switch(s_u8KeyState){ case KEY_STATE_INIT : { if(KEY_NULL!=(KeyTemp)){ s_u8KeyState = KEY_STATE_WOBBLE;} } break;

      case KEY_STATE_WOBBLE : //消抖 { s_u8KeyState = KEY_STATE_PRESS;} break;

      case KEY_STATE_PRESS : { if(KEY_NULL!=(KeyTemp)){ s_u8LastKey = KeyTemp;//保存鍵值,以便在釋放按鍵狀態(tài)返回鍵值 KeyTemp |= KEY_DOWN;//按鍵按下 s_u8KeyState = KEY_STATE_LONG;} else { s_u8KeyState = KEY_STATE_INIT;} } break;

      case KEY_STATE_LONG : { if(KEY_NULL!=(KeyTemp)){ if(++s_u8KeyTimeCount > KEY_LONG_PERIOD){ s_u8KeyTimeCount = 0;KeyTemp |= KEY_LONG;//長(zhǎng)按鍵事件發(fā)生 s_u8KeyState = KEY_STATE_CONTINUE;} } else { s_u8KeyState = KEY_STATE_RELEASE;} } break;

      case KEY_STATE_CONTINUE : { if(KEY_NULL!=(KeyTemp)){ if(++s_u8KeyTimeCount > KEY_CONTINUE_PERIOD){ s_u8KeyTimeCount = 0;KeyTemp |= KEY_CONTINUE;} } else { s_u8KeyState = KEY_STATE_RELEASE;} } break;

      case KEY_STATE_RELEASE : { s_u8LastKey |= KEY_UP;KeyTemp = s_u8LastKey;s_u8KeyState = KEY_STATE_INIT;} break;

      default : break;} *pKeyValue = KeyTemp;//返回鍵值 } 關(guān)于這個(gè)函數(shù)內(nèi)部的細(xì)節(jié)我并不打算花過(guò)多筆墨去講解。對(duì)照著按鍵狀態(tài)流程轉(zhuǎn)移圖,然后去看程序代碼,你會(huì)發(fā)現(xiàn)其實(shí)思路非常清晰。最能讓人理解透徹的,莫非就是將整個(gè)程序自己看懂,然后想象為什么這個(gè)地方要這樣寫,抱著思考的態(tài)度去閱讀程序,你會(huì)發(fā)現(xiàn)自己的程序水平會(huì)慢慢的提高。所以我更希望的是你能夠認(rèn)認(rèn)真真的看完,然后思考。也許你會(huì)收獲更多。

      不管怎么樣,這樣的一個(gè)程序已經(jīng)完成了本章開始時(shí)候要求的功能:按下,長(zhǎng)按,連按,釋放。事實(shí)上,如果掌握了這種基于狀態(tài)轉(zhuǎn)移的思想,你會(huì)發(fā)現(xiàn)要求實(shí)現(xiàn)其它按鍵功能,譬如,多鍵按下,功能鍵等等,亦相當(dāng)簡(jiǎn)單,在下一章,我們就去實(shí)現(xiàn)它。

      在主程序中我編寫了這樣的一段代碼,來(lái)演示我實(shí)現(xiàn)的按鍵功能。void main(void){ uint8 KeyValue = KEY_NULL;uint8 temp = 0;LED_CS11 = 1;//流水燈輸出允許 LED_SEG = 0;LED_DIG = 0;Timer0Init();KeyInit();EA = 1;while(1){ Timer0MainLoop();KeyMainLoop(&KeyValue);

      if(KeyValue ==(KEY_VALUE_1 | KEY_DOWN))P0 = ~1;if(KeyValue ==(KEY_VALUE_1 | KEY_LONG))P0 = ~2;if(KeyValue ==(KEY_VALUE_1 | KEY_CONTINUE)){ P0 ^= 0xf0;} if(KeyValue ==(KEY_VALUE_1 | KEY_UP))P0 = 0xa5;} } 按住第一個(gè)鍵,可以清晰的看到P0口所接的LED的狀態(tài)的變化。當(dāng)按鍵按下時(shí)候,第一個(gè)LED燈亮,等待2 S后第二個(gè)LED亮,第一個(gè)熄滅,表示長(zhǎng)按事件發(fā)生。再過(guò)500 ms 第5~8個(gè)LED閃爍,表示連按事件發(fā)生。當(dāng)釋放按鍵時(shí)候,P0口所接的LED的狀態(tài)為: 滅亮滅亮亮滅亮滅,這也正是P0 = 0xa5這條語(yǔ)句的功能。

      第二篇:語(yǔ)言學(xué)習(xí)心得

      匯編學(xué)習(xí)心得

      08網(wǎng)工

      (一)班 李銳 0804031002 在大三接觸匯編語(yǔ)言之前,我們?cè)谟?jì)算機(jī)組成原理課程中就已經(jīng)有所了解了,但也只是略微明白一些如jmp,mov這樣的指令,極度缺乏系統(tǒng)性的學(xué)習(xí)。

      在接觸這門課程后,感到匯編語(yǔ)言并不是很容易就可以弄懂的。相比較以前學(xué)過(guò)的高級(jí)語(yǔ)言如C、C++等,電腦等于在遷就人的思維方式,但學(xué)匯編,人卻必須要去遷就電腦的思維方式,要設(shè)身處地地用電腦的角度去思考問(wèn)題,這就是我們學(xué)習(xí)匯編語(yǔ)言時(shí)遇到的最大的障礙。

      另外,在C語(yǔ)言中不到10個(gè)語(yǔ)句構(gòu)成的程序,用匯編語(yǔ)言卻要好幾十行甚至上百行。這不得不讓我們對(duì)匯編產(chǎn)生一種恐懼感。事實(shí)上,這是完全不必要的。一旦對(duì)它的原理掌握后,編寫程序就容易多了。另外,學(xué)習(xí)匯編語(yǔ)言能讓我們更加了解計(jì)算機(jī)內(nèi)部的組織結(jié)構(gòu),對(duì)我們計(jì)算機(jī)專業(yè)的學(xué)生來(lái)說(shuō),學(xué)習(xí)匯編也是提升綜合能力的關(guān)鍵環(huán)節(jié)。

      匯編的學(xué)習(xí)不僅僅是學(xué)習(xí)其語(yǔ)法,而更多的是學(xué)習(xí)計(jì)算機(jī)基本的體系結(jié)構(gòu)。其中遇到很多新的概念,名字。如寄存器、中斷、尋址方式等。這些概念在剛接觸匯編這門課的時(shí)候難以理解,但在之后的學(xué)習(xí)中通過(guò)老師的講解,自己親手編程的方式也就漸漸清晰明了。

      我們?cè)趯W(xué)習(xí)之前都需要明確什么是匯編語(yǔ)言。計(jì)算機(jī)能夠直接識(shí)別的數(shù)據(jù)是由二進(jìn)制數(shù)0和1組成的代碼。機(jī)器指令就是用二進(jìn)制代碼組成的指令,一條機(jī)器指令控制計(jì)算機(jī)完成一個(gè)基本操作。為了克服機(jī)器語(yǔ)言的缺點(diǎn),人們采用助記符表示機(jī)器指令的操作碼,用變量代替操作數(shù)的存放地址等,這樣就形成了匯編語(yǔ)言。

      經(jīng)過(guò)一個(gè)學(xué)期的學(xué)習(xí),我也慢慢摸出了匯編學(xué)習(xí)的規(guī)律。

      首先,學(xué)習(xí)這門語(yǔ)言時(shí)如果能聯(lián)系上以前學(xué)過(guò)的其他高級(jí)語(yǔ)言的知識(shí),則會(huì)起到良好的效果。例如C語(yǔ)言程序的運(yùn)行邏輯結(jié)構(gòu)有順序(按語(yǔ)句依次執(zhí)行)、分支結(jié)構(gòu)(IF...THEN...ELSE...),循環(huán)結(jié)構(gòu)(FOR...NEXT)三種結(jié)構(gòu),也通過(guò)C語(yǔ)言了解并掌握了什么是子程序,什么是調(diào)用。事實(shí)上,匯編語(yǔ)言中有關(guān)程序結(jié)構(gòu),子程序等等的知識(shí)都是跟C語(yǔ)言十分相似的,只是在編程時(shí)用到的語(yǔ)言不同:匯編語(yǔ)言完全面向機(jī)器,需要指明數(shù)據(jù)在寄存器、內(nèi)存中的流向。

      第二,學(xué)習(xí)匯編語(yǔ)言,首要問(wèn)題是學(xué)習(xí)80X86指令系統(tǒng)。如果能將指令系統(tǒng)中的各個(gè)助記符、格式等都能完全掌握并靈活運(yùn)用,大部分工作就已經(jīng)完成了。指令系統(tǒng)確定了CPU所能完成的功能,是用匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)的最基本部分。如果不熟悉匯編指令的功能及其有關(guān)規(guī)定,那肯定不能靈活使用匯編語(yǔ)言。

      指令的種類十分繁雜,但其格式卻是統(tǒng)一的。

      其中方括號(hào)中的內(nèi)容為可選項(xiàng)。指令助記符決定了指令的功能,對(duì)應(yīng)一條二進(jìn)制編碼的機(jī)器指令。指令的操作數(shù)個(gè)數(shù)由該指令確定,可以沒有操作數(shù),也可以有一個(gè)或多個(gè)操作數(shù),大多數(shù)指令要顯示寫出來(lái),還有些操作數(shù)是隱含的。當(dāng)指令包含操作數(shù)的時(shí)候,書寫時(shí)必須遵守:

      1、指令助記符和操作數(shù)之間有分隔符,比如幾個(gè)空格;

      2、如果含有多個(gè)操作數(shù),操作數(shù)之間用逗號(hào)分隔。

      現(xiàn)在簡(jiǎn)單總結(jié)匯編語(yǔ)言指令的分類:

      1、數(shù)據(jù)傳送指令;

      2、標(biāo)志位操作指令;3、算術(shù)運(yùn)算指令;

      4、邏輯運(yùn)算指令;

      5、移位運(yùn)算指令;

      6、位操作指令;

      7、比較運(yùn)算指令;

      8、循環(huán)指令;

      9、轉(zhuǎn)移指令;

      10、條件設(shè)置字節(jié)指令;

      11、字符串操作指令;

      12、BCD碼運(yùn)算調(diào)整指令;

      13、處理器指令。

      在編寫匯編程序時(shí),應(yīng)該注意特別容易出現(xiàn)的錯(cuò)誤,例如在編寫數(shù)據(jù)傳送指令時(shí),目的操作數(shù)和源操作數(shù)的類型一定要匹配,CS不能作為目的操作數(shù),offset后只能跟簡(jiǎn)單地址符號(hào),等等。

      匯編語(yǔ)言的尋址方式有直接尋址,寄存器尋址,基址變址尋址,相對(duì)基址變址尋址等等,掌握這些都是編寫匯編程序很重要的環(huán)節(jié)。

      匯編語(yǔ)言中的程序結(jié)構(gòu),子程序等知識(shí)也會(huì)幫助我們編寫出一個(gè)更加完善的匯編程序。另外,我們還應(yīng)該掌握DOS系統(tǒng)功能調(diào)用,宏匯編等知識(shí)。這里要對(duì)子程序和宏匯編加以區(qū)分,我的理解是:子程序是調(diào)用,而宏是替換,比如一個(gè)MAX宏,所有出現(xiàn)MAX的地方,都用宏代碼代替。

      在學(xué)習(xí)匯編語(yǔ)言時(shí),指令的功能是學(xué)習(xí)和掌握的重點(diǎn),要準(zhǔn)確有效并合理的使用這些指令,必須了解一些使用的規(guī)則?,F(xiàn)對(duì)匯編語(yǔ)言編程時(shí)的規(guī)則進(jìn)行總結(jié),歸納起來(lái)有三點(diǎn):

      1、要求指令操作數(shù)的尋址方式;

      2、指令對(duì)標(biāo)志位的影響和標(biāo)志位對(duì)指令的影響;

      3、指令的執(zhí)行時(shí)間,對(duì)可完成同樣功能的指令,要選用執(zhí)行時(shí)間短的指令。

      還有一點(diǎn)十分重要。和所有的程序設(shè)計(jì)語(yǔ)言一樣,要學(xué)好匯編語(yǔ)言,實(shí)驗(yàn)是必不可少的環(huán)節(jié)。我們深有體會(huì):書上的程序都能看懂,基本原理也都明白,但是在自己親手編寫程序時(shí),卻無(wú)從下手,甚至連第一句該怎么寫都不知道。通過(guò)實(shí)驗(yàn),可以在很大程度上加深印象。在書上看程序,一切都是理所當(dāng)然,十分順利,而自己動(dòng)手,才會(huì)真正發(fā)現(xiàn)自己的不足之處。程序的編寫在記事本中進(jìn)行即可,掌握debug的使用對(duì)實(shí)驗(yàn)是有很大幫助的。

      現(xiàn)在匯編語(yǔ)言的學(xué)課程已經(jīng)告一段落了,學(xué)習(xí)過(guò)程中遇到的所有困難以及遺留的難點(diǎn)都需要我們?cè)谄溆鄷r(shí)間里逐步攻克,在打好基礎(chǔ)的前提下,學(xué)習(xí)更加專業(yè)的匯編知識(shí)。

      以上便是我在學(xué)習(xí)匯編語(yǔ)言過(guò)程中所有的心得體會(huì),我們會(huì)在不斷的學(xué)習(xí)與實(shí)踐中向著更深入的層面邁進(jìn)

      第三篇:語(yǔ)言學(xué)習(xí)心得

      匯編語(yǔ)言學(xué)習(xí)心得

      在接觸這門課之前就已對(duì)匯編語(yǔ)言有所了解,一方面是在計(jì)算機(jī)組成原理中有所涉及,雖然那時(shí)只知道簡(jiǎn)單的mov、add、jmp指令,不清楚其具體用法,缺乏系統(tǒng)性的學(xué)習(xí);另一方面是在相關(guān)書籍中了解到匯編語(yǔ)言寫驅(qū)動(dòng)比較好但比較難,當(dāng)時(shí)就覺得匯編是門很牛的語(yǔ)言,很想學(xué)習(xí)。接觸這門課后,感到匯編語(yǔ)言的確不是很容易就可以弄懂的,相比較以前學(xué)過(guò)的高級(jí)語(yǔ)言如C、C++等,電腦等于在遷就人的思維方式,但學(xué)匯編,人卻必須要去遷就電腦的思維方式,要設(shè)身處地地用電腦的角度去思考問(wèn)題,這就是我們學(xué)習(xí)匯編語(yǔ)言時(shí)遇到的最大的障礙。通過(guò)這一學(xué)期的學(xué)習(xí),對(duì)匯編有了初步的掌握,可以說(shuō)是匯編的入門教程。

      在接觸匯編語(yǔ)言的時(shí)候,對(duì)匯編的第一印象就是覺得這種語(yǔ)言非常繁瑣和松散,里面有很多細(xì)小的知識(shí)點(diǎn),而且有很多規(guī)定,必須要根據(jù)嚴(yán)格的規(guī)則來(lái)編寫才能夠?qū)懗稣_的程序,譬如一些指令的具體作用,如XLAT指令、CWB指令、LEA指令、OFFSET等的含義和功能,還有大于、小于、等于指令的寫法都要記住,不能像高級(jí)語(yǔ)言里面用符號(hào)“< > =”就能夠?qū)崿F(xiàn)了,正是匯編中的這些規(guī)則讓我覺得匯編真是特別繁瑣,所以在剛剛開始學(xué)習(xí)匯編的時(shí)候經(jīng)常覺得有些不知所措,特別是對(duì)于幾種尋址方式,還有各個(gè)段的功能,以及各種寄存器的作用都覺得學(xué)的很混亂,雖然老師在上課時(shí)說(shuō)的都很詳細(xì)了,但是在當(dāng)時(shí)好像聽懂了,但是很快又弄不清了,還有一些指令的用法會(huì)很快就忘記,或者是記混了,但是慢慢接觸多了,特別是在做實(shí)驗(yàn)的之后,學(xué)習(xí)得很快,因?yàn)橐前褜W(xué)過(guò)的知識(shí)具體應(yīng)用到現(xiàn)實(shí)中,對(duì)于知識(shí)的掌握要求就更深一步了,在實(shí)驗(yàn)過(guò)程中,發(fā)現(xiàn)了很多問(wèn)題,例如一些尋址方式的應(yīng)用,字符串的定義末尾要加上$符號(hào),在利用AX、BX、CX、DX這幾個(gè)寄存器的時(shí)候注意考慮PUSH進(jìn)棧對(duì)數(shù)據(jù)進(jìn)行保護(hù),通過(guò)在實(shí)驗(yàn)中不斷出現(xiàn)錯(cuò)誤并改正,對(duì)匯編語(yǔ)言的掌握和使用能力都有所提高了。

      剛開始對(duì)匯編的最大感覺就是覺得用起來(lái)很麻煩,不像高級(jí)語(yǔ)言那么隨意,寄存器就那么幾個(gè),用的時(shí)候要好好利用,而且還要考慮到計(jì)算機(jī)內(nèi)部的工作情況,特別是數(shù)據(jù)在內(nèi)存中的存儲(chǔ)情況,但是經(jīng)過(guò)學(xué)習(xí),發(fā)現(xiàn)匯編語(yǔ)言對(duì)我們學(xué)習(xí)好其他語(yǔ)言是非常有用的,原來(lái)在C語(yǔ)言中一直不是非常清楚的數(shù)據(jù)和地址的區(qū)別也通過(guò)學(xué)習(xí)匯編而了解得很清楚,通過(guò)匯編對(duì)CPU里面的工作情況也有了一定的認(rèn)識(shí),寫有些指令的時(shí)候要考慮到CPU里面的標(biāo)志位的改變和利用標(biāo)志位來(lái)實(shí)現(xiàn)一些功能,這些在高級(jí)語(yǔ)言中是沒有的。對(duì)于匯編中的指令我很多記不住,由于課件中的程序的注釋都是中文的,而課本上的注釋都是英文的,剛開始覺得看課件比較好一些,但是后來(lái)我發(fā)現(xiàn)課本上的英文注釋更加容易理解和記憶,和用到的指令是匹配的,因?yàn)橹噶钜捕际怯⑽目s寫方式的,而且都是一些簡(jiǎn)單的單詞,閱讀起來(lái)并不復(fù)雜。

      和所有的程序設(shè)計(jì)語(yǔ)言一樣,要學(xué)好匯編語(yǔ)言,實(shí)驗(yàn)是必不可少的環(huán)節(jié)。我深有體會(huì):書上的程序都能看懂,基本原理也都明白,但是在自己親手編寫程序時(shí),卻無(wú)從下手,甚至連第一句該怎么寫都不知道。后來(lái)隨著老師的講解和實(shí)驗(yàn)的進(jìn)行,知道了程序的編寫格式,包括數(shù)據(jù)段、堆棧段和代碼段,其中數(shù)據(jù)段和堆棧段可以不定義,但代碼段是必不可少的,也掌握了該怎么調(diào)試程序、運(yùn)行程序等。特別是debug命令的使用,可以配合與list文件的使用,讓我們可以調(diào)試排錯(cuò)、檢查結(jié)果是否正確等,掌握debug的使用對(duì)實(shí)驗(yàn)有很大的幫助。程序的編寫在記事本中進(jìn)行即可,再在mask中編譯,link中連接運(yùn)行,當(dāng)然也可以在專門的匯編工具中進(jìn)行。通過(guò)實(shí)驗(yàn),可以在很大程度上加深印象,在書上看程序,一切都是理所當(dāng)然,十分順利,而自己動(dòng)手,才會(huì)真正發(fā)現(xiàn)自己的不足之處

      老師經(jīng)常說(shuō)其實(shí)很多知識(shí)都是相通的,在學(xué)習(xí)了匯編之后對(duì)這點(diǎn)可以說(shuō)是深有感觸,而且在匯編也和很多其他課程息息相關(guān),譬如本學(xué)期的微機(jī)接口課程里面所用得到的也是匯編語(yǔ)言,匯編雖然是比較低級(jí)的語(yǔ)言,但是許多工作還是需要通過(guò)匯編來(lái)完成,而且很好的掌握匯編后,能夠?qū)τ?jì)算機(jī)硬件很好的支配,匯編很接近計(jì)算機(jī)的底層,總的來(lái)說(shuō)匯編在今天的作用還是不容小覷的,學(xué)習(xí)好了匯編這門課程對(duì)于學(xué)習(xí)其他課程和進(jìn)一步學(xué)好計(jì)算機(jī)都有很大的幫助。

      14GB軟件一班 01410271X07 肖雅麗

      第四篇:語(yǔ)言學(xué)習(xí)心得

      2010年6月英語(yǔ)四級(jí)、六級(jí)考試愈發(fā)臨近,大家都希望掌握一些應(yīng)試技巧,從而能夠在四六級(jí)考試中取得比較滿意的成績(jī)。下面滬江網(wǎng)校的方辰暉老師從幾個(gè)方面來(lái)談一下語(yǔ)言學(xué)習(xí)以及四級(jí)六級(jí)應(yīng)試技巧等問(wèn)題。

      語(yǔ)言是人類經(jīng)過(guò)長(zhǎng)期實(shí)踐積累的,用于交流溝通的工具。歷經(jīng)無(wú)數(shù)代積累演變下來(lái)的語(yǔ)言,學(xué)好肯定不是一朝一夕之功,這就決定了,學(xué)習(xí)語(yǔ)言不可能一蹴而就,更不能閉門造車。但是,如果我們能提高對(duì)語(yǔ)言的敏感性,語(yǔ)言學(xué)習(xí)的進(jìn)程還是可以大大加快的。

      語(yǔ)言學(xué)習(xí)包括哪些?

      任何語(yǔ)言都分為語(yǔ)法和詞匯?;A(chǔ)是語(yǔ)法,但語(yǔ)法是有限的、固定的,可以在初級(jí)階段學(xué)完,這里,可以建議大家在接觸某種語(yǔ)言一年,對(duì)它有了初步的感性認(rèn)識(shí)之后,選一本權(quán)威的語(yǔ)法書進(jìn)行系統(tǒng)學(xué)習(xí),在此不再贅述。關(guān)鍵是詞匯,詞匯是無(wú)限的,變化發(fā)展的,不斷涌現(xiàn)的。無(wú)論對(duì)中小學(xué)生,還是專家學(xué)者,任何人在任何領(lǐng)域的學(xué)習(xí)工作中,都會(huì)遇到生詞、新詞。因此,學(xué)習(xí)語(yǔ)言,就是初級(jí)階段學(xué)語(yǔ)法,高級(jí)階段學(xué)詞匯。語(yǔ)法學(xué)習(xí)的階段是基礎(chǔ),萬(wàn)事開頭難,但這個(gè)階段,一般只要二到三年即可完成,因?yàn)檎Z(yǔ)法是有限的。學(xué)習(xí)語(yǔ)言的大部分時(shí)間都耗在了后者上,而且詞匯量的多寡往往就可以決定語(yǔ)言的水平。因此,對(duì)于想進(jìn)一步提高語(yǔ)言水平的人來(lái)說(shuō),擴(kuò)大詞匯量就是學(xué)習(xí)語(yǔ)言的重中之重了。

      關(guān)于詞匯的認(rèn)知

      人類對(duì)于事物的認(rèn)知有四個(gè)過(guò)程,即:

      1.不知道不知道,自己沒有接觸過(guò),根本沒有意識(shí)到自己的無(wú)知。

      2.知道不知道,開始意識(shí)到自己的無(wú)知,正設(shè)法去了解這一事物。

      3.知道知道,經(jīng)過(guò)學(xué)習(xí),基本弄清了這一事物的來(lái)龍去脈。

      4.不知道知道,對(duì)于這一事物早已了然于心,熟練的很,它已然成為自己不可或缺的一部分。

      對(duì)于詞匯的認(rèn)知,也有一個(gè)類似的過(guò)程:

      1.第一次聽或第一次看到,不知其意,需要查閱詞典。

      2.查閱詞典,了解意思后,再次聽到或讀到時(shí),知其意,無(wú)需再查,但自己不會(huì)主動(dòng)使用這個(gè)詞到對(duì)話或?qū)懽髦小N覀兎Q其為閱讀詞匯或聽力詞匯。

      3.會(huì)拼寫,自己會(huì)主動(dòng)使用這個(gè)詞到對(duì)話或?qū)懽髦校看握f(shuō)或者寫,都會(huì)在大腦中再現(xiàn)第一次學(xué)習(xí)這個(gè)詞的情景,因?yàn)槟阈枰叵脒@個(gè)詞的用法。我們稱其為寫作詞匯或口語(yǔ)詞

      匯。

      4.徹底忘掉了第一次學(xué)習(xí)這個(gè)詞的情景。只有達(dá)到這一步,我們才敢說(shuō)你真正掌握了這個(gè)詞匯。

      在這里,我要聲明一點(diǎn),詞匯的學(xué)習(xí)不是一次性完成的,因?yàn)檫@不符合人類認(rèn)知的特點(diǎn)。我不提倡通過(guò)背詞匯書學(xué)習(xí)語(yǔ)言,因?yàn)檫@種學(xué)習(xí)方法,記得快,忘得也快。在這種情況下,詞匯在大腦的駐留時(shí)間僅僅能維持幾天,就算應(yīng)付得了后天的四級(jí)考試,肯定也無(wú)法應(yīng)付后年的六級(jí)或八級(jí)考試。

      詞匯只能在實(shí)際運(yùn)用中學(xué)習(xí),我們和任何一個(gè)詞的首次邂逅,都要在實(shí)際運(yùn)用中發(fā)生,應(yīng)該是第一次在電視電臺(tái)里聽到,或是第一次在報(bào)刊雜志里看到,肯定不是第一次在詞匯書的背到。對(duì)于,第一次聽到的單詞,我們可能無(wú)法正確拼出,所以查閱這個(gè)詞也就存在困難。我們要盡量把首次邂逅某個(gè)生詞的機(jī)會(huì)放在閱讀里。

      如何通過(guò)閱讀快速提高詞匯量

      大家知道,對(duì)于除專業(yè)領(lǐng)域的術(shù)語(yǔ)以外的詞匯,從概率論上來(lái)說(shuō),任何一個(gè)詞作為新詞首次出現(xiàn)在普通文章中的概率是大致相同的。這就意味著,兩個(gè)水平相當(dāng)?shù)膶W(xué)生,以學(xué)習(xí)相同數(shù)量的新詞作為閱讀目的的話,所需的閱讀量也大致相同,假定他們的閱讀速度相同的話,則耗時(shí)也大致相同。

      任何一個(gè)單詞,首次邂逅千萬(wàn)不要對(duì)其視而不見,我們必須認(rèn)真查閱詞典,可以使用電子詞典,或在線詞典,如新滬江小D。因?yàn)?,這樣可以節(jié)省很多時(shí)間。舉個(gè)例子:有兩個(gè)人,一個(gè)人見面兩次才查生詞,一個(gè)人首次見面即查生詞,要學(xué)習(xí)同等數(shù)量的生詞的話,前者所需時(shí)間是后者的兩倍。

      首次見面之后,最好盡快安排機(jī)會(huì)第二次相遇。方法就是,大量閱讀同類文章,因?yàn)槿祟惖拇竽X是會(huì)遺忘的,在遺忘之前,再次刺激大腦,會(huì)產(chǎn)生更有效的記憶。一般情況下,一個(gè)生詞再短期內(nèi)的第二次相遇以后,就會(huì)轉(zhuǎn)化為閱讀詞匯。

      成為閱讀詞匯的單詞,要?jiǎng)帕空覚C(jī)會(huì)賣弄出去,在不同的機(jī)會(huì)賣弄幾次以后,閱讀詞匯可以轉(zhuǎn)化為寫作詞匯或口語(yǔ)詞匯。當(dāng)你在潛意識(shí)下寫出或說(shuō)出這個(gè)詞的時(shí)候,恭喜你,這個(gè)詞已經(jīng)寫進(jìn)你的植物性神經(jīng)了。

      總而言之,通過(guò)閱讀提高詞匯量的捷徑就是,見到生詞立即查,似曾相識(shí)先回憶,學(xué)到立即要賣弄,賣弄多了可掌握。

      關(guān)于大學(xué)的英語(yǔ)學(xué)習(xí)

      大學(xué)四年,是學(xué)習(xí)英語(yǔ)的黃金時(shí)期。這個(gè)階段,少了很多高中時(shí)的學(xué)習(xí)負(fù)擔(dān),英語(yǔ)學(xué)習(xí)不用以提高考試成績(jī)?yōu)槟康?,考試真正成為了檢驗(yàn)學(xué)習(xí)效果的手段。

      大學(xué)時(shí)期的英語(yǔ)學(xué)習(xí),目的各有不同,有人為了通過(guò)考試,如四六級(jí)、BEC、翻譯考試、考研;有人為了出國(guó),在國(guó)外深造、生存;有人為了日后在國(guó)內(nèi)與客戶交流。但無(wú)論如何,僅僅靠看書做題,是無(wú)法練就高水平英語(yǔ)的。英語(yǔ)學(xué)習(xí)在于厚積薄發(fā),大三以前,應(yīng)該注重積累,廣泛涉獵。歐美文化、報(bào)刊雜志、流行歌曲、名人演講、電臺(tái)聽力等等都可以嘗試。有了這些,四六級(jí)的英語(yǔ)就不難準(zhǔn)備了,各位同學(xué)就不必狂做四六級(jí)模擬題折磨自己了。我個(gè)人認(rèn)為語(yǔ)言的學(xué)習(xí),要從所有方面全面著手,僅僅練閱讀,或僅僅練聽力都是費(fèi)時(shí)傷神,事倍功半的。人的精力有這樣一個(gè)特點(diǎn),長(zhǎng)時(shí)間集中于某一種事物,就會(huì)容易疲勞,導(dǎo)致效率低下。對(duì)于英語(yǔ),雜志看累了,我們可以聽一些歌曲,歌曲聽膩了,我們?cè)倏袋c(diǎn)美劇,萬(wàn)變不離其宗,人不累,效果也好,何樂而不為呢?(小編推薦:更有趣的外語(yǔ)學(xué)習(xí),更人性化的學(xué)習(xí)體驗(yàn), 更多好學(xué)、好玩的應(yīng)用和功能,更完美的外語(yǔ)交流和互動(dòng),一切盡在滬江新部落哦!趕快戳我進(jìn)啊>>>)

      關(guān)于四六級(jí)的應(yīng)試技巧

      考試之前,我還是提倡做一套模擬試題的,不為提高英語(yǔ)技能,也不為發(fā)現(xiàn)錯(cuò)誤日后改正,只為熟悉題型,提升應(yīng)試技巧??禳c(diǎn)我參加??及?>>

      關(guān)于聽力,一般考試都有一個(gè)試音時(shí)間,三到五分鐘,這段時(shí)間一定要好好利用,姓名準(zhǔn)考證號(hào)可以稍后再寫,聽力的選項(xiàng)一定要在第一時(shí)間通覽一遍,時(shí)間還有富余的話,就再通覽一遍,千萬(wàn)不要為了趕時(shí)間,去做閱讀或干其他的事。聽力考試過(guò)程中,要準(zhǔn)備好筆紙,以備不時(shí)之需,即使沒有內(nèi)容需要記的,轉(zhuǎn)轉(zhuǎn)筆也可以緩解一下壓力。

      關(guān)于詞匯題,這類題都很煩人,選項(xiàng)常常是些長(zhǎng)得很像的詞,這就沒辦法投機(jī)取巧了。只能靠平時(shí)積累。但不會(huì)選的題先可以不用猜,先把它標(biāo)出來(lái),后面做閱讀的時(shí)候,說(shuō)不定就些詞,會(huì)給你靈感,這時(shí)再翻回去,選出來(lái),準(zhǔn)確性高點(diǎn)。

      關(guān)于閱讀,這就大有文章可做了。閱讀里的文章可以給單選提供靈感,也可以給作文提供詞句。至于答題技巧,就更有很多值得一提的了。四六級(jí)的文章一般有一篇記敘文,一篇新聞稿,一篇說(shuō)明文,一篇議論文。后面的問(wèn)題,都需要對(duì)通篇有正確的理解。因此,作者的觀點(diǎn)非常重要,了解是褒是貶,還是中性,至少可以才對(duì)三分之一的問(wèn)題。如何判定作者的態(tài)度呢?找中心句,一般出現(xiàn)在文章的第一句或結(jié)尾。但要注意的是,議論文類的文章,常常在開頭放個(gè)“耙子”,然后對(duì)此反駁,當(dāng)看到“Some people often hold the idea that….”時(shí),我們一定要注意,這句話反過(guò)來(lái)理解才更接近作者的觀點(diǎn)。

      關(guān)于改錯(cuò),這類題通常針對(duì)中國(guó)人的漢語(yǔ)固有思維設(shè)題,平時(shí)多讀原汁原味的英語(yǔ)是很好的備考方法。在這里,我有另一種方法,可以供大家借鑒,就是看老師辦公室,觀摩老師如何批改學(xué)生作文的。仔細(xì)研讀,老師批改后的作文。效果很不錯(cuò)哦。

      最后,關(guān)于作文,分好提綱結(jié)構(gòu),很重要。提出問(wèn)題,即擺事實(shí)。分析問(wèn)題,即說(shuō)原因。解決問(wèn)題,即提方案。每個(gè)段落給幾句模板試的句子,作文的一半不用臨時(shí)去寫了。另一半呢,需要臨時(shí)結(jié)合題目寫出來(lái),要注意,避免使用大家都會(huì)用的詞,如“I think”,“In my opinion”或普通句式,要是寫成“I reckon”“Put in their shoes, I would….”這樣閱卷老師必然會(huì)眼前一亮的。

      第五篇:語(yǔ)言學(xué)習(xí)心得

      匯編語(yǔ)言學(xué)習(xí)心得

      在接觸這門課之前就已對(duì)匯編語(yǔ)言有所了解,一方面是在計(jì)算機(jī)組成原理中有所涉及,雖然那時(shí)只知道簡(jiǎn)單的mov、add、jmp指令,不清楚其具體用法,缺乏系統(tǒng)性的學(xué)習(xí);另一方面是在相關(guān)書籍中了解到匯編語(yǔ)言寫驅(qū)動(dòng)比較好但比較難,當(dāng)時(shí)就覺得匯編是門很牛的語(yǔ)言,很想學(xué)習(xí)。接觸這門課后,感到匯編語(yǔ)言的確不是很容易就可以弄懂的,相比較以前學(xué)過(guò)的高級(jí)語(yǔ)言如C、C++等,電腦等于在遷就人的思維方式,但學(xué)匯編,人卻必須要去遷就電腦的思維方式,要設(shè)身處地地用電腦的角度去思考問(wèn)題,這就是我們學(xué)習(xí)匯編語(yǔ)言時(shí)遇到的最大的障礙。通過(guò)這一學(xué)期的學(xué)習(xí),對(duì)匯編有了初步的掌握,可以說(shuō)是匯編的入門教程。首先主要學(xué)習(xí)了匯編語(yǔ)言的基本知識(shí),介紹了匯編的背景知識(shí)及由來(lái),讓我知道了匯編語(yǔ)言是處在機(jī)器語(yǔ)言和高級(jí)語(yǔ)言中間的一種低級(jí)語(yǔ)言。由于計(jì)算機(jī)能夠直接識(shí)別的數(shù)據(jù)是由二進(jìn)制數(shù)0和1組成的代碼。所以用機(jī)器語(yǔ)言編寫的程序是計(jì)算機(jī)惟一能夠直接識(shí)別并執(zhí)行的程序,而用其他語(yǔ)言編寫的程序必須經(jīng)過(guò)翻譯才能變換成機(jī)器語(yǔ)言程序,為了克服機(jī)器語(yǔ)言的缺點(diǎn),人們采用助記符表示機(jī)器指令的操作碼,用變量代替操作數(shù)的存放地址等,這樣就形成了匯編語(yǔ)言。然后介紹了8086計(jì)算機(jī)組織,匯編的學(xué)習(xí)不僅僅是學(xué)習(xí)其語(yǔ)法,而更多的是學(xué)習(xí)計(jì)算機(jī)基本的體系結(jié)構(gòu),學(xué)到這還沒見到很多的指令和語(yǔ)句,但這是學(xué)習(xí)匯編前必須要知道和掌握的,只有知道了匯編的實(shí)質(zhì)、如何工作及一些基本概念,才能進(jìn)行下一步的學(xué)習(xí)。直到后面終于學(xué)了80X86指令系統(tǒng)和尋址方式及后來(lái)的匯編語(yǔ)言格式,才真正進(jìn)入了匯編的指令學(xué)習(xí)階段,每一條指令的學(xué)習(xí)雖然簡(jiǎn)單但比較多,特別是有些指令的使用場(chǎng)合及錯(cuò)誤用法等易犯錯(cuò)、易混淆,例如在編寫數(shù)據(jù)傳送指令時(shí),目的操作數(shù)和源操作數(shù)的類型一定要匹配,CS不能作為目的操作數(shù),offset后只能跟簡(jiǎn)單地址符號(hào),等等。但總的歸納起來(lái)主要掌握三點(diǎn):

      1、要求指令操作數(shù)的尋址方式;

      2、指令對(duì)標(biāo)志位的影響和標(biāo)志位對(duì)指令的影響;

      3、指令的執(zhí)行時(shí)間,對(duì)可完成同樣功能的指令,要選用執(zhí)行時(shí)間短的指令。這樣學(xué)習(xí)起來(lái)方便的多,也更容易理解記住,這為以后的學(xué)習(xí)做了鋪墊。

      匯編的基本指令學(xué)完后,就開始進(jìn)行應(yīng)用了,首先學(xué)習(xí)的是循環(huán)與分支程序設(shè)計(jì),第一個(gè)例子是簡(jiǎn)單的加法計(jì)算,雖然簡(jiǎn)單,卻讓我有點(diǎn)恐懼,一個(gè)在C語(yǔ)言中只要三四句就解決的問(wèn)題,用匯編卻寫了將近20句,且還沒有輸出,也就是不知道結(jié)果是否正確。后來(lái)學(xué)習(xí)了dos系統(tǒng)功能調(diào)用,知道02號(hào)功能可以輸出加法的結(jié)果,于是使用了,但輸出的卻是一個(gè)ASCII碼值,又需要進(jìn)行二進(jìn)制到十六進(jìn)制的轉(zhuǎn)換,當(dāng)時(shí)覺得很困惑,不知道為什么要轉(zhuǎn)換,我們輸入的不就是十六進(jìn)制嗎,算出來(lái)應(yīng)該還是十六進(jìn)制???隨著繼續(xù)深入的學(xué)習(xí),才徹底明白為什么要轉(zhuǎn)換,同時(shí)也了解了計(jì)算機(jī)中對(duì)于數(shù)字運(yùn)算是如何工作的。這時(shí)發(fā)現(xiàn)匯編有很多高級(jí)語(yǔ)言所沒有的優(yōu)點(diǎn),它能讓我們更加了解計(jì)算機(jī)內(nèi)部的組織結(jié)構(gòu),對(duì)我們計(jì)算機(jī)專業(yè)的學(xué)生來(lái)說(shuō),學(xué)習(xí)匯編也是提升綜合能力的關(guān)鍵環(huán)節(jié)。一旦對(duì)

      它的原理掌握后,編寫程序就容易多了。后來(lái)學(xué)的越多,越復(fù)雜,程序也是越來(lái)越長(zhǎng),一堆的跳轉(zhuǎn)指令,覺得很麻煩,且感覺整個(gè)程序無(wú)秩序,有時(shí)對(duì)于一段程序?qū)崿F(xiàn)的功能還要研究半天。直到學(xué)習(xí)了子程序設(shè)計(jì),一個(gè)過(guò)程定義對(duì)應(yīng)一個(gè)功能,就像C語(yǔ)言中的函數(shù),很有條理性。子程序設(shè)計(jì)能讓一個(gè)大程序分成幾個(gè)模塊來(lái)做,提供了模塊化程序設(shè)計(jì)的條件,可以節(jié)省存儲(chǔ)空間及程序設(shè)計(jì)所花的時(shí)間,并且在主程序中進(jìn)行call調(diào)用,十分方便,便于以后的維護(hù)、調(diào)試和修改。

      最后學(xué)習(xí)了部分宏匯編,只是簡(jiǎn)單的幾個(gè)用法并沒有深入,但已經(jīng)為我們做好了基礎(chǔ)工作,便于我們自學(xué)后面的部分。宏(或宏指令)是源程序中一段有獨(dú)立功能的程序代碼,只需定義一次,可以多次調(diào)用。這似乎和子程序結(jié)構(gòu)很像,但子程序有自己的優(yōu)缺點(diǎn),優(yōu)點(diǎn)很明顯,缺點(diǎn)是子程序?yàn)檗D(zhuǎn)子及返回、保存及恢復(fù)寄存器以及參數(shù)的傳送等都要增加程序的開銷,這些操作所消耗的時(shí)間以及它們所占用的存儲(chǔ)空間,都是為取得子程序結(jié)構(gòu)使程序模塊化這一優(yōu)點(diǎn)而增加的額外開銷。所以,有時(shí),特別在子程序本身較短或者是需要傳送的參數(shù)較多的情況下,使用宏匯編更加有利。當(dāng)然,在程序較復(fù)雜,實(shí)現(xiàn)的功能較多的情況下,子程序也必不可少。我的理解是:子程序是調(diào)用,而宏是替換,比如一個(gè)MAX宏,所有出現(xiàn)MAX的地方,都用宏代碼代替。兩者各有利弊,在掌握深入的基礎(chǔ)上結(jié)合使用更好。

      還有一點(diǎn)十分重要,和所有的程序設(shè)計(jì)語(yǔ)言一樣,要學(xué)好匯編語(yǔ)言,實(shí)驗(yàn)是必不可少的環(huán)節(jié)。我深有體會(huì):書上的程序都能看懂,基本原理也都明白,但是在自己親手編寫程序時(shí),卻無(wú)從下手,甚至連第一句該怎么寫都不知道。后來(lái)隨著老師的講解和實(shí)驗(yàn)的進(jìn)行,知道了程序的編寫格式,包括數(shù)據(jù)段、堆棧段和代碼段,其中數(shù)據(jù)段和堆棧段可以不定義,但代碼段是必不可少的,也掌握了該怎么調(diào)試程序、運(yùn)行程序等。特別是debug命令的使用,可以配合與list文件的使用,讓我們可以調(diào)試排錯(cuò)、檢查結(jié)果是否正確等,掌握debug的使用對(duì)實(shí)驗(yàn)有很大的幫助。程序的編寫在記事本中進(jìn)行即可,再在mask中編譯,link中連接運(yùn)行,當(dāng)然也可以在專門的匯編工具中進(jìn)行。通過(guò)實(shí)驗(yàn),可以在很大程度上加深印象,在書上看程序,一切都是理所當(dāng)然,十分順利,而自己動(dòng)手,才會(huì)真正發(fā)現(xiàn)自己的不足之處。

      現(xiàn)在匯編語(yǔ)言的課程已經(jīng)告一段落了,學(xué)習(xí)過(guò)程中遇到的所有困難以及遺留的難點(diǎn)都需要我們?cè)谄溆鄷r(shí)間里逐步攻克,在打好基礎(chǔ)的前提下,學(xué)習(xí)更加專業(yè)的匯編知識(shí)來(lái)為我們所用。

      下載C語(yǔ)言學(xué)習(xí)心得word格式文檔
      下載C語(yǔ)言學(xué)習(xí)心得.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        語(yǔ)言學(xué)習(xí)心得

        《匯編語(yǔ)言程序設(shè)計(jì)》學(xué)習(xí)總結(jié)與心得 班級(jí):09計(jì)本(3)班學(xué)號(hào):0姓名:劉得分: 本學(xué)期學(xué)習(xí)了匯編語(yǔ)言,匯編語(yǔ)言是面向機(jī)器的程序設(shè)計(jì)語(yǔ)言。在匯編語(yǔ)言中,用助記符代替操作碼,用地址符號(hào)或......

        語(yǔ)言學(xué)習(xí)心得

        匯編語(yǔ)言學(xué)習(xí)體會(huì) 前段時(shí)間,剛從計(jì)算機(jī)系統(tǒng)組成與體系結(jié)構(gòu)的稍微學(xué)習(xí)了匯編語(yǔ)言,只學(xué)習(xí)了簡(jiǎn)單的一些指令。通過(guò)自學(xué)《8086/8088 匯編語(yǔ)言程序設(shè)計(jì)》,雖然有了一定的了解,但是整......

        英語(yǔ)實(shí)用語(yǔ)言學(xué)習(xí)心得

        《英語(yǔ)實(shí)用語(yǔ)言》學(xué)習(xí)心得與體會(huì) 政法1102班黃知琴學(xué)號(hào):2011102020249 英語(yǔ),是我們大學(xué)生的必修課,也是讓多數(shù)大學(xué)生都頭疼的科目。作為東方人,習(xí)慣了漢語(yǔ)的思維方式,習(xí)慣了漢語(yǔ)......

        語(yǔ)言康復(fù)學(xué)習(xí)心得

        語(yǔ)言康復(fù)培訓(xùn)心得體會(huì) 非常感謝學(xué)校領(lǐng)導(dǎo)的安排,讓我有機(jī)會(huì)參加了此次的語(yǔ)言康復(fù)訓(xùn)練培訓(xùn)班的學(xué)習(xí)。我非常珍惜這兩天的學(xué)習(xí)時(shí)間,并認(rèn)真做好了記錄。 第一天由郭金美教授講解了......

        語(yǔ)言領(lǐng)域?qū)W習(xí)心得

        讀《3-6歲兒童學(xué)習(xí)與發(fā)展指南》 ——語(yǔ)言領(lǐng)域之心得體會(huì) 大四班易雁 本學(xué)月,我認(rèn)真學(xué)習(xí)了《3-6歲兒童學(xué)習(xí)與發(fā)展指南》的語(yǔ)言領(lǐng)域,讓我對(duì)這個(gè)領(lǐng)域有了新的認(rèn)識(shí)和感悟。 在《3-......

        語(yǔ)言領(lǐng)域?qū)W習(xí)心得大全

        語(yǔ)言領(lǐng)域?qū)W習(xí)心得 在幼兒園語(yǔ)言教學(xué)中,培養(yǎng)幼兒學(xué)習(xí)語(yǔ)言的興趣對(duì)發(fā)展其語(yǔ)言能力具有極大的促進(jìn)作用。教師可從情境創(chuàng)設(shè)、欣賞并朗誦或講述兒歌及故事、看圖講述、早期閱讀等......

        編程語(yǔ)言學(xué)習(xí)心得

        程序語(yǔ)言學(xué)習(xí)的總結(jié) 通過(guò)兩年的學(xué)習(xí),我們基本上掌握了C語(yǔ)言,C++和C#三個(gè)編程課程。對(duì)于程序設(shè)計(jì)語(yǔ)言的學(xué)習(xí),分為學(xué)習(xí)語(yǔ)法規(guī)定、掌握程序設(shè)計(jì)方法、提高程序開發(fā)能力,這些都必須......

        C++語(yǔ)言學(xué)習(xí)心得

        C++語(yǔ)言程序?qū)W習(xí)心得體會(huì) 通過(guò)一學(xué)期對(duì)C++語(yǔ)言的學(xué)習(xí),我感覺C++語(yǔ)言是有一定難度卻又是非常有趣的科目。也是很有幫助的,對(duì)我們未來(lái)工作學(xué)習(xí)而言。我們可以通過(guò)C++語(yǔ)言進(jìn)行更......