基于51單片機(jī)12864液晶顯示數(shù)字函數(shù)
回頭又想到,自己申請(qǐng)的新浪微博也好些年了,確很少發(fā)博文,今天就發(fā)第一篇技術(shù)博客吧。
希望能養(yǎng)成這個(gè)習(xí)慣。。
好了,今天晚上花了我兩個(gè)小時(shí),就為了寫(xiě)一個(gè)簡(jiǎn)單的函數(shù),可能不足40行。但確實(shí)遇到了點(diǎn)問(wèn)題,最后還是解決了。
函數(shù)的作用就是用12864液晶顯示器,來(lái)顯示任意位數(shù)的數(shù)字。為什么要寫(xiě)這個(gè)函數(shù)呢?因?yàn)槲以谑褂?strong>12864的過(guò)程中經(jīng)常用到一些接口函數(shù),十分的方便。比如write_char();write_string();寫(xiě)字符和寫(xiě)字符串函數(shù)。
但是要寫(xiě)一個(gè)數(shù)字,卻沒(méi)法了,我可以一位數(shù)一位數(shù)拆開(kāi)來(lái)用顯示字符函數(shù)。但是這樣很麻煩,最要命的一點(diǎn)是,由于12864的地址是2個(gè)字節(jié)單位的(這里有些不專(zhuān)業(yè)了),可能是為了寫(xiě)漢字,數(shù)字不能緊緊靠在一起,中間會(huì)空一格字節(jié),很是浪費(fèi)啊。于是就有了這個(gè)寫(xiě)數(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語(yǔ)言里
unsigned long int型是很大的了,是32位,4個(gè)字節(jié),最大是4294967295..
這里是十個(gè)位數(shù),所以我們的參數(shù)是u32類(lèi)型,另XY參數(shù)就是在12864上顯示的坐標(biāo)位置。
這個(gè)函數(shù)值是先確定要寫(xiě)入的坐標(biāo),然后確定數(shù)的位數(shù),然后從高位開(kāi)始一位一位寫(xiě)入。
定義一個(gè)變量i;初始化位10。
值得一提的是,我遇到的問(wèn)題,不知道其他人有沒(méi)有遇到。
用pow函數(shù)時(shí),由于庫(kù)函數(shù)定義的都是double型的,在取余數(shù)是會(huì)報(bào)錯(cuò)。我先加了強(qiáng)制類(lèi)型轉(zhuǎn)換。發(fā)現(xiàn)不行,顯示很多數(shù)都出錯(cuò)。經(jīng)過(guò)仿真調(diào)試,覺(jué)得問(wèn)題就出現(xiàn)在pow函數(shù)這里。
于是,我自己寫(xiě)pow函數(shù),數(shù)據(jù)類(lèi)型都用整型的,這樣就免去數(shù)據(jù)類(lèi)型轉(zhuǎn)換時(shí)候的數(shù)據(jù)丟失了。
這樣改了以后就可以了。ok
寫(xiě)上我寫(xiě)的pow函數(shù)把,,很簡(jiǎn)單的。
u32 pow(uchar a,uchar b)
{
u32 result=1;// 初始化為 1
for(;b>0;b--)
{
result*=a;
}
return result;
}
過(guò)兩天寫(xiě)一個(gè)計(jì)算器程序。。。
評(píng)論