当前位置:文档之家› 数码管显示时间及点阵显示字符

数码管显示时间及点阵显示字符

//数码管显示时间及点阵显示字符#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//定义Max7219端口#define DUAN P0 //P0口控制段#define WEI P2 //P2口控制位sbit k_hour=P1^0; // 更改小时按键sbit k_min=P1^1; // 更改分钟按键sbit k_sec=P1^2; // 更改秒按键//定义数码管端口sbit Max7219_pinCLK = P1^2;sbit Max7219_pinCS = P1^1;sbit Max7219_pinDIN = P1^0;//Max7219位定义unsigned char key; //P3按键扫描(执行模块控制)code uchar seg7code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF }; //显示段码数码管字跟uchar wei[8]={0XFE,0XFD,0XFB,0XF7,0XEf,0XDf,0XBf,0X7f}; //位的控制端uchar numb[8]; //定义字符串uint sec=0,min,hour;//数码管初始定义uchar code disp2[7][8]={{0x00,0x3E,0x2A,0xFF,0xAA,0xBE,0xC0,0x00}, //电{0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00}, //一{0x00,0x00,0x1E,0x20,0x40,0x20,0x1E,0x00}, //V{0x00,0x00,0x4E,0x4A,0x4A,0x7A,0x00,0x00}, //5{0x00,0x00,0x42,0x7E,0x42,0x00,0x00,0x00}, //I{0x00,0x0C,0x1E,0x3C,0x3C,0x1E,0x0C,0x00}, //love{0x00,0x00,0x3E,0x40,0x40,0x3E,0x00,0x00}, //U};char flag;//定义点阵显示字符void Delay_xms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<300;j++);}//公用的延时程序//功能:向MAX7219(U3)写入字节//入口参数:DATA//出口参数:无void Write_Max7219_byte(uchar DATA){uchar i;Max7219_pinCS=0;for(i=8;i>=1;i--){Max7219_pinCLK=0;Max7219_pinDIN=DATA&0x80;DATA=DATA<<1;if(flag)Delay_xms(500);Max7219_pinCLK=1;}}//功能:向MAX7219写入数据//入口参数:address、dat//出口参数:无//说明:void Write_Max7219(uchar address,uchar dat){Max7219_pinCS=0;Write_Max7219_byte(address); //写入地址,即数码管编号Write_Max7219_byte(dat); //写入数据,即数码管显示数字Max7219_pinCS=1;}void Init_MAX7219(void){Write_Max7219(0x09, 0x00); //译码方式:BCD码Write_Max7219(0x0a, 0x03); //亮度Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 }void t_to_dis(){numb[0]=hour/10; //显示小时十位numb[1]=hour%10; //显示小时个位numb[2]=10; //显示横杠numb[3]=min/10; //显示分十位numb[4]=min%10; //显示分个位numb[5]=10; //显示横杠numb[6]=sec/10; //显示秒十位numb[7]=sec%10; //显示秒个位}//数码管求值函数void display()//显示函数{//数码管数据转换P2=0XFF;P0=seg7code[numb[0]];P2=wei[0];Delay_xms(80);P2=0XFF;P0=seg7code[numb[1]];P2=wei[1];Delay_xms(80);P2=0XFF;P0=seg7code[numb[2]];P2=wei[2];Delay_xms(80);P2=0XFF;P0=seg7code[numb[3]];P2=wei[3];Delay_xms(80);P2=0XFF;P0=seg7code[numb[4]];P2=wei[4];Delay_xms(80);P2=0XFF;P0=seg7code[numb[5]];P2=wei[5];Delay_xms(80);P2=0XFF;P0=seg7code[numb[6]];P2=wei[6];Delay_xms(80);P2=0XFF;P0=seg7code[numb[7]];P2=wei[7];Delay_xms(80);P2=0XFF;}void Display1(){//0P2=0X00;P0=0xc0;Delay_xms(200);//1P2=0X00;P0=0xf9;Delay_xms(200);//2P2=0X00;P0=0xa4;Delay_xms(200);//3P2=0X00;P0=0xb0;Delay_xms(200);//4P2=0X00;P0=0x99;Delay_xms(200);//5P2=0X00;P0=0x92;Delay_xms(200);//6P2=0X00;P0=0x82;Delay_xms(200);//7P2=0X00;P0=0xf8;Delay_xms(200);//8P2=0X00;P0=0x80;Delay_xms(200);//9P2=0X00;P0=0x90;Delay_xms(200); }//4位显示0~9void Display2(){P2=0XFE;P0=0x00;Delay_xms(200);P2=0XFD;P0=0x00;Delay_xms(200);P2=0XFB;P0=0x00;Delay_xms(200);P2=0XF7;P0=0x00;Delay_xms(200);P2=0XEF;P0=0x00;Delay_xms(200);P2=0XDF;P0=0x00;Delay_xms(200);P2=0XBF;P0=0x00;Delay_xms(200);P2=0X7F;P0=0x00;Delay_xms(200);}//数码管移位显示8void SetTime(){if(k_hour==0){hour++;while(!k_hour);if(hour>=24) hour=0;}if(k_min==0){min++;while(!k_min);if(min>=60) min=0;}if(k_sec==0){sec++;while(!k_sec);if(sec>=60) sec=0;}}//数码管按键函数void timer1(void)interrupt 3 //每一秒增加一{uchar i;TH1=0X3c;//定时初值TL1=0Xaf;//定时初值i++;if(i>=20){i=0;sec++;//秒加1if(sec>=60){sec=0; //秒清零min++; //60秒后分加1if(min>=60){min=0; //分清零hour++; //60分后时加1if(hour>=24)hour=0; //时清零}}}}//数码管中断函数void InitInterrupt(){TMOD=0X10;//定义定时器工作方式TH1=0X3c;TL1=0Xaf;ET1=1;TR1=1;//开定时器EA=1;//开中断}//数码管中断初始化void main1(){uchar m,n;Delay_xms(500);P2=0xaa;Delay_xms(500);P2=0x55;Delay_xms(500);flag=0;Init_MAX7219();flag=0;while(1){for(m=0;m<7;m++){for(n=0;n<9;n++)Write_Max7219(n,disp2[m][n-1]);Delay_xms(500);}}}//点阵Main函数void main2(){InitInterrupt(); //中断初始化Display1();Display2();while(1){SetTime();//按键函数t_to_dis();//确定秒分时值display(); //显示秒分时值}}//数码管Main函数void ext_int0(void) interrupt 0 using 1{if(P3!=0xff){Delay_xms(10);key=P3;}while(P3!=0xff);switch(key){case 0xfe:main1(); break;case 0xfd:main2(); break;default:break;}}//判断有按键按下,所控制的程序void main(){IT0=1; //设定为边沿触发方式IP=0x01; //置外部中断0为高优先级中断P3=0xff; //置P3口为输入态EA=1; //开CPU中断EX0=1; //开外部中断0while(1); //等待外部中断}。

相关主题