原创 【原创】mega16接lcd1602显示小数

2009-9-11 15:55 4791 6 9 分类: MCU/ 嵌入式

由于CodevsionAVR里面的lcd function常用的只有那么几句
unsigned char lcd_init(unsigned char lcd_columns)
void lcd_clear(void)
void lcd_gotoxy(unsigned char x, unsigned char y)
void lcd_putchar(char c)
void lcd_puts(char *str)
void lcd_putsf(char flash *str)
都是直接输出字符型的,没有输出数值型的,所以要在lcd上显示数字什么的都要经过转换,转换为字符型才能在lcd上显示。如果要显示的是数字变量,那也要先定义为字符型char 或者unsigned char,然后再运算,运算的结果把各位的数值提出来,加上'0',变为ASCII值在lcd上显示。例如结果是12,那要把十位1和各位2通过运算得到1、2,再分别加上‘0’就可以在用lcd_putchar在lcd 上显示了。



单片机中一般不使用float型,而整型的数值之间的运算得到的又是整型,得不到小数部分。而且即使定义了一个float型,如果处理不当得到的结果的小数部分依然会是显示为0的。我当时用的算法是,定义 了一个float,一个int。得到了的浮点型结果,然后用强制转换数值类型(int)(结果),然后得到结果的整数部分,然后再用原来的结果减去整数部分就应该得到小数部分,然后得到的小数部分左移两位(或者乘以100)(显示两位小数),移到整数部分,再经过处理从而显示。但事实上结果没那么理想,处理的结果是整数部分会变,但小数部分保持显示为0,或者很奇怪的显示“:”,冒号的ASCII是40H,紧跟着9(39H),也不知道到底怎么出的错。查了资料,用强制转换,但是int型(16位)和float型(32位)的长度是不相等的,那样很容易出错的。



后来,换了个思维方法,先让要显示的数值乘以100,然后再除以那个要除的数,那样子,所有的数值都在整数部分了,一个float型都不需要了。如果乘以100后超过65535了,那改用long int 。需要注意的是:两个短整型运算,如果结果大于65535了,再把结果赋值给long型依旧是错误的,那两个短整型中,至少要定义一个为长整型,结果才可以得到正确的值。



下面是自己编的一个程序:(用来处理转速的在lcd上显示,暂时先随便定义一个转速来处理显示)



#include <mega16.h>
#asm
   .equ __lcd_port=0x18
#endasm
#include <lcd.h>
void main(void)
{
   unsigned int l;
   long h,v;
   char vv[]={'0','0','0','0','0'};
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;


// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;


// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;


// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;


h=0x10;      //高八位
l=0x28;      //低八位       a*256+b不超过五千
v=(long)((h*256+l)*100/6);    


vv[4]=v/10000+'0';//最高位
v=v%10000;
vv[3]=v/1000+'0';
v=v%1000;
vv[2]=v/100+'0';
v=v%100;
vv[1]=v/10+'0';
v=v%10;
vv[0]=v+'0';
lcd_init(16);
lcd_clear();
while (1)
      {
    
         lcd_gotoxy(0,1);
  lcd_putchar(vv[2]);
  lcd_gotoxy(1,1);
  lcd_putchar(vv[1]);
  lcd_gotoxy(2,1);
  lcd_putchar(vv[0]);
  lcd_gotoxy(3,1);
  lcd_putchar('.');
  lcd_gotoxy(4,1);
  lcd_putchar(vv[4]);
  lcd_gotoxy(5,1);
  lcd_putchar(vv[5]);
  lcd_gotoxy(6,1);
  lcd_putchar('H');
  lcd_gotoxy(7,1);
  lcd_putchar('z');
      };
}

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户398468 2009-9-13 19:28

有啊,就是实物做出来了的。

用户188034 2009-9-12 14:20

有做出来的板子吗

用户188034 2009-9-12 14:13

有做出来的板子吗
相关推荐阅读
用户398468 2011-02-28 18:40
连接器资料整理笔记
一。为何使用连接器: 1.生产安装,提高效率; 2.方便维修 3.升级(例如存储器容量扩展) 4.整合新的电子配件 二。连接器的一些参数 1.绝缘电阻:绝缘材料在没有被击穿时的电阻值。兆欧级 2.接触...
用户398468 2010-12-24 16:27
PCB中的3W,20H原则,五五规则
PCB中的3W,20H原则,五五规则    3W规则    为了减少线间窜扰,应保证线间距足够大,当线中心距不少于3倍线宽时,则可保持70%的电场不互相干扰,称为3W规则。如要达到98%的电场不互相干...
用户398468 2010-12-24 16:26
IPC标准目录
目 录 题 目IPC-SC-60A 锡焊后溶剂清洗手册IPC-SA-61 锡焊后半水溶剂清洗手册IPC-AC-62A 锡焊后水溶液清洗手册IPC-CH-65A 印制板及组装件清洗导则IPC-FC-23...
用户398468 2010-12-24 09:56
MSD 潮湿敏感元件
MSD:moisture-sensitive device 潮湿敏感元件转载: MSD潮湿敏感器件产生的危害 1.潮湿敏感元件产生危害的因素潮敏失效是塑料封装表贴器件在高温焊接工艺中表现出来的特殊的失...
用户398468 2010-02-26 10:49
问题:如何使用单片机实现小数分频?
问题:如何使用单片机实现小数分频?...
用户398468 2009-11-21 20:17
AutoCAD画的一个机械图
...
EE直播间
更多
我要评论
3
6
关闭 站长推荐上一条 /3 下一条