经常去查些技术性的文章,很多人都以博客的形式写出来,说是利人利己。我觉得有道理。
回头又想到,自己申请的新浪微博也好些年了,确很少发博文,今天就发第一篇技术博客吧。
希望能养成这个习惯。。
好了,今天晚上花了我两个小时,就为了写一个简单的函数,可能不足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;
}
过两天写一个计算器程序。。。
关键字:51单片机 12864液晶 数字函数
引用地址:
基于51单片机12864液晶显示数字函数
推荐阅读最新更新时间:2024-03-16 14:37
stc51单片机怎么学, 先掌握STC单片机程序烧录方法!
今天我在这里和大家探讨一下关于 51单片机怎么学 这个话题。 08年我在大学里学习单片机课程的时候,学习内容主要包括单片机的发展历史,单片机的框架,单片机的寄存器,以及单片机的操作指令,用汇编语言实现一些简单的功能。 当时学习的时候知识课本知识,而又没有配套的开发板,可以让我们动手。 当时的感触就是一个字:难,两个字:枯燥。 也许大多数的同学和我是一样的,一大堆指令,感到非常的无趣,没有什么意思,考试也是一大堆理论知识。 当然现在大学里的课程可能已经做了升级,关于单片机编程以及 单片机C语言 这一块了不知道大学里有没有增加,课程有没有优化的更加人性化一点。 后来参加电赛,自己买了一个开发板,不断的编代码,实践。 刚开始用汇编语言,
[单片机]
51单片机驱动1602液晶显示器c程序
/* 程序效果:单片机控制液晶显示器1602显示字母数字,用户自行更改io 程序版权:http://www.51hei.com */ #include reg52.h //头文件 #define uchar unsigned char //宏定义 #define uint unsigned int uchar code table ="51HEI XING XING " ; //显示的字母 uchar code table1 ="51HEI MCU XUE YUAU" ; sbit lcdrs=P1^0; //寄存器选择引脚 sbit lcdwr=P1^1; //读写引脚 sbit lcde=P1^2; //片选引脚 void de
[单片机]
51单片机冒泡排序汇编语言子程序
;;入口:待排序的N个单字节无符号整数所在的RAM首址存于R3,N存于R4; ;;返回:由小至大排序完毕的N个数据存于原RAM块。 QUE: MOV A, R3 MOV R0, A ;;R0←RAM首址 MOV A, R4 MOV R7, A ;;R7←N CLR PSW.5 ;;交换标志清零,表示未交换数 MOV A, @R0 ;;A←RAM中首个数 LP1: INC R0 ;;RAM指针加1 MOV R2, A ;;送前数于R2暂存 CLR C ;;借位清零
[单片机]
学51单片机-IIC总线与时序
IIC总线是飞利浦公司上世纪80年代设计出来的一种总线通信方式,主要用来连接整体电路,它可以一个总线结构上连接多个设备。 很多人听到IIC总线、SPI总线、485总线什么的就会晕,其实,数据传输的接线方式,大体上就是两种:一种是并行接口,一种是串行接口。 并行接口是什么?用并行方式来传输数据的接口。假如我想传输几个8位的数据,那好,单片机上用8个IO传送数据,每次就能传送一个。假如想传输几个16位的数据呢?那就要用16个IO!优点是速度快,缺点是占用的IO太多了。 串行接口是什么?是指数据在有限的几个IO上按照顺序,一位一位的进行传输。这类有很多:UART、IIC、SPI、CAN、USB等等
[单片机]
基于51单片机和FPGA的人机交互系统的设计
在现代各类仪器的开发中,人机交互功能正起着无可替代的作用。人机交互界面友好的仪器将更容易操作和使用,从而提高工作效率。液晶显示器(LCD)具有功 耗低、价格低、寿命长、接口控制方便等特点,在科研与设计领域正发挥着越来越大的作用。FPGA作为单片机外设的接口芯片,可以大大简化接口电路,通过对 FPGA进行编程,可以实现常用的译码、地址选通等功能。 本文以C8051F020单片机与FPGA互连系统为控制核心,以液晶显示控制器T6963C为例,结合行扫描键盘,简述了一种人机交互功能的设计。 1 系统设计方案 FPGA可在很大程度上扩展单片机的资源,然而人机交互功能仍应尽量减少对单片机及FPGA的资源消耗,以便将更多的片内资源
[单片机]
51单片机 (2)流水灯实验
一、控制一/多灯亮灭 汇编实现 ;注释 LOOP: ;SETB P1.1 ;(1)熄灭灯 MOV P1,#0FFH; LCALL DELAY ;(2)延时一段时间 ;CLR P1.1 ;(3)点亮灯 MOV P1,#0FDH; LCALL DELAY ;(4)延时一段时间 AJMP LOOP ;(5)跳转到第一句LOOP处 ;以下子程序 DELAY: MOV R7,#250 ; D1: MOV R6,#250 ; D2: DJNZ R6,D2 ;R6=R6-1;IF(R6!=0) GOTO D2; DJNZ R7,D1 ;
[单片机]
【单片机学习】51单片机【定时/计数器】,详细介绍
一、先知先会 1、CPU时序的有关知识 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期) 状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 机器周期:1个机器周期=6个状态周期=12个振荡周期。 指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。 1.1、周期换算 2、在学习定时器之前需要明白的 (1)51单片机有两组定时器/计数器; 因为既可以定时,也可以计数,所以称为定时/计数器。 (2)定时/计数器和单片机的CPU是相互独立的。 定时/计数器工作过程是自动完成的,不需要CPU的参与。 (3)51单片机中的定时/计数器是根据机器内部的时钟或者
[单片机]
基于51单片机的嵌入式多媒体播放器的设计与实现
1、引言
随着音频解码技术、存储器技术、MP3高质量压缩技术等相关技术不断的发展以及人们对消费电子产品需求的增加,MP3新产品层出不穷,成为时尚潮流前沿的一个最佳载体。人们可以用它休闲娱乐 ,也可以用它工作和学习。设计一款性价比优良的MP3 播放器具有实际的应用价值 。随着 C语言的发展和嵌入式系统技术的推广 ,在嵌入式系统低端应用中 ,存在着大量的小型嵌入式应用系统。MP3 播放器的设计 ,就是典型的嵌入式系统应用。MP3具有最基本的播放、选曲、音量控制、音效控制功能。当连接到计算机的 USB接口时,MP3变成 U盘,可以向 U盘复制文件,文件包括 MP3歌曲文件和普通文件 。系统的功能结构图如图 1所示:
[嵌入式]