基于51单片机12864液晶显示数字函数
回头又想到,自己申请的新浪微博也好些年了,确很少发博文,今天就发第一篇技术博客吧。
希望能养成这个习惯。。
好了,今天晚上花了我两个小时,就为了写一个简单的函数,可能不足40行。但确实遇到了点问题,最后还是解决了。
函数的作用就是用12864液晶显示器,来显示任意位数的数字。为什么要写这个函数呢?因为我在使用12864的过程中经常用到一些接口函数,十分的方便。比如write_char();write_string();写字符和写字符串函数。
但是要写一个数字,却没法了,我可以一位数一位数拆开来用显示字符函数。但是这样很麻烦,最要命的一点是,由于12864的地址是2个字节单位的(这里有些不专业了),可能是为了写汉字,数字不能紧紧靠在一起,中间会空一格字节,很是浪费啊。于是就有了这个写数字函数。
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--;
}
}
首先肯定不是任意位数了,毕竟显示屏就那么大,显示位数肯定有限。我们注意到C语言里
unsigned long int型是很大的了,是32位,4个字节,最大是4294967295..
这里是十个位数,所以我们的参数是u32类型,另XY参数就是在12864上显示的坐标位置。
这个函数值是先确定要写入的坐标,然后确定数的位数,然后从高位开始一位一位写入。
定义一个变量i;初始化位10。
值得一提的是,我遇到的问题,不知道其他人有没有遇到。
用pow函数时,由于库函数定义的都是double型的,在取余数是会报错。我先加了强制类型转换。发现不行,显示很多数都出错。经过仿真调试,觉得问题就出现在pow函数这里。
于是,我自己写pow函数,数据类型都用整型的,这样就免去数据类型转换时候的数据丢失了。
这样改了以后就可以了。ok
写上我写的pow函数把,,很简单的。
u32 pow(uchar a,uchar b)
{
u32 result=1;//
for(;b>0;b--)
{
result*=a;
}
return result;
}
过两天写一个计算器程序。。。
51单片机12864液晶数字函 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)