假期參加電賽崩了。。。 閒的無聊,準備做一些底層的代碼分享一下,也算是給自己磨鍊一下吧。
這次做的是Stm32F407ZGT6 驅動LCD12864 的代碼 測試的時候使用的是正點原子的探索者 STM32F4開發板、 LCD 插在 清翔的51單片機開發板上 注意 我是用的是 帶有中文字庫的版本 代碼的下載地址在這裏
這裏注意 驅動LCD 需要給模塊一個參考電壓 也就是上圖的VO 否則LCD 顯示會出異常(顏色過深或者過淺) 我也是因爲這個
所以才使用了成品開發板的電路
程序是從51單片機的程序上遷移過來的,咱們不做深究,只是注重一些遷移的細節。
以上是三個控制引腳的設置,其實還有幾個是 PSB 需要設置,這個是一直拉高 我就沒用IO了 就直接接到VCC了
在51中 IO的輸入輸出是由 C語言的讀取和寫入決定的, P0 = 0xff 是輸出 data = P0是 讀取
但是在STM32F407 中確不是這樣的,STM32 有自己的輸入數出模式, 不同的時刻需要對輸入輸出的寄存器進行配置。
我的實現過程大概是這樣的:
輸出和輸入分別使用一個函數來實現,函數中有切換 IO輸入輸出模式的操作 也有 讀取和寫入的操作
實現了這兩個函數以後剩下的代碼幾乎就可以全部遷移過去了,只要注意一下 函數名稱就可以了
以上就實現了對LCD12864 的驅動, 我測試用的 LCD是帶有中文字庫的,顯示漢字很方便,至於繪圖, 描點、反白、顯示數字等等的暫時還沒有實現,看心情吧。如果有更新的話後期大家應該可以看得到。
更新的代碼來了, 我編寫了一些常用的顯示代碼,
大概是這樣的 顯示int(帶符號) double 還有hex 和bin
int 顯示的函數 請使用這個 後面的那個是有問題的
void LCD_12864_show_int(u8 x,u8 y,int num,u8 len)
{
u32 temp=1;
u8 i=0;
u8 flag=1;
LCD_12864_pos(x,y);
if(num <0)
{
LCD_12864_write_data('-'); //顯示符號
num *=-1;
}
for(i=0;i<len-1;i++) // 最高位 除以len -1
temp *=10;
for(i=0;i<len;i++)
{
if(flag &&(num/temp == 0))
{ //flag == 1 並且 num/temp == 0
//證明這是我們不想要的開頭部分的0
LCD_12864_write_data(' ');// 填充空格
} else
{
flag = 0;// 第一次進入就會置0 之後就不會進到上面的邏輯
LCD_12864_write_data((num/temp)+'0');
}
num%=temp;
temp/=10;
}
}
這是顯示int 的實現方法(自己寫的可能會有bug 我這邊測試暫時沒有發現問題)
這是顯示string的方法, 可以直接顯示漢字!
double 的顯示比較長。。。。 而且這個代碼存在一定的精度的誤差 比如你要顯示123456.654321 可能實現的不是這個數字!!!
其實 顯示 double和 hex bin 都是先合成一個string 然後在現實string 主要的難點就是合成string了
以上就是顯示的過程了
這是顯示的效果圖 對應於 main中
顯示bin的話 LCD的長度不是很夠 看着就是比較難受
這是顯示 字符串和 int
看起來還湊合 , 注意使用的時候長度要有一定的富餘
代碼大概是這樣的,我會上傳, 寫的比較匆忙 錯誤支持在做難免,希望您的不吝賜教!