最主要是MAX7219与单片机的数据传输上有问题.开机就只能显示000000 大家帮帮忙..谢谢了...dh_zeng@163.com
/***************************************************************/ // 6位LED数字钟程序
// 系统所使用的器件:AT89S52(晶震频率:11.0592MHZ) // 采用MAX7219驱动6位LED
/***************************************************************/
#include "reg52.h" /*头文件*/ #include "stdio.h" #include "intrins.h" #define char unsigned char char data timedata[6]={0x00,0x00,0x00,0x00,0x00,0x00}; //计时单元数据初值 char data dis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0a,0x00}; //显示单元数据 char data con1s=0x00,con04s=0x00,con=0x00; //秒定时用 sbit key0=P2^5; //调时按键 sbit key1=P2^4; //加1操作 sbit key2=P2^3; //减1操作 // /***************/ //1ms延时函数// /***************/ delay1ms(int t) { int i,j; for(i=0;i for(j=0;j<120;j++); } /***************/ //键扫描子函数// /***************/ keyscan() { EA=0; if(key0==0) { delay1ms(10); while(key0==0); if(dis[con]==10) {dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];} con++;TR0=0;ET0=0;TR1=1;ET1=1; if(con>=6) {con=0;TR1=0;ET1=0;TR0=1;ET0=1;} } // if(con!=0) { if(key1==0) { delay1ms(10); while(key1==0); timedata[con]++; if(timedata[con]>=10) {timedata[con]=0;} dis[con]=timedata[con];dis[6]=0x0a; } } // if(con!=0) { if(key2==0) { delay1ms(10); while(key2==0); if(timedata[con]==0) {timedata[con]=0x09;} else{timedata[con]--;} dis[con]=timedata[con];dis[6]=0x0a; } } EA=1; } // /***************/ //显示函数// /***************/ /*预编译定义*/ sbit cs="P2"^1; /*键盘显示控制线定义*/ sbit clk="P2"^0; sbit din="P2"^2; scan() { /*内部函数说明*/ void init(void);//初始化max7219 void dspclr(void); void send(char reg_addr,char reg_data);
//各控制寄存器的地址 #define no_op 0 //不工作寄存器地址,用于级联 #define disp0 1 //disp1数码管显示控制寄存器 #define disp1 2 //disp2数码管显示控制寄存器 #define disp2 3 //disp3数码管显示控制寄存器 #define disp3 4 //disp4数码管显示控制寄存器 #define disp4 5 //disp5数码管显示控制寄存器 #define disp5 6 //disp6数码管显示控制寄存器 #define decode_mode 9 //译码方式寄存器地址 #define intensity 10 //显示亮度控制寄存器地址 #define scan_limit 11 //扫描范围控制寄存器地址 #define shutdown 12 //调电模式控制寄存器地址 #define disptest 15 //显示测试控制寄存器地址 SP=0x60; init(); send(disp5,0);send(disp4,0);send(disp3,0); send(disp2,0);send(disp1,0);send(disp0,0); // timedata[3]上显示4,timedata[0]上显示1,其他依次类 while(1); send(disp5,timedata[6]);send(disp4,timedata[5]);send(disp3,timedata[4]); send(disp2,timedata[3]);send(disp1,timedata[2]);send(disp0,timedata[1]); }
/*******************************************************/ /*功能:初始化设置MAX7219*/ void init(void) { delay1ms(1012); send(intensity,0x0a);//设置显示亮度为最亮 send(scan_limit,0x05);//设置扫描6位数码管 send(decode_mode,0xff);//设置译码方式 send(shutdown,0x01);//设置工作方式为正常工作 send(disptest,0x00);//关闭显示测试模式 }
/*****************************************************************************************/
/*******************************************************/ /*功能:给MAX7219发送数据或命令
*/ void send(char reg_addr,char reg_data) { char data i; cs=0; clk=0; for(i=8;i!=0;i--) { if((reg_addr&0x80)==0x80) din=1; else din=0; reg_addr=reg_addr<<1; clk=1; _nop_(); clk=0; } for(i=8;i!=0;i--) { if((reg_data&0x80)==0x80) din=1; else din=0; reg_data=reg_data<<1; clk=1; _nop_(); clk=0; } din=0; cs=1;
} /***************/ //初使化函数// /***************/ clearmen() { int i; for(i=0;i<6;i++) {dis=timedata;} TH0=0x3C;TL0=0xB0; //50ms定时初值(T0使用) TH1=0x3C;TL1=0xB0; //50ms定时初值(T1使用) TMOD=0x11;ET0=1;ET1=1;TR1=0;TR0=1;EA=1; } /***************/ //主函数// /***************/ main() { clearmen(); while(1) { scan(); keyscan(); } } /********************/ //1s中断处理函数// /********************/ void time_intt0(void) interrupt 1 { ET0=0;TR0=0;TH0=0x3C;TL0=0xB0;TR0=1; con1s++; if(con1s==20) {con1s=0x00; timedata[0]++; if(timedata[0]>=10) { timedata[0]=0;timedata[1]++; if(timedata[1]>=6) { timedata[1]=0;timedata[2]++; if(timedata[2]>=10) { timedata[2]=0;timedata[3]++; if(timedata[3]>=6) { timedata[3]=0;timedata[4]++; if(timedata[4]>=10) { timedata[4]=0;timedata[5]++; } if(timedata[5]==2) { if(timedata[4]==4) { timedata[4]=0;timedata[5]=0; } } } } } } dis[0]=timedata[0];dis[1]=timedata[1];dis[2]=timedata[2]; dis[3]=timedata[3];dis[4]=timedata[4];dis[5]=timedata[5]; } ET0=1; } /********************/ //0.4s闪烁中断函数// /********************/ void time_intt1(void) interrupt 3 { EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1; con04s++; if(con04s==8) { con04s=0x00; dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7]; } EA=1; } //**********************************OVER********************************//<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
文章评论(0条评论)
登录后参与讨论