?? learn-lumit-step-11-readme.txt
字號:
Learn lumit Step 11 : 7段數碼管實驗
++++++++++++++++++++++++++++++++++++++++++++++++++++++
這一小節我們著重講解7段數碼管的驅動原理和方法。在 seg7_driver.c 文件中
我們仍然將實現和 led 驅動中類似的五個接口函數:
int seg7_open( void )
函數入口參數:無
返回值: 正常返回值 0
執行流程:
無
int seg7_read( char * buf, int count )
函數入口參數:buf : 讀緩沖的首地址
count : 需要讀的字節數
返回值: 直接返回 count
執行流程:
7段數碼管主要用于輸出,其讀操作暫時不實現,意義不大。
int seg7_write( char * buf, int count )
函數入口參數:buf : 寫緩沖的首地址
count : 需要寫的字節數
返回值: 正常返回值 count 表示已經寫入的字節數, 出錯則返回 -1
執行流程:
1) 根據要寫入的字節數 count,每個字節代表seg7中的一個 segment led 的狀態,依次設置。
int seg7_ioctl( unsigned int cmd, unsigned long arg )
函數入口參數:cmd : ioctl 的入口命令名
arg : 命令所帶參數
返回值: 正常返回值 0
執行流程:
暫時實現為空操作
int seg7_release( void )
函數入口參數:無
返回值: 正常返回值 0
執行流程:
暫時實現為空操作
這里和 led 驅動有所不同的是,led 驅動主要是依靠驅動 gpio 來實現 led 的點亮和熄滅。
而 7段數碼管是將其 8 個段和數據總線的低 8 位連接在一起,依靠 cpu 對特定地址的讀寫,
片選上7段數碼管這個設備后,實現對其的點亮和熄滅。
由于 lumit4510 中是采用了 nECS3 和 nWE 的“與操作”作為 7段數碼管的 SEG7_CS
片選信號,因此,要實現對 SEG7_CS 的片選,需要對 0x03fdc000 - 0x03fe0000 這段地址空間
進行“寫”操作。(注意,這里的地址必須是 4 字節對齊的,否則無效!)
有關每個 segment 段和其對應的位置關系,如下圖所示:
/*
________
| a |
| |
|b |g
|________|
| c |
|d |f
| |
|________| o dp
e
*/
由此,我們可以根據需要拼湊出每一個 hex 數字 (從 0x0 - 0xF)的表示組合。
后面的 4 行,是我們根據需要實現的幾個特殊顯示需求,例如 3 個橫杠,2 個豎杠等。
大家還可以定義出自己需要的其他符號。
#define DISP_0 (SEG_F|SEG_G|SEG_A|SEG_B|SEG_D|SEG_E)
#define DISP_1 (SEG_F|SEG_G)
#define DISP_2 (SEG_A|SEG_C|SEG_D|SEG_E|SEG_G)
#define DISP_3 (SEG_A|SEG_C|SEG_E|SEG_F|SEG_G)
#define DISP_4 (SEG_B|SEG_C|SEG_F|SEG_G)
#define DISP_5 (SEG_A|SEG_B|SEG_C|SEG_E|SEG_F)
#define DISP_6 (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F)
#define DISP_7 (SEG_A|SEG_F|SEG_G)
#define DISP_8 (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G)
#define DISP_9 (SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G)
#define DISP_A (SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G)
#define DISP_B (SEG_B|SEG_C|SEG_D|SEG_E|SEG_F)
#define DISP_C (SEG_A|SEG_B|SEG_D|SEG_E)
#define DISP_D (SEG_C|SEG_D|SEG_E|SEG_F|SEG_G)
#define DISP_E (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E)
#define DISP_F (SEG_A|SEG_B|SEG_C|SEG_D)
#define DISP_ALL_OFF (0)
#define DISP_ALL_ON (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G|SEG_DP)
#define DISP_ROW_3 (SEG_A|SEG_C|SEG_E)
#define DISP_COL_2 (SEG_B|SEG_D|SEG_G|SEG_F)
另外,一個需要特別提示的地方是 Makefile 文件有了一些改動,主要是依賴關系里面需要
補充上 .h 文件的修改,對于其他包含它的文件所產生的影響,有時需要重新編譯一些 .c 文件。
這里所作的修改主要是添加了以下幾條新的規則。
$(OUTPUT_DIR)\main.o: seg7_api.h
$(OUTPUT_DIR)\seg7_api.o: seg7_api.h
seg7_api.h: seg7_driver.h
$(OUTPUT_DIR)\seg7_driver.o: seg7_driver.h
因為 Makefile 的規則解析是可以遞歸的,所以我們不用特別告訴 make 說 main.o 也依賴于
seg7_driver.h ,這個關系 make 可以通過 seg7_api.h 依賴于 seg7_driver.h 同樣能夠得到。
這樣在我們修改頭文件定義的時候,依賴于它的那些源文件也會重新被編譯。
┌-------------------------------------------------------------------------┐
│ │
│ Welcome to visit http://www.lumit.org & http://bbs.lumit.org │
│ │
│ [lumit] - let us make it together │
│ │
│ │
│ lumit-admin <admin@lumit.org> │
│ │
└-------------------------------------------------------------------------┘
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -