附: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=0;
}
ftoa(data,bits,arr); //将浮点数转换成字符串
for(i=0;i<9;i++)
{
if (arr==''.'')
dot_position=i;
}
for(i=0;i<8;i++)
{ if(i==dot_position-1)
{
send(i+1,arr|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); //十位以上的数字
}
}
}
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);
}
文章评论(0条评论)
登录后参与讨论