⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24m点阵时钟.c

📁 基于C51的点阵时钟显示仿真电路和源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		}
		
	}
}
void Show_Move_Word(uchar code *WORDS[][8]){
	int m,i;
	while(1){
	for(m=0;m<6;m++){	//若要上下移动 m=16
		//hang = 0;
		for(i=0;i<16;i++){
			Put_Hdispram();	//把第i行放入行缓冲
			RL_Move();	//是否要左右移动
			Show_Line();
			//delay();	//看需要
		}
	//UD_Move();	//是否要上下移动
	}
	//========================================
	//测试左移右移	切换时有跳变!!
//	if(MSG_MV){
		move_times++;
		if((move_times == 9) && (MSG_MV == MSG_MV_L)){
			move_times = 1;
			Put_Wdispram(WORDS);
			start_word++;
			switch(STATE){
				case STA_gTEMP:
					Read_Temperature();
					Disp_Temperature();				   //
					Put_gTEMP();	  //
					if(start_word > (sizeof(TMP_WORDS)/16 - 8))
						MSG_MV = MSG_MV_R;
					break;
				case STA_gWORD:
					if(start_word > (sizeof(MY_WORDS)/16 - 8))
						MSG_MV = MSG_MV_R;
				default:
					break;
			}
		if(start_word > (sizeof(TMP_WORDS)/16 - 4))
				MSG_MV = MSG_MV_R;
		}
		else if((move_times == 9) && (MSG_MV == MSG_MV_R)){
			move_times = 1;
			Put_Wdispram(WORDS);  // 
			start_word-- ;
			switch(STATE){
				case STA_gTEMP:
					Disp_Temperature();				   //
					Put_gTEMP();
						break;
				default:
					break;
			}
			if(start_word < 1){
				MSG_MV = MSG_MV_L;
				return;
			}
		}
//	}
		}
}
void Show_All_Word(){
	int m,i;
	//MSG_MV = MSG_MV_L;
	for(start_word = 0;start_word < 8;start_word++){
		for(move_times = 0; move_times < 8;move_times++){
			for(m=0;m<4;m++){	//若要上下移动 m=16
				for(i=0;i<16;i++){
					Put_Hdispram();	//把第i行放入行缓冲
					RL_Move();	//是否要左右移动
					Show_Line();
				}
			}
		}
	}
}

void delay()
{
	uint i;
	for(i=0;i<40;i++);
}			 
	
//------------------------------------
//----------字发送子程序-----------
	void SendByte(void)
		{
		   uchar m;
		   for(m=0;m<8;m++)
		   {
		   		CLK = 0;
				Red = (SendData & 0x80);		  //红屏显示 
		    //	Greed =  (SendData & 0x80);		  //绿屏显示 
			  	SendData =SendData<<1;			
				CLK = 1;	  //移位时钟上升沿 
		   }
		}
 //-----------------------------------
//----------行扫描子程序-------------
	   void RowsCan(void)
	   {
			P2 = P2 & 0xf0;
			P2 = P2 | hang;
			hang++;
			if (hang>=16) 
			{ 
				hang =0x00;
			}
		}

		void initial(void)
	   	{
	  		OE = 1;
			Red = 1;
			Greed = 1;
			SendData = 0x00;
			hang = 0x00;
							
	 	}
/*****************************************************
函数功能:延时若干微秒
入口参数:n
***************************************************/ 
void delaynus(unsigned char n)
{
 unsigned char i;
// for(i=0;i<n;i++)
      ;
}
/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/ 
void Write1302(unsigned char dat)
{
  unsigned char i; 
  SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  delaynus(2);       //稍微等待,使硬件做好准备
  for(i=0;i<8;i++)      //连续写8个二进制位数据
    {
	    DATA=dat&0x01;    //取出dat的第0位数据写入1302
		delaynus(2);       //稍微等待,使硬件做好准备
		 SCLK=1;           //上升沿写入数据
		 delaynus(2);      //稍微等待,使硬件做好准备
		 SCLK=0;           //重新拉低SCLK,形成脉冲
		 dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
	  }
	
 }
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/ 
void WriteSet1302(unsigned char Cmd,unsigned char dat)
 {
   RST=0;           //禁止数据传递
   SCLK=0;          //确保写数居前SCLK被拉低
	RST=1;           //启动数据传输
	delaynus(2);     //稍微等待,使硬件做好准备
	Write1302(Cmd);  //写入命令字
	Write1302(dat);  //写数据
	SCLK=1;          //将时钟电平置于已知状态
	RST=0;           //禁止数据传递
 }
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/ 
 unsigned char Read1302(void)
 {
   unsigned char i,dat;
	delaynus(2);       //稍微等待,使硬件做好准备
	for(i=0;i<8;i++)   //连续读8个二进制位数据
	 {
	   dat>>=1;       //将dat的各数据位右移1位,因为先读出的是字节的最低位
		if(DATA==1)    //如果读出的数据是1
		 dat|=0x80;    //将1取出,写在dat的最高位
		 SCLK=1;       //将SCLK置于高电平,为下降沿读出
		 delaynus(2);  //稍微等待
		 SCLK=0;       //拉低SCLK,形成脉冲下降沿
		 delaynus(2);  //稍微等待
	  }	 
  return dat;        //将读出的数据返回
}  
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/ 
unsigned char  ReadSet1302(unsigned char Cmd)
 {
  unsigned char dat;
  RST=0;                 //拉低RST
  SCLK=0;                //确保写数居前SCLK被拉低
  RST=1;                 //启动数据传输
  Write1302(Cmd);       //写入命令字
  dat=Read1302();       //读出数据
  SCLK=1;              //将时钟电平置于已知状态
  RST=0;               //禁止数据传递
  return dat;          //将读出的数据返回
}
/*****************************************************
函数功能: 1302进行初始化设置
***************************************************/ 
void Init_DS1302(void)
{	
  unsigned char flag;
   
    flag= ReadSet1302(0x81);
	if(flag&0x80)	{      //判断时钟芯片是否关闭
   WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
   WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根据写秒寄存器命令字,写入秒的初始值
	WriteSet1302(0x82,((18/10)<<4|(18%10)));   //根据写分寄存器命令字,写入分的初始值
	WriteSet1302(0x84,((21/10)<<4|(21%10))); //根据写小时寄存器命令字,写入小时的初始值
	WriteSet1302(0x86,((23/10)<<4|(23%10))); //根据写日寄存器命令字,写入日的初始值
	WriteSet1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值
	//WriteSet1302(0x8A,2);
	WriteSet1302(0x8c,((10/10)<<4|(10%10)));   //根据写小时寄存器命令字,写入小时的初始值
		WriteSet1302(0x90,0xa5); 
	WriteSet1302(0x8E,0x80);
  }
  //如果不想每次都初始化时间,也就是掉电后还想让时钟继续走时的话 就用上面的语句


  /*--------------------这是每次都初始化的语句-----------------*/
    /* WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
   WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根据写秒寄存器命令字,写入秒的初始值
	WriteSet1302(0x82,((18/10)<<4|(18%10)));   //根据写分寄存器命令字,写入分的初始值
	WriteSet1302(0x84,((21/10)<<4|(21%10))); //根据写小时寄存器命令字,写入小时的初始值
	WriteSet1302(0x86,((23/10)<<4|(23%10))); //根据写日寄存器命令字,写入日的初始值
	WriteSet1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值
	//WriteSet1302(0x8A,2);
	WriteSet1302(0x8c,((10/10)<<4|(10%10)));   //根据写小时寄存器命令字,写入小时的初始值
		WriteSet1302(0x90,0xa5); 
	WriteSet1302(0x8E,0x80);
	*/



}
void write_time1302(){
    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
    WriteSet1302(0x80,Time.Second);   //根据写秒寄存器命令字,写入秒的初始值
	WriteSet1302(0x82,Time.Minute);   //根据写分寄存器命令字,写入分的初始值
	WriteSet1302(0x84,Time.Hour); //根据写小时寄存器命令字,写入小时的初始值
	WriteSet1302(0x86,Time.Day); //根据写日寄存器命令字,写入日的初始值
	WriteSet1302(0x88,Time.Month); //根据写月寄存器命令字,写入月的初始值
	WriteSet1302(0x8A,Time.Week);
	WriteSet1302(0x8c,Time.Year);   //根据写小时寄存器命令字,写入小时的初始值
	//	WriteSet1302(0x90,0xa5); 
	//WriteSet1302(0x8E,0x80);	
}

//读时间
void Read_TIME(){ 

	RST=0;                 //拉低RST
  	SCLK=0;                //确保写数居前SCLK被拉低
  	RST=1;                 //启动数据传输
  	Write1302(0xbf);       //写入命令字
	Time.Second = Read1302() & 0x7f;
	Time.Minute = Read1302() & 0x7f; 
	Time.Hour = Read1302() & 0x7f;
	Time.Day = Read1302() & 0x7f; 
	Time.Month = Read1302() & 0x7f;  
 	Time.Week= Read1302() & 0x7f; 
	Time.Year = Read1302() & 0x7f;
	SCLK=1;          //将时钟电平置于已知状态
	RST=0;           //禁止数据传递
	 
	/*unsigned char ReadValue;   //储存从1302读取的数据
	ReadValue = ReadSet1302(0x81);   //从秒寄存器读数据
	Time.Second =ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F);//将读出数据转化
	 ReadValue = ReadSet1302(0x83);  //从分寄存器读
     Time.Minute = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
     ReadValue = ReadSet1302(0x85);  //从时寄存器读
     Time.Hour = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
     ReadValue = ReadSet1302(0x87);  //从分寄存器读
     Time.Day = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
	 ReadValue = ReadSet1302(0x89);  //从分寄存器读
     Time.Month = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
	ReadValue = ReadSet1302(0x8B);  //从时寄存器读
	Time.Week= ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
	 ReadValue = ReadSet1302(0x8d);  //从分寄存器读									   
     Time.Year = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化  
   
   */ }

void Put_Adispram(uchar a){
	uchar i;
	//第一屏"今天是:"
	disword[a+1] = &NO_WORDS[12][0];	//空格
	for(i=0;i<6;i++)
		disword[a+i+2] = &TIME_WORDS[i][0];
	disword[a+8] = &NO_WORDS[11][0];	//":"
	//第二屏
	//disword[4] = &TIME_WORDS[];
		
}
	
//将年份放入到显示缓存
//需要参数:缓冲区首地址下标
void Put_Ydispram(uchar i){
	disword[i+1] = &NO_WORDS[12][0];
	if(Time.Year < 30 && !HIDE){
		disword[i+2] = &NO_WORDS[2][0];
		disword[i+3] = &NO_WORDS[0][0];
		}
	else if(!HIDE){
		disword[i+2] = &NO_WORDS[1][0];
		disword[i+3] = &NO_WORDS[9][0];
		}
	disword[i+4] = &NO_WORDS[Time.Year>>4][0];
	disword[i+5] = &NO_WORDS[Time.Year&0x0f][0];
	disword[i+6] = &TIME_WORDS[6][0];
	disword[i+7] = &TIME_WORDS[7][0];	//年
	disword[i+8] = &NO_WORDS[12][0];
}	
//将星期放入到显示缓存
//参数:缓冲区首地址下标
void Put_Kdispram(uchar i){
	disword[i+1] = &NO_WORDS[12][0]; 		
	disword[i+2] = &TIME_WORDS[12][0];		
	disword[i+3] = &TIME_WORDS[13][0];	//星期		
	disword[i+4] = &TIME_WORDS[14][0]; 		
	disword[i+5] = &TIME_WORDS[15][0];
	if(STATE== STA_CHG &&HIDE){
		disword[i+6] = &NO_WORDS[12][0];		//
		disword[i+7] = &NO_WORDS[12][0];  		//
		}
	else{
		disword[i+6] = &WEEK_WORDS[Time.Week*2-2][0];		//
		disword[i+7] = &WEEK_WORDS[Time.Week*2-1][0];  		//
		}
	disword[i+8] = &NO_WORDS[12][0]; 		
}

//将日期放入到显示缓存
//参数:缓冲区首地址下标
void Put_Ddispram(uchar i){
	disword[i+1] = &NO_WORDS[Time.Month>>4][0]; 		//小时高位
	disword[i+2] = &NO_WORDS[ Time.Month&0x0f][0];		//小时地位
	disword[i+3] = &TIME_WORDS[8][0];		//-
	disword[i+4] = &TIME_WORDS[9][0]; 		//分钟高位
	disword[i+5] = &NO_WORDS[ Time.Day>>4][0];		//分钟地位
	disword[i+6] = &NO_WORDS[Time.Day&0x0f][0];		//-
	disword[i+7] = &TIME_WORDS[10][0];  		//秒高位
	disword[i+8] = &TIME_WORDS[11][0]; 		//秒地位
}

//将时间放入到显示缓存
//参数:缓冲区首地址下标
void Put_Tdispram(uchar i){
	disword[i+1] = &NO_WORDS[Time.Hour>>4][0]; 		//小时高位
	disword[i+2] = &NO_WORDS[ Time.Hour&0x0f][0];		//小时地位
	disword[i+3] = &NO_WORDS[ 11 ];		//-
	disword[i+4] = &NO_WORDS[Time.Minute>>4][0]; 		//分钟高位
	disword[i+5] = &NO_WORDS[ Time.Minute&0x0f][0];		//分钟地位
	disword[i+6] = &NO_WORDS[ 11 ];		//-
	disword[i+7] = &NO_WORDS[Time.Second>>4][0]; 		//秒高位
	disword[i+8] = &NO_WORDS[ Time.Second&0x0f][0];		//秒地位
}
//===================================
//*****关于温度检测部分*****
void Put_gTEMP(){
//	uchar i;
//	Put_Wdispram(TMP_WORDS,0);
	disword[6] = &NO_WORDS[temp_ram[3]][0]; 		//百位
	disword[7] = &NO_WORDS[temp_ram[2]][0];		//十位
	disword[8] = &NO_WORDS[temp_ram[1]][0];		//个位
	disword[10] = &NO_WORDS[temp_ram[0]][0];		//小数
	disword[12]	= &NO_WORDS[12];		//空格
	disword[13]	= &NO_WORDS[12];		//空格
 	//
}

void Put_sTEMP(uchar i){
	disword[i+1] = &NO_WORDS[12];		//空格
	disword[i+2] = &NO_WORDS[12];//&NO_WORDS[temp_ram[3]][0]; 		//百位
	disword[i+3] = &NO_WORDS[temp_ram[2]][0];		//十位
	disword[i+4] = &NO_WORDS[temp_ram[1]][0];		//个位
	disword[i+5] = &TMP_WORDS[8][0];	//小数点
	disword[i+6] = &NO_WORDS[temp_ram[0]][0];		//小数
	disword[i+7] = &TMP_WORDS[10][0];
	disword[i+8] = &NO_WORDS[12];		//空格
}
void Put_Cpyrt(uchar i){
	uchar m;
	for(m=0;m<8;m++)
		disword[i+1+m] = &CPYRT_WORDS[m];
}
void Show_Cpyrt(){
	uchar i;
	for(i=1;i<9;i++)
		disword[i] = &NO_WORDS[12];
	Put_Cpyrt(8);
	Move_Down();
	Put_Cpyrt(0);
	Put_Tdispram(8);
	Move_Down();
}
	
//========================
//参数i:放入第几屏缓存
//参数j:诗歌第几页
//========================
void Put_Song(uchar i,uchar j){
	uchar m;
	for(m=0;m<8;m++)
		disword[i+1+m] = &SONG_WORDS[j+m];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -