打印
[AVR单片机]

实验39:MAX7219驱动实验(2种算法)

[复制链接]
1579|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linxiyiran|  楼主 | 2009-5-24 01:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************************************
Platform: ATmega16+8位共阴数码管
Project : 实验39:MAX7219驱动实验01
Clock F : 外部8M
Software: ICCAVR7.14C
Author  : 林夕依然
AVRgroup: http://avrgroup.5d6d.com/
Version : 09.05.18
Updata  : 
comments:
1、硬件连接详见proteus仿真模型;
2、使用外部8MHz晶体;
3、M16的B5/B6/B7控制MAX7219显示,两种不同的算法实现;
4、8位共阴数码管间隔2S交替显示当前时间和论坛建立日期;
5、参考:www.avrvi.com/qinlinzhu/我做的第一个C语言程序-MAX7219显示.
*******************************************************************************/
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int   
//全局变量定义
uint TEN,QIAN,BAI,SHI,GE;

//函数声明    
void delay_ms(uint i); 
void port_init(void);
void init_max7219(void); 
void conver16_to10(uint num);   
void send01_max7219(uchar add,uchar dat);
void send02_max7219(uchar add,uchar data);
void display_time(void);
void display_date(void);
/*-----------------------------------------------------------------
函数名称: void delay_us(uint n),void delay_ms(uint i)
函数功能: us,ms延时函数
参    数: n,i
返 回 值: 无
-----------------------------------------------------------------*/
//us延时函数
void delay_us(uint n)   //8*0.125=1us
{
    int i,j;
for(j=0;j<8;j++)
{
   for (i=0;i<n;i++) 
   NOP();
}  
}
//ms延时函数
void delay_ms(uint i)
{
    while(i--)
    {                          
     uint j;                
        for(j=1;j<=1332;j++)   
      ;               
    } 
}
/*-----------------------------------------------------------------
函数名称: void conver16_to10(uint num)
函数功能: 16进制转10进制函数
参    数: num
返 回 值: 无
-----------------------------------------------------------------*/
void conver16_to10(uint num)
{
TEN=num; 
QIAN=TEN/0x03e8;
TEN%=0x03e8;
BAI=TEN/0x64; 
TEN%=0x64;
SHI=TEN/0x0a;
TEN%=0x0a;
GE=TEN;   
}       
        
/*-----------------------------------------------------------------
函数名称: void init_max7219(void)
函数功能: MAX7219初始化函数
参    数: 无
返 回 值: 无
说    明: 使用send01_max7219(uchar add,uchar data)初始化MAX7219
-----------------------------------------------------------------*/
void init_max7219(void)
{
send01_max7219(0x0c,0x01);//关断方式:正常操作=1/睡眠模式=0;
send01_max7219(0x0f,0x00);//显示测试:正常=0/测试模式=1;现为正常模式; 
send01_max7219(0x09,0xff);//译码方式:不译码=0/BCD译码=1;
send01_max7219(0x0b,0x07);//扫描限制:范围0~8位,设置为8位;
send01_max7219(0x0a,0x07);//显示亮度:范围0~F,现设置为7;
}
/*-----------------------------------------------------------------
函数名称: void send01_max7219(uchar add,uchar data)
函数功能: MAX7219寄存器操作函数(第一种算法)
参    数: add:地址,data:数据
返 回 值: 无
说    明:尚未理解此种算法
-----------------------------------------------------------------*/
void send01_max7219(uchar add,uchar data)

uchar ADS,i,j,a;
PORTB&=0xbf;         //LOAD=0;
i=0;
while(i<16)
{
  if(i<8){ADS=add;} 
  else{ADS=data;}
    for(j=8;j>=1;j--)
    { 
    a=ADS;
    a=a>>2;
    a=a&0x20;
    PORTB&=0xdf;
    PORTB=(PORTB|a);
    ADS<<=1;
    PORTB&=0x7f;     //CLK=0; 
    PORTB|=0x80;     //CLK=1;
    }
  i=i+8;
}
  PORTB|=0x40;       //LOAD=1;
}
/*-----------------------------------------------------------------
函数名称: void send02_max7219(uchar add,uchar data)
函数功能: MAX7219寄存器操作函数(第二种算法)
参    数: add:地址,data:数据
返 回 值: 无
说    明:此种算法最易理解
-----------------------------------------------------------------*/
void send02_max7219(uchar add,uchar data)
{
uchar ADS,i,j;
PORTB&=0xBF;          //LOAD=0,PB6=0
for(j=0;j<8;j++)
{
  PORTB&=0x7F;         //CLOCK=0,PB7=0
  if((add&0x80)==0x80)
   PORTB|=0x20;       //DIN=1,PB5=1
  else
    PORTB&=0xDF;       //DIN=0,PB5=0
  PORTB|=0x80;         //CLOCK=1,PB7=1
  add=add<<1;
}
for(i=0;i<8;i++)
{
  PORTB&=0x7F;         //CLOCK=0,PB7=0
  if((data&0x80)==0x80)
   PORTB|=0x20;       //DIN=1,PB5=1
  else
    PORTB&=0xDF;       //DIN=0,PB5=0
  PORTB|=0x80;         //CLOCK=1,PB7=1
  data=data<<1;
}
PORTB|=0x40;          //LOAD=1,PB6=1
}
/*-----------------------------------------------------------------
函数名称: void display_time(void)
函数功能: 时间显示函数(05-18 18:30)
参    数: 无
返 回 值: 无
说    明: 使用send01_max7219(uchar add,uchar data)操作MAX7219
-----------------------------------------------------------------*/
void display_time(void)
{
    send01_max7219(0x01,0);    //1
    send01_max7219(0x02,5);    //2
    send01_max7219(0x03,1);    //3
    send01_max7219(0x04,8);    //4
    send01_max7219(0x05,1);    //5
    send01_max7219(0x06,8);    //6
    send01_max7219(0x07,3);    //7
send01_max7219(0x08,0);    //9
}
/*-----------------------------------------------------------------
函数名称: void display_date(void)
函数功能: 论坛建立日期显示函数(20090327)
参    数: 无
返 回 值: 无
说    明: 使用send02_max7219(uchar add,uchar data)操作MAX7219
-----------------------------------------------------------------*/
void display_date(void)
{
  conver16_to10(2009); 
    send02_max7219(0x01,QIAN);   //1
    send02_max7219(0x02,BAI);    //2
    send02_max7219(0x03,SHI);    //3
    send02_max7219(0x04,GE);     //4
    send02_max7219(0x05,0);      //5
    send02_max7219(0x06,3);      //6
    send02_max7219(0x07,2);      //7
send02_max7219(0x08,7);      //9
}
/*-----------------------------------------------------------------
函数名称: void port_init(void)
函数功能: 端口初始化函数
参    数: 无
返 回 值: 无
-----------------------------------------------------------------*/
void port_init(void)
{
    PORTA=0xFF;
    DDRA=0x00;
    PORTB=0x00;
    DDRB=0xFF;
    PORTC=0xFF;
    DDRC=0x00;
    PORTD=0xFF;
    DDRD=0x00;
}
/*-----------------------------------------------------------------
函数名称: void main(void)
函数功能: 主函数
参    数: 无
返 回 值: 无
-----------------------------------------------------------------*/
void main(void)
{
    port_init();             //端口初始化
    init_max7219();          //MAX7219初始化
    while (1)
    {  
     display_time();      //显示当前时间
     delay_ms(2000);
     display_date();      //显示论坛建立日期
     delay_ms(2000);
}
}
相关链接:https://bbs.21ic.com/upfiles/img/20095/200952411636216.rar

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

69

帖子

0

粉丝