




已閱讀5頁,還剩62頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單片機實驗報告 班級:1304031 學號: 姓名: 實驗一:數碼管實驗一實驗目的1.了解數碼管的顯示原理;2.掌握JXARM9-2440 中數碼管顯示編程方法。二實驗原理7段LED由7個發光二極管按“日”字形排列,所有發光二極管的陽極連在一起稱共陽極接法,陰極連在一起稱為共陰極接法。LED顯示器的接口一般有靜態顯示與動態顯示接口兩種方式。本實驗中采用的是動態顯示接口,其中數碼管掃描控制地址為0x20007000,位0位5每位分別對應一個數碼管,將其中某位清0 來選擇相應的數碼管,地址0x20006000 為數碼管的數據寄存器。數碼管采用共陽方式,向該地址寫一個數據就可以控制LED 的顯示,其原理圖如圖所示。三實驗內容及步驟1、六個數碼管同時正向顯示0-F ,然后反向顯示F-0。1) 參照模板工程leddemo(modulesleddemoleddemo.apj),添加相應的文件,并修改led 的工程設置;2) 創建led.c 并加入到工程led 中;3) 編寫LED 顯示函數void led_display(void),正向顯示0-F 然后反向顯示F-0,并循環執行以上動作,在每次顯示之間延時一段時間;4) 編譯led,成功后,下載并運行,觀察結果。2、在六個數碼管上依次顯示“HELLO”,可分辨出輪流顯示。步驟同上。3、在六個數碼管上依次顯示“HELLO”,分辨不出輪流顯示。步驟同上。4、在每個數碼管上遞增顯示0-9 。步驟同上。四實驗程序1、./*/*文件名稱: LEDSEG7.C */*實驗現象: 數碼管依次顯示出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);/*/* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */* 功能描述: 依次在7段數碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數說明: 無 */*/void Test_Seg7(void) int i; *(U8*)0x20007000)=0x00; /*六個數碼管都亮*/ for( ; ;)for(i=0;i=0x0;i-) /*數碼管從F到0依次顯示出來*/ *(U8*)0x20006000)=seg7tablei; Delay(1000);/ TODO /*/* Function name : 循環延時子程序 */* Description : 循環 time 次 */* Return type :void */* Argument : 循環延時計數器 */*/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+);實驗結果:數碼管上顯示HELLO,幾乎無延遲,同時顯示。4./*/*文件名稱: LEDSEG7.C */*實驗現象: 數碼管依次顯示出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);/*/* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */* 功能描述: 依次在7段數碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數說明: 無 */*/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+);五結果及分析1六個數碼管同時顯示,從0F,接著從F0反向顯示。分析:通過地址20007000選擇哪個數碼管亮,通過地址20006000決定數碼管輸出的內容。再通過循環可完成輪流顯示。2可分辨出:從數碼管的右邊至左邊依次顯示hello分辨不出:數碼管上顯示hello。分析:由于改變了Delay的數值,導致頻率變化,所以可以產生兩種效果。3每個數碼管遞增顯示09。分析:原理同一,靠循環實現。六實驗總結1.由于數碼管為共陽極,小數點為最高位,A為最低位,所以顯示內容一定要計算正確。2.循環條件要選擇正確。 實驗二:鍵盤輸入實驗一實驗目的1、學習鍵盤驅動原理;2、掌握通過CPU的I/O擴展鍵盤的方法。二實驗原理鍵盤實現方案采用專門的芯片實現鍵盤掃描采用軟件實現鍵盤掃描軟鍵盤實現方案當開關打開時,通過處理器的I/O 口的一個上拉電阻提供邏輯1;當開關閉合時,處理器的I/O 口的輸入將被拉低到邏輯0。矩陣鍵盤電路一個瞬時接觸開關(按鈕)放置在每一行與每一列的交叉點。每一行由一個輸出端口的一位驅動,每一列由一個電阻器上拉且供給輸入端口一位。鍵盤掃描過程就是讓微處理器按有規律的時間間隔查看鍵盤矩陣,以確定是否有鍵被按下一旦處理器判定有一個鍵按下,鍵盤掃描軟件將過濾掉抖動并且判定哪個鍵被按下每個鍵被分配一個稱為掃描碼的唯一標識符。應用程序利用該掃描碼,根據按下的鍵來判定應該采取什么行動,換句話說,掃描碼將告訴應用程序按下哪個鍵鍵盤掃描算法初始化:所有的行(輸出端口)被強行設置為低電平在沒有任何鍵按下時,所有的列(輸入端口)將讀到高電平。任何鍵的閉合將造成其中的一列變為低電平。一旦檢測到有鍵被按下,就需要找出是哪一個鍵。過程很簡單,微處理器只需在其中一行上輸出一個低電平。如果它在輸入端口上發現一個0值,微處理器就知道在所選擇行上產生了鍵的閉合三、實驗內容及步驟(一)學習與分析例程中的各個程序以及主要函數,以進一步理解鍵盤的工作原理。(二)獲取按鍵值,在串口顯示。(三)使按鍵按照如圖的順序顯示出來。(四)將鍵盤按鍵值在數碼管上顯示。或自行開發。四實驗程序:1./* 包含文件 */#include def.h#include 2410lib.h#include option.h#include 2410addr.h#include interrupt.h/*/ Function name: Main/ Description : JXARM9-2410 鍵盤實驗主程序/ 實現功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系統時鐘 */ 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); /* 開始回環測試 */while(1)unsigned char ch;ch=Key_GetKeyPoll();/ TODO / 獲取鍵值if(ch != 0) PRINTF(r%c鍵按下, ch);實驗結果:在小鍵盤上按鍵,串口上顯示按鍵對應字符,如按0,串口上顯示0。2.在庫函數中改變如下的key按鍵值,使對應于鍵盤上的位置#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 : 將獲取的鍵值加入按鍵緩沖區/ 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)/ 緩沖區以滿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;/* 沒有按鍵,回到開始狀態*/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;/* 顯示結果*/return 0;實驗結果:按下鍵盤的按鍵串口會按題圖中所示對應顯示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 鍵盤實驗主程序/ 實現功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系統時鐘 */ 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024四川雅安市市屬國有企業高級管理人員8人筆試參考題庫附帶答案詳解
- 初中物理人教版(2024)八年級上冊(2024)第3節 汽化和液化教案配套
- 發票勾選平臺培訓
- 2024華電江西發電有限公司所屬企業面向系統內外公開招聘4人筆試參考題庫附帶答案詳解
- 2024北京飛機維修工程有限公司市場化人才招聘筆試參考題庫附帶答案詳解
- 人教部編版 (五四制)一年級下冊13 荷葉圓圓教案設計
- 冀教版一年級下冊五 100以內的加法和減法(一)教案設計
- 人音版八年級上冊老鼠娶親教學設計
- 服裝入門培訓課件
- 三年級英語上冊 Unit 1 School and Numbers Lesson 2 Boy Girl and Teacher教學設計 冀教版(三起)
- 2023年-2024年電子物證專業考試復習題庫(含答案)
- 新能源汽車發展現狀參考文獻
- 春季行車安全注意事項春季行車安全教育
- 焊接工序首件檢驗記錄表
- 注塑工藝監控記錄表
- WORD文檔標題格式模板(五級標題)
- “四會”教學基本概述
- 延續證書承諾書格式
- 高金英講座完整版
- 技術創新的內涵與核心
- 高考歷史考點命題雙向細目表(很實用)
評論
0/150
提交評論