本實驗,我們用到FSMC驅動 LCD,通過前面的介紹,我們知道TFTLCD 的RS接在FSMC的 A6上面,CS 接在 FSMC_NE4 上,并且是16位數據總線。即我們使用的是FSMC 存儲器1的第 4區,我們定義如下LCD 操作結構體(在lcd.h 里面定義):
//LCD 操作結構體
typedef struct
{
vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位 HADDR[27,26]=11 A6作為數據命令區分線
//注意16位數據總線時,STM32內部地址會右移一位對齊!
#define LCD_BASE ((u32)(0x6C000000 | 0x0000007E))
#define LCD ((LCD_TypeDef *) LCD_BASE)
其中 LCD_BASE,必須根據我們外部電路的連接來確定,我們使用 Bank1.sector4 就是從地址0X6C000000開始,而 0X0000007E,則是A6的偏移量,這里很多朋友不理解這個偏移量的概念,簡單說明下:以 A6 為例,7E 轉換成二進制就是:1111110,而 16 位數據時,地址右移一位對齊,那么實際對應到地址引腳的時候,就是:A6:A0=0111111,此時 A6 是0,但是如果16位地址再加1(注意:對應到8 位地址是加2,即 7E+0X02), 那 么 :A6:A0=1000000,此時 A6 就是1了,即實現了對RS的 0和1的控制。
我們將這個地址強制轉換為LCD_TypeDef結構體地址,那么可以得到LCD->LCD_REG 的地址就是0X6C00,007E,對應 A6 的狀態為 0(即 RS=0),而 LCD-> LCD_RAM 的地址就是0X6C00,0080(結構體地址自增),對應A6的狀態為1(即RS=1)。
所以,有了這個定義,當我們要往 LCD寫命令/數據的時候,可以這樣寫:
LCD->LCD_REG=CMD; //寫命令
LCD->LCD_RAM=DATA; //寫數據
而讀的時候反過來操作就可以了,如下所示:
CMD= LCD->LCD_REG;//讀LCD 寄存器
DATA = LCD->LCD_RAM;//讀 LCD 數據
這其中,CS、 WR、RD和IO 口方向都是由FSMC 控制,不需要我們手動設置了。接下來,我們先介紹一下lcd.h里面的另一個重要結構體:
//LCD 重要參數集
typedef struct
{
u16 width; //LCD 寬度
u16 height; //LCD 高度
u16 id; //LCD ID
u8 dir; //橫屏還是豎屏控制:0,豎屏;1,橫屏。
u16 wramcmd; //開始寫 gram指令
u16 setxcmd; //設置 x坐標指令
u16 setycmd; //設置 y坐標指令
}_lcd_dev;
//LCD 參數
extern _lcd_dev lcddev; //管理LCD 重要參數
該結構體用于保存一些 LCD 重要參數信息,比如LCD 的長寬、LCD ID(驅動IC 型號)、LCD 橫豎屏狀態等,這個結構體雖然占用了十幾個字節的內存,但是卻可以讓我們的驅動函數支持不同尺寸的 LCD,同時可以實現 LCD 橫豎屏切換等重要功能,所以還是利大于弊的。有了以上了解,下面我們開始介紹 lcd.c里面的一些重要函數。
先看 7個簡單,但是很重要的函數:
//寫寄存器函數
//regval:寄存器值
void LCD_WR_REG(vu16 regval)
{ regval=regval; //使用-O2優化的時候,必須插入的延時
LCD->LCD_REG=regval;//寫入要寫的寄存器序號
}
//寫 LCD 數據
//data:要寫入的值
void LCD_WR_DATA(vu16 data)
{ data=data; //使用-O2優化的時候,必須插入的延時
LCD->LCD_RAM=data;
}
//讀 LCD 數據
//返回值:讀到的值
u16 LCD_RD_DATA(void)
{ vu16 ram; //防止被優化
ram=LCD->LCD_RAM;
return ram;
}
//寫寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要寫入的數據
void LCD_WriteReg(vu16 LCD_Reg, vu16 LCD_RegValue)
{ LCD->LCD_REG = LCD_Reg; //寫入要寫的寄存器序號
LCD->LCD_RAM = LCD_RegValue; //寫入數據
}
//讀寄存器
//LCD_Reg:寄存器地址
//返回值:讀到的數據
u16 LCD_ReadReg(vu16 LCD_Reg)
{ LCD_WR_REG(LCD_Reg); //寫入要讀的寄存器序號
delay_us(5);
return LCD_RD_DATA(); //返回讀到的值
}
//開始寫GRAM
void LCD_WriteRAM_Prepare(void)
{ LCD->LCD_REG=lcddev.wramcmd;
}
//LCD 寫GRAM
//RGB_Code:顏色值
void LCD_WriteRAM(u16 RGB_Code)
{ LCD->LCD_RAM = RGB_Code;//寫十六位GRAM
}
因為FSMC 自動控制了WR/RD/CS 等這些信號,所以這7個函數實現起來都非常簡單,我們就不多說,注意,上面有幾個函數,我們添加了一些對MDK –O2優化的支持,去掉的話,在-O2 優化的時候會出問題。這些函數實現功能見函數前面的備注,通過這幾個簡單函數的組合,我們就可以對 LCD進行各種操作了。
上一篇:STM32f4---TFTLCD顯示實驗代碼(02)
下一篇:STM32f4---OLCD顯示實驗代碼(04)
推薦閱讀
史海拾趣
ATP深知,優質的產品需要優質的服務來支撐。因此,公司一直致力于提升客戶服務水平,為客戶提供最優質的產品、最具競爭力的價格和最優質的服務。ATP通過建立完善的售后服務體系,及時解決客戶在使用過程中遇到的問題,贏得了客戶的信任和好評。同時,公司還積極開展市場調研,了解客戶需求,不斷優化產品和服務,以滿足市場的不斷變化。
這五個故事展示了ATP Electronics在電子行業中的發展歷程和取得的成就。通過技術創新、推出工業級產品、踐行環保理念、實施全球化戰略以及提升優質服務,ATP成功地在激烈的市場競爭中脫穎而出,成為了閃存卡市場的領軍企業。
ATP深知,優質的產品需要優質的服務來支撐。因此,公司一直致力于提升客戶服務水平,為客戶提供最優質的產品、最具競爭力的價格和最優質的服務。ATP通過建立完善的售后服務體系,及時解決客戶在使用過程中遇到的問題,贏得了客戶的信任和好評。同時,公司還積極開展市場調研,了解客戶需求,不斷優化產品和服務,以滿足市場的不斷變化。
這五個故事展示了ATP Electronics在電子行業中的發展歷程和取得的成就。通過技術創新、推出工業級產品、踐行環保理念、實施全球化戰略以及提升優質服務,ATP成功地在激烈的市場競爭中脫穎而出,成為了閃存卡市場的領軍企業。
隨著技術的不斷進步,AINFO Inc公司不斷推出創新產品,滿足市場的多樣化需求。公司注重產品的質量和性能,通過優化設計和生產工藝,提高了產品的競爭力。同時,公司積極開拓國內外市場,與多家知名企業建立了合作關系,實現了產品的廣泛應用。
在電子科技日新月異的今天,Fermionics Lasertech Inc公司由一群熱衷于激光技術研究的科學家和工程師創立。他們致力于開發新型激光器,以滿足電子制造行業對高精度加工的需求。在經歷無數次實驗和失敗后,他們終于研發出了具有劃時代意義的超精密激光切割設備,這一技術突破為公司贏得了第一筆大額訂單,也為公司的后續發展奠定了堅實的基礎。
面對電子行業日益多樣化的市場需求,FlexiPanel推出了定制化RF模塊解決方案服務。公司擁有一支專業的技術團隊,能夠根據客戶的具體需求,提供從需求分析、方案設計、樣品制作到批量生產的全流程服務。這種靈活多樣的服務模式不僅滿足了客戶對于個性化產品的需求,還幫助FlexiPanel在市場中建立了良好的口碑和品牌形象。
如題,現在嵌入式基本是和LINUX連接到一起,搞得我們頭大,那作為剛入門的人,是不是我們學習嵌入式,一定要學習LINUX呢?… 查看全部問答∨ |
|
我自己畫了個F2812的最小系統板,晶振用的是25MHZ。 把電路焊好后,上電。用示波器看XCLKOUT的輸出,是6.25MHZ的時鐘信號。板子放了一會,什么也沒做,再上電,用示波器看XCLKOUT的輸出,發現是3.125MHZ的時鐘信號,接下來再測時,一直都是3.125MH ...… 查看全部問答∨ |
本帖最后由 jameswangsynnex 于 2015-3-3 20:03 編輯 In-Stat通過對美國消費者進行在線調查后發現,USB毫無疑問是當今家用和辦公PC上最流行、最常用的數字接口界面,而藍牙則在手機領域非常流行。 In-Stat分析師Brian O\'Rourke表示:“在家 ...… 查看全部問答∨ |
1、想方設法使用一個時鐘,進行同步設計。 2、確保信號建立時間無誤。 3、盡量降低電路速度。 4、不要認為使用硬件描述語言是做軟件。時刻保將自己寫的每條語句都能找到成相應的硬件。… 查看全部問答∨ |
|
proteus仿真沒有我想要的元件ADS1211和MAX531,這分別是模數轉換和數模轉換元件,沒有這兩個元件,怎么做才能與keilc程序仿真出實際的效果啊… 查看全部問答∨ |
有誰在VXWORKS下玩過eXtremedb 實時數據庫的? extremedb是首款非常優秀的微秒級內存數據庫,高能和性能都達到了內存數據庫的極限、內核尺寸在100K左右 在各種軟硬件平臺上面能夠達到微秒級的插入、查詢和更新 。感興趣的朋友可以從下載試一下技術交流:QQ:914669793 如需要多平臺詳 ...… 查看全部問答∨ |
PND2442 - 主流手持設備方案—S3C2442-SC32442的相關方案資料 大家好,初來論壇。 發些資料給論壇,有興趣可看看。 因上傳不了。 給一下下載地址啦: s3c2442架構與選型文檔 [/url] 主流手持設備方案—S3C2442-SC32442 [url=http://www.openemb.com/download/PND2442.rar] 如想要其它資料可發EMAIL到 ...… 查看全部問答∨ |
PB5.0,編譯出現錯誤:error C2220: warning treated as error - no object file generated 平臺:PB5.0 小弟做一個內核時候,在build階段出現一個錯誤,具體如下: BUILD: [00:0000000029:PROGC ] Compiling \\WINCE500\\PLATFORM\\855gme\\Src\\Kernel\\Libs\\Kitl\\ directory. BUILD: [01:000 ...… 查看全部問答∨ |