新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于51單片機12864液晶顯示數(shù)字函數(shù)

基于51單片機12864液晶顯示數(shù)字函數(shù)

作者: 時間:2016-11-25 來源:網絡 收藏
經常去查些技術性的文章,很多人都以博客的形式寫出來,說是利人利己。我覺得有道理。
回頭又想到,自己申請的新浪微博也好些年了,確很少發(fā)博文,今天就發(fā)第一篇技術博客吧。
希望能養(yǎng)成這個習慣。。
好了,今天晚上花了我兩個小時,就為了寫一個簡單的函數(shù),可能不足40行。但確實遇到了點問題,最后還是解決了。
函數(shù)的作用就是用12864液晶顯示器,來顯示任意位數(shù)的數(shù)字。為什么要寫這個函數(shù)呢?因為我在使用12864的過程中經常用到一些接口函數(shù),十分的方便。比如write_char();write_string();寫字符和寫字符串函數(shù)。
但是要寫一個數(shù)字,卻沒法了,我可以一位數(shù)一位數(shù)拆開來用顯示字符函數(shù)。但是這樣很麻煩,最要命的一點是,由于12864的地址是2個字節(jié)單位的(這里有些不專業(yè)了),可能是為了寫漢字,數(shù)字不能緊緊靠在一起,中間會空一格字節(jié),很是浪費啊。于是就有了這個寫數(shù)字函數(shù)。
void write_num(uchar x,uchar y,unsigned long int num)
{
uchar i=10;
switch (y)
{
case 0: Lcd_WriteCmd(0x80+x);break;
case 1: Lcd_WriteCmd(0x90+x);break;
case 2: Lcd_WriteCmd(0x88+x);break;
case 3: Lcd_WriteCmd(0x98+x);break;
default: ;
}
while(i>=1)
{
if((uchar)(num/pow(10,i-1))!=0)
break;
i--;
}
while(i)
{
Lcd_WriteData(num/(u32)(pow(10,i-1))+0);
num=num%(u32)(pow(10,i-1));
i--;
}
}
首先肯定不是任意位數(shù)了,畢竟顯示屏就那么大,顯示位數(shù)肯定有限。我們注意到C語言里
unsigned long int型是很大的了,是32位,4個字節(jié),最大是4294967295..
這里是十個位數(shù),所以我們的參數(shù)是u32類型,另XY參數(shù)就是在12864上顯示的坐標位置。
這個函數(shù)值是先確定要寫入的坐標,然后確定數(shù)的位數(shù),然后從高位開始一位一位寫入。
定義一個變量i;初始化位10。
值得一提的是,我遇到的問題,不知道其他人有沒有遇到。
用pow函數(shù)時,由于庫函數(shù)定義的都是double型的,在取余數(shù)是會報錯。我先加了強制類型轉換。發(fā)現(xiàn)不行,顯示很多數(shù)都出錯。經過仿真調試,覺得問題就出現(xiàn)在pow函數(shù)這里。
于是,我自己寫pow函數(shù),數(shù)據(jù)類型都用整型的,這樣就免去數(shù)據(jù)類型轉換時候的數(shù)據(jù)丟失了。
這樣改了以后就可以了。ok
寫上我寫的pow函數(shù)把,,很簡單的。
u32 pow(uchar a,uchar b)
{
u32 result=1;// 初始化為 1
for(;b>0;b--)
{
result*=a;
}
return result;
}
過兩天寫一個計算器程序。。。


評論


技術專區(qū)

關閉