微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于51单片机12864液晶显示数字函数

基于51单片机12864液晶显示数字函数

时间:11-25 来源:互联网 点击:
经常去查些技术性的文章,很多人都以博客的形式写出来,说是利人利己。我觉得有道理。

回头又想到,自己申请的新浪微博也好些年了,确很少发博文,今天就发第一篇技术博客吧。

希望能养成这个习惯。。

好了,今天晚上花了我两个小时,就为了写一个简单的函数,可能不足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;// 初始化为 1

for(;b>0;b--)

{

result*=a;

}

return result;

}

过两天写一个计算器程序。。。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top