普中精灵项目u8g2单色图形库设计实践:5手表时钟+自己想法改进

首先,制作旋转的三角形失败了/(ㄒoㄒ)/~~库😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭

做出来的三角形形状一直在变

不过今天我写的采访稿获得学校二等奖,采访视频获得学校一等奖

我果真是文科生(我专业是控制科学与工程,想读博,导师说我没有理科思维(确实高考历史年级第三,商务英语文学士))

所以我先做了时钟

首先是电子时钟

使用普中基础实验给的时钟时间获取程序

_calendar calendar;//ʱÖӽṹÌå 
 
static void RTC_NVIC_Config(void)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;		//RTCÈ«¾ÖÖжÏ
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//ÏÈÕ¼ÓÅÏȼ¶1λ,´ÓÓÅÏȼ¶3λ
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	//ÏÈÕ¼ÓÅÏȼ¶0λ,´ÓÓÅÏȼ¶4λ
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		//ʹÄܸÃͨµÀÖжÏ
	NVIC_Init(&NVIC_InitStructure);		//¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
}


/*******************************************************************************
* º¯ Êý Ãû         : RTC_Init
* º¯Êý¹¦ÄÜ		   : RTC³õʼ»¯
* Êä    Èë         : ÎÞ
* Êä    ³ö         : 0,³õʼ»¯³É¹¦
        			 1,LSE¿ªÆôʧ°Ü
*******************************************************************************/ 
u8 RTC_Init(void)
{
	//¼ì²éÊDz»ÊǵÚÒ»´ÎÅäÖÃʱÖÓ
	u8 temp=0;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//ʹÄÜPWRºÍBKPÍâÉèʱÖÓ   
	PWR_BackupAccessCmd(ENABLE);	//ʹÄܺ󱸼ĴæÆ÷·ÃÎÊ  
	if (BKP_ReadBackupRegister(BKP_DR1) != 0xA0A0)		//´ÓÖ¸¶¨µÄºó±¸¼Ä´æÆ÷ÖжÁ³öÊý¾Ý:¶Á³öÁËÓëдÈëµÄÖ¸¶¨Êý¾Ý²»Ïàºõ
	{	 			
		BKP_DeInit();	//¸´Î»±¸·ÝÇøÓò 	
		RCC_LSEConfig(RCC_LSE_ON);	//ÉèÖÃÍⲿµÍËÙ¾§Õñ(LSE),ʹÓÃÍâÉèµÍËÙ¾§Õñ
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)	//¼ì²éÖ¸¶¨µÄRCC±ê־λÉèÖÃÓë·ñ,µÈ´ýµÍËÙ¾§Õñ¾ÍÐ÷
		{
			temp++;
			delay_ms(10);
		}
		if(temp>=250)return 1;//³õʼ»¯Ê±ÖÓʧ°Ü,¾§ÕñÓÐÎÊÌâ	    
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//ÉèÖÃRTCʱÖÓ(RTCCLK),Ñ¡ÔñLSE×÷ΪRTCʱÖÓ    
		RCC_RTCCLKCmd(ENABLE);	//ʹÄÜRTCʱÖÓ  
		RTC_WaitForLastTask();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
		RTC_WaitForSynchro();		//µÈ´ýRTC¼Ä´æÆ÷ͬ²½  
		RTC_ITConfig(RTC_IT_SEC, ENABLE);		//ʹÄÜRTCÃëÖжÏ
		RTC_WaitForLastTask();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
		RTC_EnterConfigMode();// ÔÊÐíÅäÖÃ	
		RTC_SetPrescaler(32767); //ÉèÖÃRTCÔ¤·ÖƵµÄÖµ
		RTC_WaitForLastTask();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
		RTC_Set(2023,5,24,17,34,55);  //ÉèÖÃʱ¼ä	
		RTC_ExitConfigMode(); //Í˳öÅäÖÃģʽ  
		BKP_WriteBackupRegister(BKP_DR1, 0XA0A0);	//ÏòÖ¸¶¨µÄºó±¸¼Ä´æÆ÷ÖÐдÈëÓû§³ÌÐòÊý¾Ý
	}
	else//ϵͳ¼ÌÐø¼Æʱ
	{
		RTC_WaitForSynchro();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
		RTC_ITConfig(RTC_IT_SEC, ENABLE);	//ʹÄÜRTCÃëÖжÏ
		RTC_WaitForLastTask();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
	}
	RTC_NVIC_Config();//RCTÖжϷÖ×éÉèÖÃ		    				     
	RTC_Get();//¸üÐÂʱ¼ä	
	return 0; //ok

}		 				    
//RTCʱÖÓÖжÏ
//ÿÃë´¥·¢Ò»´Î  
//extern u16 tcnt; 
void RTC_IRQHandler(void)
{		 
	if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//ÃëÖÓÖжÏ
	{							
		RTC_Get();//¸üÐÂʱ¼ä  
		printf("RTC Time:%d-%d-%d %d:%d:%d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//Êä³öÄÖÁåʱ¼ä	
				
 	}
	if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//ÄÖÖÓÖжÏ
	{
		RTC_ClearITPendingBit(RTC_IT_ALR);		//ÇåÄÖÖÓÖжÏ	  	
		RTC_Get();				//¸üÐÂʱ¼ä   
		printf("Alarm Time:%d-%d-%d %d:%d:%d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//Êä³öÄÖÁåʱ¼ä	
		
  	} 				  								 
	RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);		//ÇåÄÖÖÓÖжÏ
	RTC_WaitForLastTask();	  	    						 	   	 
}
//ÅжÏÊÇ·ñÊÇÈòÄ꺯Êý
//ÔÂ·Ý   1  2  3  4  5  6  7  8  9  10 11 12
//ÈòÄê   31 29 31 30 31 30 31 31 30 31 30 31
//·ÇÈòÄê 31 28 31 30 31 30 31 31 30 31 30 31
//ÊäÈë:Äê·Ý
//Êä³ö:¸ÃÄê·ÝÊDz»ÊÇÈòÄê.1,ÊÇ.0,²»ÊÇ
u8 Is_Leap_Year(u16 year)
{			  
	if(year%4==0) //±ØÐëÄܱ»4Õû³ý
	{ 
		if(year%100==0) 
		{ 
			if(year%400==0)return 1;//Èç¹ûÒÔ00½áβ,»¹ÒªÄܱ»400Õû³ý 	   
			else return 0;   
		}else return 1;   
	}else return 0;	
}	 			   


//Ô·ÝÊý¾Ý±í											 
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //ÔÂÐÞÕýÊý¾Ý±í	  
//ƽÄêµÄÔ·ÝÈÕÆÚ±í
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};

/*******************************************************************************
* º¯ Êý Ãû         : RTC_Set
* º¯Êý¹¦ÄÜ		   : RTCÉèÖÃÈÕÆÚʱ¼äº¯Êý£¨ÒÔ1970Äê1ÔÂ1ÈÕΪ»ù×¼£¬°ÑÊäÈëµÄʱÖÓת»»ÎªÃëÖÓ£©
						1970~2099ÄêΪºÏ·¨Äê·Ý
* Êä    Èë         : syear£ºÄê  smon£ºÔ  sday£ºÈÕ
					hour£ºÊ±   min£º·Ö	 sec£ºÃë			
* Êä    ³ö         : 0,³É¹¦
        			 1,ʧ°Ü
*******************************************************************************/
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
	u16 t;
	u32 seccount=0;
	if(syear<1970||syear>2099)return 1;	   
	for(t=1970;t<syear;t++)	//°ÑËùÓÐÄê·ÝµÄÃëÖÓÏà¼Ó
	{
		if(Is_Leap_Year(t))seccount+=31622400;//ÈòÄêµÄÃëÖÓÊý
		else seccount+=31536000;			  //ƽÄêµÄÃëÖÓÊý
	}
	smon-=1;
	for(t=0;t<smon;t++)	   //°ÑÇ°ÃæÔ·ݵÄÃëÖÓÊýÏà¼Ó
	{
		seccount+=(u32)mon_table[t]*86400;//Ô·ÝÃëÖÓÊýÏà¼Ó
		if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//ÈòÄê2Ô·ÝÔö¼ÓÒ»ÌìµÄÃëÖÓÊý	   
	}
	seccount+=(u32)(sday-1)*86400;//°ÑÇ°ÃæÈÕÆÚµÄÃëÖÓÊýÏà¼Ó 
	seccount+=(u32)hour*3600;//СʱÃëÖÓÊý
    seccount+=(u32)min*60;	 //·ÖÖÓÃëÖÓÊý
	seccount+=sec;//×îºóµÄÃëÖÓ¼ÓÉÏÈ¥

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//ʹÄÜPWRºÍBKPÍâÉèʱÖÓ  
	PWR_BackupAccessCmd(ENABLE);	//ʹÄÜRTCºÍºó±¸¼Ä´æÆ÷·ÃÎÊ 
	RTC_SetCounter(seccount);	//ÉèÖÃRTC¼ÆÊýÆ÷µÄÖµ

	RTC_WaitForLastTask();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É  	
	return 0;	    
}

//³õʼ»¯ÄÖÖÓ		  
//ÒÔ1970Äê1ÔÂ1ÈÕΪ»ù×¼
//1970~2099ÄêΪºÏ·¨Äê·Ý
//syear,smon,sday,hour,min,sec£ºÄÖÖÓµÄÄêÔÂÈÕʱ·ÖÃë   
//·µ»ØÖµ:0,³É¹¦;ÆäËû:´íÎó´úÂë.
u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
	u16 t;
	u32 seccount=0;
	if(syear<1970||syear>2099)return 1;	   
	for(t=1970;t<syear;t++)	//°ÑËùÓÐÄê·ÝµÄÃëÖÓÏà¼Ó
	{
		if(Is_Leap_Year(t))seccount+=31622400;//ÈòÄêµÄÃëÖÓÊý
		else seccount+=31536000;			  //ƽÄêµÄÃëÖÓÊý
	}
	smon-=1;
	for(t=0;t<smon;t++)	   //°ÑÇ°ÃæÔ·ݵÄÃëÖÓÊýÏà¼Ó
	{
		seccount+=(u32)mon_table[t]*86400;//Ô·ÝÃëÖÓÊýÏà¼Ó
		if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//ÈòÄê2Ô·ÝÔö¼ÓÒ»ÌìµÄÃëÖÓÊý	   
	}
	seccount+=(u32)(sday-1)*86400;//°ÑÇ°ÃæÈÕÆÚµÄÃëÖÓÊýÏà¼Ó 
	seccount+=(u32)hour*3600;//СʱÃëÖÓÊý
    seccount+=(u32)min*60;	 //·ÖÖÓÃëÖÓÊý
	seccount+=sec;//×îºóµÄÃëÖÓ¼ÓÉÏÈ¥ 			    
	//ÉèÖÃʱÖÓ
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//ʹÄÜPWRºÍBKPÍâÉèʱÖÓ   
	PWR_BackupAccessCmd(ENABLE);	//ʹÄܺ󱸼ĴæÆ÷·ÃÎÊ  
	//ÉÏÃæÈý²½ÊDZØÐëµÄ!
	
	RTC_SetAlarm(seccount);
 
	RTC_WaitForLastTask();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É  	
	
	return 0;	    
}


//µÃµ½µ±Ç°µÄʱ¼ä
//·µ»ØÖµ:0,³É¹¦;ÆäËû:´íÎó´úÂë.
u8 RTC_Get(void)
{
	static u16 daycnt=0;
	u32 timecount=0; 
	u32 temp=0;
	u16 temp1=0;	  
    timecount=RTC_GetCounter();	 
 	temp=timecount/86400;   //µÃµ½ÌìÊý(ÃëÖÓÊý¶ÔÓ¦µÄ)
	if(daycnt!=temp)//³¬¹ýÒ»ÌìÁË
	{	  
		daycnt=temp;
		temp1=1970;	//´Ó1970Ä꿪ʼ
		while(temp>=365)
		{				 
			if(Is_Leap_Year(temp1))//ÊÇÈòÄê
			{
				if(temp>=366)temp-=366;//ÈòÄêµÄÃëÖÓÊý
				else {temp1++;break;}  
			}
			else temp-=365;	  //ƽÄê 
			temp1++;  
		}   
		calendar.w_year=temp1;//µÃµ½Äê·Ý
		temp1=0;
		while(temp>=28)//³¬¹ýÁËÒ»¸öÔÂ
		{
			if(Is_Leap_Year(calendar.w_year)&&temp1==1)//µ±ÄêÊDz»ÊÇÈòÄê/2Ô·Ý
			{
				if(temp>=29)temp-=29;//ÈòÄêµÄÃëÖÓÊý
				else break; 
			}
			else 
			{
				if(temp>=mon_table[temp1])temp-=mon_table[temp1];//ƽÄê
				else break;
			}
			temp1++;  
		}
		calendar.w_month=temp1+1;	//µÃµ½Ô·Ý
		calendar.w_date=temp+1;  	//µÃµ½ÈÕÆÚ 
	}
	temp=timecount%86400;     		//µÃµ½ÃëÖÓÊý   	   
	calendar.hour=temp/3600;     	//Сʱ
	calendar.min=(temp%3600)/60; 	//·ÖÖÓ	
	calendar.sec=(temp%3600)%60; 	//ÃëÖÓ
	calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//»ñÈ¡ÐÇÆÚ   
	return 0;
}	 
//»ñµÃÏÖÔÚÊÇÐÇÆÚ¼¸
//¹¦ÄÜÃèÊö:ÊäÈ빫ÀúÈÕÆڵõ½ÐÇÆÚ(Ö»ÔÊÐí1901-2099Äê)
//ÊäÈë²ÎÊý£º¹«ÀúÄêÔÂÈÕ 
//·µ»ØÖµ£ºÐÇÆÚºÅ																						 
u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{	
	u16 temp2;
	u8 yearH,yearL;
	
	yearH=year/100;	yearL=year%100; 
	// Èç¹ûΪ21ÊÀ¼Í,Äê·ÝÊý¼Ó100  
	if (yearH>19)yearL+=100;
	// Ëù¹ýÈòÄêÊýÖ»Ëã1900ÄêÖ®ºóµÄ  
	temp2=yearL+yearL/4;
	temp2=temp2%7; 
	temp2=temp2+day+table_week[month-1];
	if (yearL%4==0&&month<3)temp2--;
	return(temp2%7);
}			  

设计电子时钟

void DT(u8g2_t *u8g2)
{int i;
	
	char buff[20];
	for(i=0;i<20;i++)
	{
		u8g2_ClearBuffer(u8g2); 
		u8g2_SetFont(u8g2,u8g2_font_ncenB18_tf);
		sprintf(buff,"%2d:%2d",calendar.hour,calendar.min);
		u8g2_DrawStr(u8g2,0,30,buff);
		u8g2_SetFont(u8g2,u8g2_font_ncenB18_tf);
		sprintf(buff,":%2d",calendar.sec);
		u8g2_DrawStr(u8g2,96,30,buff);
		u8g2_SendBuffer(u8g2);	
	}
}

当然也可以加上日期,星期

自己想法的改进

设计钟表时钟

首先画圆

	u8g2_DrawCircle(u8g2,x,y,r,U8G2_DRAW_ALL);

再做刻度,刻度是长短不一的

按照常识,刻度应是有小时的长

for(i=0;i<60;i++)
    {
		if(i%5==0)L=5;
		else L=3;

我自己变了一个程序不好看,太复杂了,因为是一个个写的,计算的

这里使用示例的刻度盘

void LCD_DrawClock(u8g2_t *u8g2,int x,int y,int r)//»­Ê±Öӿ̶ÈÅÌ
{ 
    int i,L;//L¿ØÖÆÖ¸Õ볤¶È
	int x1,x2,y1,y2;
	u8g2_DrawCircle(u8g2,x,y,r,U8G2_DRAW_ALL);
    for(i=0;i<60;i++)
    {
		if(i%5==0)
			L=5; //¿ØÖƿ̶ÈÕ볤¶È
		else 
			L=3;  //¿ØÖƿ̶ÈÕ볤¶È
		x1=r*sin(i*6*pi/180)+x; 
		y1=r*cos(i*6*pi/180)+y; 
		x2=(r-L)*sin(i*6*pi/180)+x; 
		y2=(r-L)*cos(i*6*pi/180)+y; 
		u8g2_DrawLine(u8g2,x1,y1,x2,y2);
	}
	u8g2_SendBuffer(u8g2);
}

接着是指针,指针是长短不一的
 

void Time_clock(u8g2_t *u8g2)
{int i;
	for(i=0;i<20;i++)
	{
		u8g2_ClearBuffer(u8g2); 
		LCD_DrawClock(u8g2,64,31,30);
	if(calendar.hour<12){
u8g2_DrawLine(u8g2,64,31,10*sin(-calendar.hour*30*pi/180)+64,10*cos(-calendar.hour*30*pi/180)+31);}
	else{
		calendar.hour=calendar.hour-12;
u8g2_DrawLine(u8g2,64,31,10*sin(-calendar.hour*30*pi/180+90)+64,10*cos(-calendar.hour*30*pi/180+90)+31);}
	u8g2_DrawLine(u8g2,64,31,15*sin(-calendar.min*6*pi/180+90)+64,15*cos(-calendar.min*6*pi/180+90)+31);
u8g2_DrawLine(u8g2,64,31,20*sin(-calendar.sec*6*pi/180+90)+64,20*cos(-calendar.sec*6*pi/180+90)+31);
	u8g2_SendBuffer(u8g2);	
}
	}

有点要注意它是顺时针,所以是-calendar.sec,sin要递减,此外0点是在sin90的地方,所以要加90°

我接下来要努力学习,把三角形旋转看懂,希望有大佬下场指导,感谢👻👻👻👻👻👻👻👻👻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值