由于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');
};
}
用户398468 2009-9-13 19:28
用户188034 2009-9-12 14:20
用户188034 2009-9-12 14:13