電子科技大學微機實驗報告(含思考題)河畔下的哈】實驗6_第1頁
電子科技大學微機實驗報告(含思考題)河畔下的哈】實驗6_第2頁
電子科技大學微機實驗報告(含思考題)河畔下的哈】實驗6_第3頁
電子科技大學微機實驗報告(含思考題)河畔下的哈】實驗6_第4頁
電子科技大學微機實驗報告(含思考題)河畔下的哈】實驗6_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 實驗六 基于ARM的鍵盤及數(shù)碼管驅動實驗 1.掌握鍵盤及數(shù)碼管驅動原理。 2.掌握ZLG7290芯片的使用方法。 3.掌握I2C總線的協(xié)議標準。 4.掌握Linux下鍵盤驅動的實現(xiàn)方法。 編寫測試程序控制鍵盤和數(shù)碼管。 1.了解ARM9處理器結構 2.了解i2c協(xié)議 硬件:ARM嵌入式開發(fā)平臺,PC 機Pentium100 以上。 軟件:PC機Linux操作系統(tǒng)MINICOM AMRLINUX開發(fā)環(huán)境 1、ZLG7290寄存器介紹 ZLG7290內部有16個8bits寄存器,訪問這些寄存器需要通過I2C 總線接口來實現(xiàn).訪問內部寄存器要通過“I2C總線地址+子地址”的方式來實現(xiàn)。ZLG729

2、0B 的I2C 總線器件地址是70H(寫操作)和71H(讀操作)。 ? 鍵值寄存器Key(地址:01H) 如果某個普通鍵(K1K56)被按下,則微控制器可以從鍵值寄存器Key中讀取相應的鍵值156。如果微控制器發(fā)現(xiàn)ZLG7290 的INT 引腳產(chǎn)生了中斷請求,而從Key 中讀到的鍵值是0,則表示按下的可能是功能鍵。鍵值寄存器Key 的值在被讀走后自動變成0。 ? 顯示緩沖區(qū)DpRam0DpRam7(地址:10H17H) DpRam0DpRam7 這8 個寄存器的取值直接對應8個數(shù)碼管的顯示內容。每個寄存器的8 個位分別對應數(shù)碼管的a,b,c,d,e,f,dp 段,MSB 對應a,LSB 對應d

3、p。例如大寫字母H 的字型數(shù)據(jù)為6EH(不帶小數(shù)點)或6FH(帶小數(shù)點)。 ? 命令緩沖區(qū)CmdBuf0 和CmdBuf1(地址:07H 和08H) 通過向命令緩沖區(qū)寫入相關的控制命令可以實現(xiàn)段尋址、下載顯示數(shù)據(jù)、控制閃爍等功能。 2、ZLG7290控制命令介紹 寄存器CmdBuf0(地址:07H)和CmdBuf1(地址:08H)共同組成命令緩沖區(qū)。通過向命令緩沖區(qū)寫入相關的控制命令可以實現(xiàn)段尋址、下載顯示數(shù)據(jù)、控制閃爍等功能。 ? 下載數(shù)據(jù)并譯碼(Download) 在指令格式中,高4 位的0110 是命令字段;A3A2A1A0 是數(shù)碼管顯示數(shù)據(jù)的位地址(其中A3 留作以后擴展之用,實際使用

4、時取0 即可),位地址編號依次為0,1,2,3,4,5,6,7,代表8個數(shù)碼管,dp 控制小數(shù)點是否點亮,0點亮,1熄滅;flash 表示是否要閃爍,0正常顯示,1閃爍;d4d3d2d1d0 是要顯示的數(shù)據(jù),包括10 種數(shù)字和21 種字母。 ? 閃爍控制(Flash) 在命令格式中,高4 位的0111 是命令字段;xxxx 表示無關位,通常取值0000;第2 字節(jié)的Fn(n07)控制數(shù)碼管相應位的閃爍屬性,0正常顯示,1閃爍。復位后,所有位都不閃爍。 3、 Linux下i2c驅動接口函數(shù)介紹 Linux為我們提供了一系列的接口函數(shù),通過調用這些函數(shù)可以很方便的訪問到我們的I2C設備,達到對它的

5、操作和控制。在本實驗中,就是通過調用這些函數(shù),完成對zlg7290內部寄存器的配置,從而驅動鍵盤和數(shù)碼管按照我們需要的方式工作 ? 打開設備: 在linux下編程實現(xiàn)對具體設備的操作,首先要做的就是打開要操作的設備文件,zlg7290設備的設備文件是“/dev/zlg7290/0”。 具體實現(xiàn)函數(shù)是: fd=open(“/dev/zlg7290/0”,O_RDWR) ? 向設備寫數(shù)據(jù): 具體實現(xiàn)過程是先寫入要配置的寄存器的地址,然后寫入要配置的值,具體實現(xiàn)函數(shù)是: unsigned char temp2; /定義一個數(shù)組用于存放要發(fā)送的數(shù)據(jù),包括寄存器地址和要寫入該寄存器內的值 temp0=a

6、ddress; /將要配置的寄存器的地址address寫入temp0中。 temp1=data; /將要寫入該寄存器中 的值data寫入/temp1中。 write(fd,temp,2); /用write函數(shù)向設備寫入數(shù)據(jù)temp,首先寫入地址address,然后寫入值data。 配置一般的寄存器都是這個步驟,但是唯一例外的是配置命令寄存器cmdbuf0和cmdbuf1,因為寫入命令寄存器中的命令碼均為16bit,因此需要通過兩步完成對命令碼的發(fā)送,具體實現(xiàn)代碼如下: unsigned char temp3; temp0=address; temp1=cmd1; /要寫入的命令碼的高八位 te

7、mp2=cmd2; /要寫入的命令碼的低八位 write(fd,temp,3); ? 關閉設備: close(fd); 1. 在數(shù)碼管上顯示數(shù)據(jù)有兩種方法,一種方法是直接向8個數(shù)據(jù)緩沖區(qū)DpRam0DpRam7寫入數(shù)據(jù)分別控制每個數(shù)碼管的8個獨立led的亮滅,使其顯示不同的數(shù)據(jù)。 2. 在數(shù)碼管上顯示數(shù)據(jù)的另一種方法是直接向命令寄存器cmdbuf0或cmdbuf1寫入“下載數(shù)據(jù)并譯碼”命令,直接控制數(shù)碼管的顯示內容,具體譯碼規(guī)則如表一所示。 3. 當某個按鍵被按下時,可以通過讀取“鍵值寄存器Key(地址:01H)”的值來得到鍵值,將所按鍵的鍵值顯示在數(shù)碼管上。 4. zlg7290提供數(shù)碼管的

8、閃爍功能,通過向命令寄存器發(fā)送閃爍控制命令可以控制某個數(shù)碼管閃爍。通過按鍵控制數(shù)碼管的閃爍,具體功能是當按下鍵盤1-4時,控制數(shù)碼管1-4閃爍。 5 打開一個終端1,將四個源文件交叉編譯成arm下的可執(zhí)行文件example1-example4(具體參見實驗五一些步驟) 6 重新打開一個終端2,輸入命令minicom進入ARM開發(fā)板的命令行界面,檢查硬件是否連接好后,上電開發(fā)板,進入ARM-linux操作系統(tǒng)的命令行。 7 在終端2的ARM-linux操作系統(tǒng)的命令行下依次運行example1-example4可執(zhí)行程序,觀察結果。 步驟1程序: #include <stdio.h>

9、 #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> /#include "i2c.h" #define ZLG7290_ADDR_DpRam0 0x10 int fd; void zlg7290_disp(unsigned char *buf, unsigned char num); int main() int ret,i; unsigned char buf8; fd = open("/dev/zlg7290/0", O_RDWR); if(

10、fd = -1) printf("Can't open I2C device!n"); exit(-1); buf7 = 0xe0; buf6 = 0xbe; buf5 = 0xb6; buf4 = 0x66; buf3 = 0xf2; buf2 = 0xda; buf1 = 0x60; buf0 = 0xfc; zlg7290_disp(buf, 8); close(fd); return 0; /* * Function name: zlg7290_disp * Descriptions: control zlg7290 to driver led * * In

11、put: unsigned char *buf: display buffer unsigned char num: display number * Output: NULL */ void zlg7290_disp(unsigned char *buf, unsigned char num) unsigned char i; unsigned char temp2; for(i=0;i<num;i+) temp0 = ZLG7290_ADDR_DpRam0+i; temp1 = *buf; write(fd, temp, 2); buf+; usleep(5000); /* * En

12、d Of File */ 步驟2程序: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> /#include "i2c.h" #define ZLG7290_ADDR_cmdbuf0 0x07 int fd; void zlg7290_disp(unsigned char *buf, unsigned char num); int main() int ret,i; unsigned char buf8; fd =

13、open("/dev/zlg7290/0", O_RDWR); if(fd = -1) printf("Can't open I2C device!n"); exit(-1); buf7 = 0x07; buf6 = 0x06; buf5 = 0x05; buf4 = 0x04; buf3 = 0x03; buf2 = 0x02; buf1 = 0x01; buf0 = 0x00; zlg7290_disp(buf, 8); close(fd); return 0; /* * Function name: zlg7290_disp * Descr

14、iptions: control zlg7290 to driver led * * Input: unsigned char *buf: display buffer unsigned char num: display number * Output: NULL */ void zlg7290_disp(unsigned char *buf, unsigned char num) unsigned char i; unsigned char temp2; for(i=0;i<num;i+) temp0 = ZLG7290_ADDR_cmdbuf0; temp1 = 0x60+i; t

15、emp2 = *buf; buf+; write(fd, temp, 3); usleep(5000); /* * End Of File */ 步驟3程序: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> /#include "i2c.h" int fd; int zlg7290_getkey(char *key); void zlg7290_disp(unsigned char *buf, unsigned c

16、har num); int main() int ret,i; unsigned char buf9; char key; fd = open("/dev/zlg7290/0", O_RDWR); if(fd = -1) printf("Can't open I2C device!n"); exit(-1); zlg7290_disp(buf, 8); for (;) if (zlg7290_getkey(&key) != 0) printf("Read key value failn"); exit(-1); buf

17、0=key%10; buf1=key/10; zlg7290_disp(buf, 2); usleep(1000000); close(fd); return 0; /* * Function name: zlg7290_getkey * Descriptions: get the key value from zlg7290 * * Input: unsigned short *key: the gotten key value * Output: 0 : OK -1: fail */ int zlg7290_getkey(char *key) unsigned char temp2; te

18、mp0 = 1; temp1 = 0; if (write(fd, temp, 1) != 1) return -1; if (read(fd, temp, 2) != 2) return -1; *key = temp0 + (temp1 * 256); return 0; /* * Function name: zlg7290_disp * Descriptions: control zlg7290 to driver led * 鎺埗zlg7290椹卞姩led * Input: unsigned char *buf: display buffer unsigned char num: display number * Output: NULL */ void zlg7290_disp(unsigned char *buf, unsigned char num)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論