www.pudn.com > LED-dianzheng.zip > display.h, change:2012-11-18,size:12674b


#define uchar unsigned char 
#define uint unsigned int 
int s0,s1,s2,s3,s4,s5,s6,s7,s8,a0,houra=23,minutea=0; 
 
sbit DS=P2^0;  //定义列选芯片74hc595的数据输入引脚(控制小时) 
sbit SH_CP=P2^1;//定义列选芯片74hc595的数据移位引脚 
sbit ST_CP=P2^2;//定义列选芯片74hc595的数据锁存引脚 
sbit AB=P2^4;//定义控制(第一块16*16点阵)小时行选芯片74hc164的数据输入引脚 
sbit SCK=P2^5;//定义控制行选芯片74hc164的数据锁存引脚 
 
void WriteByte(uchar dat)//74hc595控制小时串入并出处理函数   
{  
 uchar k; 
 for(k=0;k<8;k++)//循环8次输入一个字节数据 
 { 
  dat=dat>>1;//数据向右移一位,使其次高位作为最高位 
  DS=CY;    //将数据移入内部移位寄存器当中 
  SH_CP=0; //跳变沿将字节数据并行输出 
  SH_CP=1; 
 } 
} 
 
void display_hms()	/***********小时、分钟、秒钟处理部分***********/ 
{ 
	s0=hour/10; //把从DS1302获得的实时时间,小时转换为十进制,然后取整,得到小时的十位 
	s1=hour%10; //把从DS1302获得的实时时间,小时转换为十进制,然后取余,得到小时的个位 
	s2=10;			   //s2=10,表示取字库数组中的第11个数据,即冒号: 
	s3=minute/10; //把从DS1302获得的实时时间,分钟转换为十进制,然后取整,得到分钟的个位 
	s4=minute%10; //把从DS1302获得的实时时间,分钟转换为十进制,然后取整,得到分钟的个位 
	s5=10;			   //s5=10,表示取字库数组中的第11个数据,即冒号: 
	s6=second/10; //把从DS1302获得的实时时间,秒钟转换为十进制,然后取整,得到秒钟的十位 
	s7=second%10; //把从DS1302获得的实时时间,秒钟转换为十进制,然后取整,得到秒钟的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[s7][a0]);  //前8列的编码 
		WriteByte(led[s6][a0]);//后8列的编码 
		WriteByte(led[s5][a0]);  //前8列的编码 
		WriteByte(led[s4][a0]);//后8列的编码 
		WriteByte(led[s3][a0]);  //前8列的编码 
		WriteByte(led[s2][a0]);//后8列的编码 
		WriteByte(led[s1][a0]);  //前8列的编码 
		WriteByte(led[s0][a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
 
void display_h(int hour) 
{ 
	s0=hour/10; //把从DS1302获得的实时时间,小时转换为十进制,然后取整,得到小时的十位 
	s1=hour%10; //把从DS1302获得的实时时间,小时转换为十进制,然后取余,得到小时的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[s1][a0]);  //前8列的编码 
		WriteByte(led[s0][a0]);//后8列的编码 
		WriteByte(maohao[2*a0+1]);  //前8列的编码 
		WriteByte(maohao[2*a0]);//后8列的编码 
		WriteByte(shi[2*a0+1]);  //前8列的编码 
		WriteByte(shi[2*a0]);//后8列的编码 
		WriteByte(tiao[2*a0+1]);  //前8列的编码 
		WriteByte(tiao[2*a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
 
void display_m(int minute) 
{ 
	s3=minute/10; //把从DS1302获得的实时时间,秒钟转换为十进制,然后取整,得到秒钟的十位 
	s4=minute%10; //把从DS1302获得的实时时间,秒钟转换为十进制,然后取整,得到秒钟的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[s4][a0]);  //前8列的编码 
		WriteByte(led[s3][a0]);//后8列的编码 
		WriteByte(maohao[2*a0+1]);  //前8列的编码 
		WriteByte(maohao[2*a0]);//后8列的编码 
		WriteByte(fen[2*a0+1]);  //前8列的编码 
		WriteByte(fen[2*a0]);//后8列的编码 
		WriteByte(tiao[2*a0+1]);  //前8列的编码 
		WriteByte(tiao[2*a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
 
void display_s(int second) 
{ 
	s6=second/10; //把从DS1302获得的实时时间,秒钟转换为十进制,然后取整,得到秒钟的十位 
	s7=second%10; //把从DS1302获得的实时时间,秒钟转换为十进制,然后取整,得到秒钟的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[s7][a0]);  //前8列的编码 
		WriteByte(led[s6][a0]);//后8列的编码 
		WriteByte(maohao[2*a0+1]);  //前8列的编码 
		WriteByte(maohao[2*a0]);//后8列的编码 
		WriteByte(miao[2*a0+1]);  //前8列的编码 
		WriteByte(miao[2*a0]);//后8列的编码 
		WriteByte(tiao[2*a0+1]);  //前8列的编码 
		WriteByte(tiao[2*a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
 
/* 
void display_y(int year) 
{ 
	s0=year/10; //把从DS1302获得的实时时间,年份转换为十进制,然后取整,得到年份的十位 
	s1=year%10; //把从DS1302获得的实时时间,年份转换为十进制,然后取余,得到年份的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[12][a0]);  //前8列的编码 
		WriteByte(led[12][a0]);//后8列的编码 
		WriteByte(led[11][a0]);  //前8列的编码 
		WriteByte(led[12][a0]);//后8列的编码 
		WriteByte(led[12][a0]);  //前8列的编码 
		WriteByte(led[11][a0]);//后8列的编码 
		WriteByte(led[s1][a0]);  //前8列的编码 
		WriteByte(led[s0][a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
*/ 
void display_month(int month) 
{ 
	s3=month/10; //把从DS1302获得的实时时间,月份转换为十进制,然后取整,得到月份的个位 
	s4=month%10; //把从DS1302获得的实时时间,月份转换为十进制,然后取整,得到月份的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[s4][a0]); 
		WriteByte(led[s3][a0]); 
		WriteByte(maohao[2*a0+1]);  //前8列的编码 
		WriteByte(maohao[2*a0]);//后8列的编码 
 
		WriteByte(yue[2*a0+1]);  //前8列的编码 
		WriteByte(yue[2*a0]);//后8列的编码 
		WriteByte(tiao[2*a0+1]);  //前8列的编码 
		WriteByte(tiao[2*a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
 
void display_d(int date) 
{ 
	s6=date/10; //把从DS1302获得的实时时间,日期转换为十进制,然后取整,得到日期的十位 
	s7=date%10; //把从DS1302获得的实时时间,日期转换为十进制,然后取整,得到日期的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[s7][a0]); 
		WriteByte(led[s6][a0]); 
		WriteByte(maohao[2*a0+1]);  //前8列的编码 
		WriteByte(maohao[2*a0]);//后8列的编码 
		WriteByte(ri[2*a0+1]);  //前8列的编码 
		WriteByte(ri[2*a0]);//后8列的编码 
		WriteByte(tiao[2*a0+1]);  //前8列的编码 
		WriteByte(tiao[2*a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
 
void display_houra(int houra) 
{ 
	s6=houra/10; //把从DS1302获得的实时时间,日期转换为十进制,然后取整,得到日期的十位 
	s7=houra%10; //把从DS1302获得的实时时间,日期转换为十进制,然后取整,得到日期的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[s7][a0]); 
		WriteByte(led[s6][a0]); 
		WriteByte(shi[2*a0+1]);  //前8列的编码 
		WriteByte(shi[2*a0]);//后8列的编码 
		WriteByte(zhong[2*a0+1]);  //前8列的编码 
		WriteByte(zhong[2*a0]);//后8列的编码 
		WriteByte(nao[2*a0+1]);  //前8列的编码 
		WriteByte(nao[2*a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
 
void display_minutea(int minutea) 
{ 
	s6=minutea/10; //把从DS1302获得的实时时间,日期转换为十进制,然后取整,得到日期的十位 
	s7=minutea%10; //把从DS1302获得的实时时间,日期转换为十进制,然后取整,得到日期的个位 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[s7][a0]); 
		WriteByte(led[s6][a0]); 
		WriteByte(fen[2*a0+1]);  //前8列的编码 
		WriteByte(fen[2*a0]);//后8列的编码 
		WriteByte(zhong[2*a0+1]);  //前8列的编码 
		WriteByte(zhong[2*a0]);//后8列的编码 
		WriteByte(nao[2*a0+1]);  //前8列的编码 
		WriteByte(nao[2*a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
} 
 
void display() 
{ 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(le[2*a0+1]); 
		WriteByte(le[2*a0]); 
		WriteByte(dao[2*a0+1]);  //前8列的编码 
		WriteByte(dao[2*a0]);//后8列的编码 
		WriteByte(zhong[2*a0+1]); 
		WriteByte(zhong[2*a0]); 
		WriteByte(nao[2*a0+1]);  //前8列的编码 
		WriteByte(nao[2*a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
	   //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	}		 
} 
void display_ymd()/***********年份、月份、日期、星期处理部分***********/ 
{ 
	s0=year/10; //把从DS1302获得的实时时间,年份转换为十进制,然后取整,得到年份的十位 
	s1=year%10; //把从DS1302获得的实时时间,年份转换为十进制,然后取余,得到年份的个位	 
	s3=month/10; //把从DS1302获得的实时时间,月份转换为十进制,然后取整,得到月份的个位 
	s4=month%10; //把从DS1302获得的实时时间,月份转换为十进制,然后取整,得到月份的个位 
	s6=date/10; //把从DS1302获得的实时时间,日期转换为十进制,然后取整,得到日期的十位 
	s7=date%10; //把从DS1302获得的实时时间,日期转换为十进制,然后取整,得到日期的个位 
	s8=week%10; 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		if(s8==1) 
		{ 
			WriteByte(yi[2*a0+1]); 
			WriteByte(yi[2*a0]); 
		} 
		if(s8==2) 
		{ 
			WriteByte(er[2*a0+1]); 
			WriteByte(er[2*a0]); 
		} 
		if(s8==3) 
		{ 
			WriteByte(shan[2*a0+1]); 
			WriteByte(shan[2*a0]); 
		} 
		if(s8==4) 
		{ 
			WriteByte(si[2*a0+1]); 
			WriteByte(si[2*a0]); 
		} 
		if(s8==5) 
		{ 
			WriteByte(wu[2*a0+1]); 
			WriteByte(wu[2*a0]); 
		} 
		if(s8==6) 
		{ 
			WriteByte(liu[2*a0+1]); 
			WriteByte(liu[2*a0]); 
		} 
		if(s8==7) 
		{ 
			WriteByte(qii[2*a0+1]); 
			WriteByte(qii[2*a0]); 
		} 
		WriteByte(QQI[2*a0+1]); 
		WriteByte(QQI[2*a0]); 
		WriteByte(XING[2*a0+1]); 
		WriteByte(XING[2*a0]); 
		WriteByte(ri[2*a0+1]); 
		WriteByte(ri[2*a0]); 
		WriteByte(led[s7][a0]);  //前8列的编码 
		WriteByte(led[s6][a0]);//后8列的编码 
		WriteByte(yue[2*a0+1]); 
		WriteByte(yue[2*a0]); 
		WriteByte(led[s4][a0]);  //前8列的编码 
		WriteByte(led[s3][a0]);//后8列的编码 
		WriteByte(nian[2*a0+1]); 
		WriteByte(nian[2*a0]); 
		WriteByte(led[s1][a0]);  //前8列的编码 
		WriteByte(led[s0][a0]);//后8列的编码 
		WriteByte(led[0][a0]);  //前8列的编码 
		WriteByte(led[2][a0]);//后8列的编码 
		SCK=1;//高电平时,此时选中第d行(低电平,三极管导通) 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
		ST_CP=0; 
		ST_CP=1;//跳变沿输出前后8列的编码		 
	} 
}