/******************************************************************************* 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 |