原创
ATmega16_App_V1.0开发板范例3:MAX7219驱动8位共阴数码管实验
一、
程序结构
二、
仿真效果
三、程序源码
main.c
- /*******************************************************************************
- Platform: ATmega16_App_V1.0开发板(http://bbs.armavr.com)
- Project : 范例3:MAX7219驱动8位共阴数码管实验
- Clock F : 内部8M
- Software: ICCAVR7.14C+proteus7.5
- Author : 林夕依然
- BBS : http://bbs.armavr.com
- Version : 09.11.03
- 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;
- delay_ms(10);
- }
- /*-----------------------------------------------------------------
- 函数名称: void send_max7219(uchar add,uchar data)
- 函数功能: MAX7219寄存器操作函数
- 参 数: add:地址,data:数据
- 返 回 值: 无
- -----------------------------------------------------------------*/
- void send_max7219(uchar add,uchar data)
- {
- uchar ADS,i,j;
- PORTC&=0xF7; //LOAD=0,PC3=0
- while(i<16)
- {
- if(i<8){ADS=add;}
- else{ADS=data;}
- for(j=0;j<8;j++)
- {
- PORTC&=0xEF; //CLOCK=0,PC4=0
- if((ADS&0x80)==0x80)
- PORTC|=0x04; //DIN=1,PC2=1
- else
- PORTC&=0xFB; //DIN=0,PC2=0
- PORTC|=0x10; //CLOCK=1,PC4=1
- ADS=ADS<<1;
- }
- i=i+8;
- }
- PORTC|=0x08; //LOAD=1,PC3=1
- }
- /*-----------------------------------------------------------------
- 函数名称: void display_date(void)
- 函数功能: 日期显示函数
- 参 数: 无
- 返 回 值: 无
- 说 明:本次开发板两只数码管位置搞反,改版时调换,本次使用程序处理
- -----------------------------------------------------------------*/
- void display_date(void)
- {
- conver16_to10(2009);
- send_max7219(0x05,QIAN); //5
- send_max7219(0x06,BAI); //6
- send_max7219(0x07,SHI); //7
- send_max7219(0x08,0x80|GE);//8,显示小数点
- send_max7219(0x01,1); //1
- send_max7219(0x02,0x80|1); //2,显示小数点
- send_max7219(0x03,0); //3
- send_max7219(0x04,3); //4
- }
- /*-----------------------------------------------------------------
- 函数名称: void display_birthday(void)
- 函数功能: 论坛生日显示函数
- 参 数: 无
- 返 回 值: 无
- 说 明:本次开发板两只数码管位置搞反,改版时调换,本次使用程序处理
- -----------------------------------------------------------------*/
- void display_birthday(void)
- {
- conver16_to10(2009);
- send_max7219(0x05,QIAN); //5
- send_max7219(0x06,BAI); //6
- send_max7219(0x07,SHI); //7
- send_max7219(0x08,0x80|GE);//8,显示小数点
- send_max7219(0x01,0); //1
- send_max7219(0x02,0x80|3); //2,显示小数点
- send_max7219(0x03,2); //3
- send_max7219(0x04,7); //4
- }
- /*-----------------------------------------------------------------
- 函数名称: 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)
- {
- delay_ms(200); //延时,待上电稳定
- port_init(); //端口初始化
- init_max7219(); //max7219初始化
- while (1)
- {
- display_date(); //显示日期
- delay_ms(1000);
- display_birthday(); //显示生日
- delay_ms(1000);
- }
- }
四、完整项目文件
https://static.assets-stash.eet-china.com/album/old-resources/2009/11/5/e4a66aae-68c9-4b13-9c72-3ba5a8449259.rar
用户1294761 2011-1-20 10:08
用户183207 2007-4-28 20:28