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