已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
單片機實驗報告 班級:1304031 學號: 姓名: 實驗一:數(shù)碼管實驗一實驗目的1.了解數(shù)碼管的顯示原理;2.掌握JXARM9-2440 中數(shù)碼管顯示編程方法。二實驗原理7段LED由7個發(fā)光二極管按“日”字形排列,所有發(fā)光二極管的陽極連在一起稱共陽極接法,陰極連在一起稱為共陰極接法。LED顯示器的接口一般有靜態(tài)顯示與動態(tài)顯示接口兩種方式。本實驗中采用的是動態(tài)顯示接口,其中數(shù)碼管掃描控制地址為0x20007000,位0位5每位分別對應一個數(shù)碼管,將其中某位清0 來選擇相應的數(shù)碼管,地址0x20006000 為數(shù)碼管的數(shù)據(jù)寄存器。數(shù)碼管采用共陽方式,向該地址寫一個數(shù)據(jù)就可以控制LED 的顯示,其原理圖如圖所示。三實驗內(nèi)容及步驟1、六個數(shù)碼管同時正向顯示0-F ,然后反向顯示F-0。1) 參照模板工程leddemo(modulesleddemoleddemo.apj),添加相應的文件,并修改led 的工程設(shè)置;2) 創(chuàng)建led.c 并加入到工程led 中;3) 編寫LED 顯示函數(shù)void led_display(void),正向顯示0-F 然后反向顯示F-0,并循環(huán)執(zhí)行以上動作,在每次顯示之間延時一段時間;4) 編譯led,成功后,下載并運行,觀察結(jié)果。2、在六個數(shù)碼管上依次顯示“HELLO”,可分辨出輪流顯示。步驟同上。3、在六個數(shù)碼管上依次顯示“HELLO”,分辨不出輪流顯示。步驟同上。4、在每個數(shù)碼管上遞增顯示0-9 。步驟同上。四實驗程序1、./*/*文件名稱: LEDSEG7.C */*實驗現(xiàn)象: 數(shù)碼管依次顯示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table16 = /* 0 1 2 3 4 5 6 7*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, /* 8 9 A B C D E F*/ 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,;void Delay(int time);/*/* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) int i; *(U8*)0x20007000)=0x00; /*六個數(shù)碼管都亮*/ for( ; ;)for(i=0;i=0x0;i-) /*數(shù)碼管從F到0依次顯示出來*/ *(U8*)0x20006000)=seg7tablei; Delay(1000);/ TODO /*/* Function name : 循環(huán)延時子程序 */* Description : 循環(huán) time 次 */* Return type :void */* Argument : 循環(huán)延時計數(shù)器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time0;time-);for(i=0;i0;time-);for(i=0;i0;time-);for(i=0;idelayLoopCount;i+);實驗結(jié)果:數(shù)碼管上顯示HELLO,幾乎無延遲,同時顯示。4./*/*文件名稱: LEDSEG7.C */*實驗現(xiàn)象: 數(shù)碼管依次顯示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table10= /*0,1,2,3,4,5,6,7,8,9*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,0x80, 0x90;void Delay(int time);/*/* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) int i; for( ; ;) *(U8*)0x20007000)=0x3E; for(i=0;i0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x3D; for(i=0;i0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x3B; for(i=0;i0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x37; for(i=0;i0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x2F; for(i=0;i0;time-);for(i=0;idelayLoopCount;i+);五結(jié)果及分析1六個數(shù)碼管同時顯示,從0F,接著從F0反向顯示。分析:通過地址20007000選擇哪個數(shù)碼管亮,通過地址20006000決定數(shù)碼管輸出的內(nèi)容。再通過循環(huán)可完成輪流顯示。2可分辨出:從數(shù)碼管的右邊至左邊依次顯示hello分辨不出:數(shù)碼管上顯示hello。分析:由于改變了Delay的數(shù)值,導致頻率變化,所以可以產(chǎn)生兩種效果。3每個數(shù)碼管遞增顯示09。分析:原理同一,靠循環(huán)實現(xiàn)。六實驗總結(jié)1.由于數(shù)碼管為共陽極,小數(shù)點為最高位,A為最低位,所以顯示內(nèi)容一定要計算正確。2.循環(huán)條件要選擇正確。 實驗二:鍵盤輸入實驗一實驗目的1、學習鍵盤驅(qū)動原理;2、掌握通過CPU的I/O擴展鍵盤的方法。二實驗原理鍵盤實現(xiàn)方案采用專門的芯片實現(xiàn)鍵盤掃描采用軟件實現(xiàn)鍵盤掃描軟鍵盤實現(xiàn)方案當開關(guān)打開時,通過處理器的I/O 口的一個上拉電阻提供邏輯1;當開關(guān)閉合時,處理器的I/O 口的輸入將被拉低到邏輯0。矩陣鍵盤電路一個瞬時接觸開關(guān)(按鈕)放置在每一行與每一列的交叉點。每一行由一個輸出端口的一位驅(qū)動,每一列由一個電阻器上拉且供給輸入端口一位。鍵盤掃描過程就是讓微處理器按有規(guī)律的時間間隔查看鍵盤矩陣,以確定是否有鍵被按下一旦處理器判定有一個鍵按下,鍵盤掃描軟件將過濾掉抖動并且判定哪個鍵被按下每個鍵被分配一個稱為掃描碼的唯一標識符。應用程序利用該掃描碼,根據(jù)按下的鍵來判定應該采取什么行動,換句話說,掃描碼將告訴應用程序按下哪個鍵鍵盤掃描算法初始化:所有的行(輸出端口)被強行設(shè)置為低電平在沒有任何鍵按下時,所有的列(輸入端口)將讀到高電平。任何鍵的閉合將造成其中的一列變?yōu)榈碗娖?。一旦檢測到有鍵被按下,就需要找出是哪一個鍵。過程很簡單,微處理器只需在其中一行上輸出一個低電平。如果它在輸入端口上發(fā)現(xiàn)一個0值,微處理器就知道在所選擇行上產(chǎn)生了鍵的閉合三、實驗內(nèi)容及步驟(一)學習與分析例程中的各個程序以及主要函數(shù),以進一步理解鍵盤的工作原理。(二)獲取按鍵值,在串口顯示。(三)使按鍵按照如圖的順序顯示出來。(四)將鍵盤按鍵值在數(shù)碼管上顯示?;蜃孕虚_發(fā)。四實驗程序:1./* 包含文件 */#include def.h#include 2410lib.h#include option.h#include 2410addr.h#include interrupt.h/*/ Function name: Main/ Description : JXARM9-2410 鍵盤實驗主程序/ 實現(xiàn)功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系統(tǒng)時鐘 */ ChangeClockDivider(2,1); U32 mpll_val = 0 ; mpll_val = (9212)|(112)&0xff, (mpll_val4)&0x3f, mpll_val&3); /* 初始化端口 */ Port_Init(); /* 初始化串口 */ Uart_Init(0,115200); Uart_Select(0); /* 打印提示信息 */PRINTF(n-鍵盤測試程序-n);PRINTF(n請將UART0與PC串口進行連接,然后啟動超級終端程序(115200, 8, N, 1)n); /* 開始回環(huán)測試 */while(1)unsigned char ch;ch=Key_GetKeyPoll();/ TODO / 獲取鍵值if(ch != 0) PRINTF(r%c鍵按下, ch);實驗結(jié)果:在小鍵盤上按鍵,串口上顯示按鍵對應字符,如按0,串口上顯示0。2.在庫函數(shù)中改變?nèi)缦碌膋ey按鍵值,使對應于鍵盤上的位置#include #include 2410addr.h#include 2410lib.h#include timer.h#include interrupt.h#define RECV_CMD_MAX_BUF 2048char recv_bufRECV_CMD_MAX_BUF;int recv_read = 0;int recv_write = 0;char key_recv_bufRECV_CMD_MAX_BUF;int key_recv_read = 0;int key_recv_write = 0;/ 鍵盤掃描int timer1_count = 0;enum KEYBOARD_SCAN_STATUSKEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_SECOND,KEYBOARD_SCAN_THIRD,KEYBOARD_SCAN_FOURTH;int row = 0;extern unsigned char output_0x10000000;unsigned char ascii_key, input_key4, input_key14, key_mask = 0x0F;unsigned char*keyboard_port_scan = (unsigned char*)0x2000C000;unsigned char*keyboard_port_value = (unsigned char*)0x2000C000;int keyboard_scan_status4 = KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST ;char key_get_char(int row, int col)char key = 0;switch( row )case 0:if(col & 0x01) = 0) key = D; else if(col & 0x02) = 0) key = E; else if(col & 0x04) = 0) key = F; else if(col & 0x08) = 0) key = 0; break;case 1:if(col & 0x01) = 0) key = C; else if(col & 0x02) = 0) key = 7; else if(col & 0x04) = 0) key = 4;else if(col & 0x08) = 0) key = 1;break;case 2:if(col & 0x01) = 0) key = B; else if(col & 0x02) = 0) key = 8; else if(col & 0x04) = 0) key = 5; else if(col & 0x08) = 0) key = 2; break;case 3:if(col & 0x01) = 0) key = A; else if(col & 0x02) = 0) key = 9; else if(col & 0x04) = 0) key = 6; else if(col & 0x08) = 0) key = 3; break;default:break;return key;/*/ Function name: recv_key/ Description : 將獲取的鍵值加入按鍵緩沖區(qū)/ Return type: void/ Argument : int key*/void recv_key(int key)key_recv_bufkey_recv_write = key;key_recv_write +;if(key_recv_write = RECV_CMD_MAX_BUF)key_recv_write = 0;if(key_recv_write = key_recv_read)/ 緩沖區(qū)以滿key_recv_read +;if(key_recv_read = RECV_CMD_MAX_BUF)key_recv_read = 0;/*/ Function name: Kbd_Scan/ Description : 定時器1中斷服務程序,用于掃描鍵盤,每隔10ms一次中斷/ Return type: void/ Argument : void*/void Kbd_Scan(void)int loopcnt = row, bexit = 0;int temp;/ 鍵盤掃描for( loopcnt = row; loopcnt = 4)temp = loopcnt - 4;elsetemp = loopcnt;switch(keyboard_scan_statustemp)case KEYBOARD_SCAN_FIRST:*keyboard_port_scan = output_0x10000000 & (0x00000001temp); /*將row列置低電平*/keyboard_scan_statustemp = KEYBOARD_SCAN_SECOND;bexit = 1;break;case KEYBOARD_SCAN_SECOND:input_keytemp = (*keyboard_port_value) & key_mask;/*并獲取第一次掃描值*/if(input_keytemp = key_mask)keyboard_scan_statustemp = KEYBOARD_SCAN_FIRST;/* 沒有按鍵,回到開始狀態(tài)*/elsekeyboard_scan_statustemp = KEYBOARD_SCAN_THIRD;/* 有按鍵*/bexit = 1;break;case KEYBOARD_SCAN_THIRD:if (*keyboard_port_value) & key_mask) != input_keytemp) keyboard_scan_statustemp = KEYBOARD_SCAN_FIRST;elseascii_key = key_get_char(temp, input_keytemp);keyboard_scan_statustemp = KEYBOARD_SCAN_FOURTH;*keyboard_port_scan = output_0x10000000 & (0x00000001temp); /*將row列置低電平*/bexit = 1;break;case KEYBOARD_SCAN_FOURTH:input_key1temp = (*keyboard_port_value) & key_mask;/*并獲取第一次掃描值*/if(input_key1temp = key_mask)/ get a keyrecv_key(ascii_key);keyboard_scan_statustemp = KEYBOARD_SCAN_FIRST;else*keyboard_port_scan = output_0x10000000 & (0x00000001= RECV_CMD_MAX_BUF)key_recv_read = 0;return ch;/*/ Function name: Key_GetKeyPoll(查詢方式)/ Description : 如果有鍵按下返回鍵,否則返回0/ Return type: char/ Argument : */char Key_GetKeyPoll()int row;unsigned char ascii_key, input_key, input_key1, key_mask = 0x0F;for( row = 0; row 4; row+)*keyboard_port_scan = output_0x10000000 & (0x00000001row); /*將row列置低電平*/Delay(3);/*延時*/input_key = (*keyboard_port_value) & key_mask;/*并獲取第一次掃描值*/if(input_key = key_mask)continue;/* 沒有按鍵*/* 延時,再次獲取掃描值,如果兩次的值不等,則認為是一個干擾*/Delay(3);if (*keyboard_port_value) & key_mask) != input_key) continue;/ 等待按鍵松開while(1)*keyboard_port_scan = output_0x10000000 & (0x00000001row); /*將row列置低電平*/Delay(3);input_key1 = (*keyboard_port_value) & key_mask;/*并獲取第一次掃描值*/if(input_key1 = key_mask)break;/* 沒有按鍵*/ascii_key = key_get_char(row, input_key);/* 查表*/return ascii_key;/* 顯示結(jié)果*/return 0;實驗結(jié)果:按下鍵盤的按鍵串口會按題圖中所示對應顯示3./* 包含文件 */#include def.h#include 2410lib.h#include option.h#include 2410addr.h#include interrupt.h#include #include #define IIRNUMBER 2#define U8 unsigned charunsigned char table16 = /* 0 1 2 3 4 5 6 7*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, /* 8 9 A B C D E F*/ 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,;/*/ Function name: Main/ Description : JXARM9-2440 鍵盤實驗主程序/ 實現(xiàn)功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系統(tǒng)時鐘 */ ChangeClockDivider(2,1); U32 mpll_val = 0 ; mpll_val = (9212)|(112)&0xff, (mpll_val4)&0x3f, mpll_val&3); /* 初始化端口 */ Port_Init(); /* 初始化串口 */ Uart_Init(0,115200); Uart_Select(0); /* 打印提示信息 */PRINTF(n-鍵盤測試程序-n);PRINTF(n請將UART0與PC串口進行連接,然后啟動超級終端程序(115200, 8, N, 1)n);/*(unsigned long int *)0x48000000) = 0x22111120;*(unsigned long int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度玻璃采光井安裝工程合同范本2篇
- 2025版金融服務項目股份轉(zhuǎn)讓合同范本解析3篇
- 2025版濟寧銑刨機租賃及租賃設(shè)備保險理賠合同3篇
- 2025年度新型環(huán)保材料研發(fā)與應用項目合同3篇
- 《小屁孩日記》讀后感(合集15篇)
- 2024至2030年5-巰基甲基苯甲酸項目投資價值分析報告
- 二零二五年度EPS構(gòu)件綠色建材認證供應與安裝服務合同3篇
- 北京郵電大學世紀學院《中醫(yī)骨傷科學基礎(chǔ)》2023-2024學年第一學期期末試卷
- 2024年巢湖市中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2025年度城市廣場景觀照明安裝與維護合同2篇
- 家鄉(xiāng)土特產(chǎn)電商營銷策劃方案(2篇)
- 汽車標準-商用車輛前軸總成
- 個人貸款月供款計算表模板
- 先玉335玉米品種介紹課件講解
- 康復醫(yī)院籌建計劃書
- 吊籃安裝拆卸專項施工方案
- 提升高中生領(lǐng)導能力和組織能力的建議
- 2024屆新高考物理沖刺復習:“正則動量”解決帶電粒子在磁場中的運動問題
- 國開電大行政管理??啤侗O(jiān)督學》期末考試總題庫2024版
- 軟件工程網(wǎng)上書店管理系統(tǒng)詳細課程設(shè)計報告(很經(jīng)典)
- 人教鄂教版版五年級上冊科學期末測試題
評論
0/150
提交評論