打印
[AVR单片机]

实验40:MAX7219驱动实验02(第3种算法)

[复制链接]
1476|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linxiyiran|  楼主 | 2009-5-24 01:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************************************
Platform: ATmega16+8位共阴数码管
Project : 实验40:MAX7219驱动实验02
Clock F : 外部8M
Software: ICCAVR7.14C
Author  : 林夕依然
AVRgroup: http://avrgroup.5d6d.com/
Version : 09.05.18
Updata  : 
comments:
1、使用外部8MHz晶体;
2、硬件连接详见proteus仿真模型;
3、M16的C0/C1/C2控制MAX7219显示,使用第三种算法;
4、8位共阴数码管间隔1S交替显示日期和生日信息;
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_us(uint n);  
void delay_ms(uint i); 
void port_init(void);
void init_max7219(void); 
void conver16_to10(uint num);   
void send_max7219(uchar add,uchar dat);
void display_date(void);
void display_birthday(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初始化函数
参    数: 无
返 回 值: 无
-----------------------------------------------------------------*/
void init_max7219(void)
{
    send_max7219(0x0c,0x01);//关断方式:正常操作=1/睡眠模式=0;
    send_max7219(0x0f,0x00);//显示测试:正常=0/测试模式=1;现为正常模式; 
    send_max7219(0x09,0xff);//译码方式:不译码=0/BCD译码=1;
    send_max7219(0x0b,0x07);//扫描限制:范围0~8位,设置为8位;
    send_max7219(0x0a,0x07);//显示亮度:范围0~F,现设置为7;
}
/*-----------------------------------------------------------------
函数名称: void send_max7219(uchar add,uchar data)
函数功能: MAX7219寄存器操作函数(第三种算法,是实验39中的二种算法的综合)
参    数: add:地址,data:数据
返 回 值: 无
-----------------------------------------------------------------*/
void send_max7219(uchar add,uchar data)
{
uchar ADS,i,j;
PORTC&=0xFD;               //LOAD=0,PC1=0
while(i<16)
{
   if(i<8){ADS=add;} 
   else{ADS=data;}
   for(j=0;j<8;j++)
   {
   PORTC&=0xFB;          //CLOCK=0,PC2=0
      if((ADS&0x80)==0x80)
  PORTC|=0x01;        //DIN=1,PC0=1
      else
  PORTC&=0xFE;        //DIN=0,PB5=0
   PORTC|=0x04;          //CLOCK=1,PC2=1
      ADS=ADS<<1;
   }
   i=i+8;
}
PORTC|=0x02;               //LOAD=1,PC1=1
}
/*-----------------------------------------------------------------
函数名称: void display_date(void)
函数功能: 日期显示函数
参    数: 无
返 回 值: 无
-----------------------------------------------------------------*/
void display_date(void)
{
    conver16_to10(2009); 
    send_max7219(0x01,QIAN);   //1
    send_max7219(0x02,BAI);    //2
    send_max7219(0x03,SHI);    //3
    send_max7219(0x04,GE);     //4
    send_max7219(0x05,0);      //5
    send_max7219(0x06,5);      //6
    send_max7219(0x07,1);      //7
send_max7219(0x08,8);      //9
}
/*-----------------------------------------------------------------
函数名称: void display_birthday(void)
函数功能: 生日显示函数
参    数: 无
返 回 值: 无
-----------------------------------------------------------------*/
void display_birthday(void)
{
  conver16_to10(1985); 
    send_max7219(0x01,QIAN);   //1
    send_max7219(0x02,BAI);    //2
    send_max7219(0x03,SHI);    //3
    send_max7219(0x04,GE);     //4
    send_max7219(0x05,0);      //5
    send_max7219(0x06,2);      //6
    send_max7219(0x07,0);      //7
send_max7219(0x08,9);      //8
}
/*-----------------------------------------------------------------
函数名称: void port_init(void)
函数功能: 端口初始化函数
参    数: 无
返 回 值: 无
-----------------------------------------------------------------*/
void port_init(void)
{
    PORTA=0xFF;
    DDRA=0x00;
    PORTB=0xFF;
    DDRB=0x00;
    PORTC=0x00;
    DDRC=0xFF;
    PORTD=0xFF;
    DDRD=0x00;
}
/*-----------------------------------------------------------------
函数名称: void main(void)
函数功能: 主函数
参    数: 无
返 回 值: 无
-----------------------------------------------------------------*/
void main(void)
{
    port_init();                    //端口初始化
    init_max7219();                 //max7219初始化
    while (1)
    {  
     display_date();             //显示日期
     delay_ms(1000);
     display_birthday();         //显示生日
     delay_ms(1000);
}
}
相关链接:https://bbs.21ic.com/upfiles/img/20095/20095241206544.rar

相关帖子

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

本版积分规则

20

主题

69

帖子

0

粉丝