//_____________________________________________________________________________________
// 名称: 用twi接口控制MAX6953驱动4片5*7点阵
//_____________________________________________________________________________________
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h> //中断所需头文件
#include <stdint.h> //变量类型头文件
#include <util/delay.h> //延时函数头文件
#include <string.h>
#include <stdio.h>
#include <util/twi.h>
//子器件地址
#define MAX6953R 0B10100001 //1=READ
#define MAX6953W 0B10100000 //0=WRITE
//TWI通用操作
#define WAIT() while((TWCR &_BV(TWINT))==0)
#define START() {TWCR=_BV(TWINT)|_BV(TWSTA)|_BV(TWEN);WAIT();}
#define STOP() (TWCR=_BV(TWINT)|_BV(TWSTO)|_BV(TWEN))
#define WriteByte(X) {TWDR=(X);TWCR=_BV(TWINT)|_BV(TWEN);WAIT();}
#define ACK() (TWCR|=_BV(TWEA))
#define NACK() (TWCR&=~_BV(TWEA))
//点阵信息
char led_string[]={"LEDSHOW:<----0123456789"};
//_____________________________________________________________________________________
// 名称: 写max695子程序
//_____________________________________________________________________________________
uint8_t max6953_write(uint8_t addr,uint8_t dat)
{
START(); //启动
if(TW_STATUS!=TW_START) return 0;
WriteByte(MAX6953W); //发送器件地址
if(TW_STATUS!=TW_MT_SLA_ACK) return 0;
WriteByte(addr);
if(TW_STATUS!=TW_MT_DATA_ACK) return 0; //发送从器件地址
WriteByte(dat);
if(TW_STATUS!=TW_MT_DATA_ACK) return 0; //发送发数据
STOP();
_delay_ms(2);
return 1;
}
//_____________________________________________________________________________________
// 名称: max6953初始化
//_____________________________________________________________________________________
void max6953_init()
{
max6953_write(0x01,0xff); //数位0,1的亮度设置
max6953_write(0x02,0xff); //数位2,3的亮度设置(0xff最大)
max6953_write(0x03,0x03); //设置扫描位数范围0-3
max6953_write(0x04,0x01); //设置非关断模式
max6953_write(0x07,0x00); //不进行测试
}
//_____________________________________________________________________________________
// 名称: 主程序
//_____________________________________________________________________________________
int main()
{
uint8_t i,j;
DDRC=0XFF; PORTC=0XFF;
DDRD=0X00; PORTD=0XFF;
MCUCR=0X02; //下降沿触发
GICR=0X40;
sei();
max6953_init();
while(1)
{
for(i=0;i<=strlen(led_string)-4;i++)
{
for(j=0;j<4;j++)
{
max6953_write(0x20|j,(uint8_t)led_string[i+j]);
_delay_ms(300);
}
}
_delay_ms(2000);
}
}
//_____________________________________________________________________________________
// 名称: 中断控制函数
//_____________________________________________________________________________________
ISR(INT0_vect)
{
static uint8_t key_down=0x01;
key_down^=0x01;
max6953_write(0x04,0x00|key_down); //0x00 关断 0x01非关断
}