加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

显示浮点数的小程序(AVR)

时间:2013-09-08  来源:123485.com  作者:9stone

       如果自己编写程序来处理浮点数,那是很头疼的事。还好,各种C语言开发平台都有现成的浮点数处理函数,而且CodeVisionAVR还提供了浮点数转换成字符串形式的函数,让像我这样的“小白菜”爽死了:)!本文就是用CodeVisionAVR写的一个显示浮点数的小程序,还涉及到了MAX7219及AVR单片机的SPI串行口的运用,供广大“小白菜”参考。   
        MAX7219是SPI串行接口的数码管驱动芯片,内部集成了段驱动器、位驱动器、数据保存器(实现静态显示)、BCD译码器、多路扫描器(单独修改某位数字)等,可驱动8位LED数码管或可以驱动64只发光二极管,节省大量的IO引脚。其特点如下:  

  1.  采用SPI串行接口;  
  2. 内部集成8字节显示RAM和6个控制寄存器,能单独修改某一位,且不需要      动态扫描;  
  3. 译码与不译码两种显示模式,可单独设置某一位或多位的显示模式;  
  4. 可通过外部电阻或编程方式调节LED高度;      
  5. 可编程设置成“低功耗模式”,关闭LED显示。       
  6. MAX7219还支持级联,N个MAX7219芯片DOUT相联,驱动N个8位LED或64N个发光二极管

 附:Proteus仿真结果
 

/*****************************************************
Author              : Benny
Chip type           : ATmega16L
Clock frequency     : 8.000000 MHz
知识点:浮点数显示、max7219、SPI
*****************************************************/
#include <mega16.h>
#include <stdlib.h>
#include <spi.h>
#define uint unsigned int
#define uchar unsigned char 
#define ulong unsigned long
#define LOAD_PORT PORTB
 
void send(uchar addr,uchar data)
{ //PB3接Max7219的load引脚
 LOAD_PORT&=~(1<<3); //拉低load
 spi(addr);
 spi(data);
 LOAD_PORT|=(1<<3); //拉高load
}
#define DECODE_MODE 0X09
#define INTENSITY   0X0A
#define SCAN_LIMIT  0X0B
#define SHUTDOWN    0X0C
#define DISPLAYTEST 0X0F  
void max7219_init(uchar decode_bits )
{
 // decode_bits    如:0b01001111  中 1:decode  0:nodecode
 
 send(SHUTDOWN,0x01);            //从Shutdown模式进入Normal
 send(DECODE_MODE,decode_bits);  //设置需要转换成BCD码的位
 send(SCAN_LIMIT,0x07);          //共有8只LED(或8位一体)
 send(INTENSITY,0x09);           //亮度
 send(DISPLAYTEST,0x00);         //测试
}
void display_float(float data,uchar bits)
{/*bits:小数位数,必须是1,2,3,4,5*/
 uchar i,dot_position;
 uchar arr[16];
 for(i=0;i<16;i++)
 {
    arr[i]=0;
 }
 ftoa(data,bits,arr);  //将浮点数转换成字符串
 for(i=0;i<9;i++)
  {
    if (arr[i]==''.'')
      dot_position=i;
  }
 for(i=0;i<8;i++)
  {      if(i==dot_position-1)
         { 
           send(i+1,arr[i]|0x80); //个位数+小数点
          }
        else if(i>=dot_position)
         { 
           if (i<dot_position+bits)
           {      
              send(i+1,arr[i+1]); //小数点后bits个数字
           }
           else
           {
              send(i+1,0x7f);     //无效位关闭显示
           }
        }          
        else
        {
           send(i+1,arr[i]);     //十位以上的数字
        }
  }
}
void spi_init(void)
{
  PORTB=0x00;
  DDRB=0xB8;
  ACSR=0x80;
  SFIOR=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000.000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
  SPCR=0x50;
  SPSR=0x00;
}
void main(void)

  spi_init();                    //初始化SPI串行口
  max7219_init(0b11111111);     //8位都初始化为max7219内部译成七段码模式
  display_float(123.4567891,5); //显示结果为123.45678
  while (1);
}


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门