qq_30604257 2021-06-18 17:18 采纳率: 0%
浏览 111

嵌入式时钟2键怎么弄啊,弄了好久,求大神帮帮

#include <stm32f10x.h>

#include "oled.h"
#include "bmp.h"
#include "delay.h"
#include "usart.h"
#include "iic.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "stdio.h"

#include <math.h>

void LED_Init(void)
{
	GPIO_InitTypeDef aaa;
	
	//1¡¢Ê¹ÄÜGPIOB ʱÖÓ AHB  APB1  APB2
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	
	
	//2¡¢ÅäÖÃGPIOB0Òý½ÅΪÊä³öģʽ
	aaa.GPIO_Pin 	= GPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2 | GPIO_Pin_3;
	aaa.GPIO_Speed  = GPIO_Speed_10MHz;//µãµÆ¶ÔÒý½ÅËÙ¶ÈÎÞÒªÇó
	aaa.GPIO_Mode   = GPIO_Mode_Out_PP;//ÆÕͨÍÆÍìÊä³ö
	GPIO_Init(GPIOB,&aaa);
	
	//³õʼ»¯Íê  Ï£Íû4¸öµÆÈ«Ãð
	GPIO_SetBits(GPIOB,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);

}



//////////////////////////°´¼üÏà¹ØÅäÖÃ/////////////////////////////////
void KEY_Init(void)
{
	GPIO_InitTypeDef   aaa;
	EXTI_InitTypeDef   EXTI_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;
	
	//1¡¢Ê¹ÄÜʱÖÓ
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
	
	
	//2¡¢³õʼ»¯°´¼üÒý½Å  PA2 4¸ö°´¼üµÄÊäÈëģʽÅäÖÃ
	aaa.GPIO_Pin 	= GPIO_Pin_2 | GPIO_Pin_13 | GPIO_Pin_6 | GPIO_Pin_7;
	aaa.GPIO_Speed  = GPIO_Speed_10MHz;//°´¼üÒý½ÅΪÊäÈë ²»ÐèÒªÉèÖÃËÙ¶È
	aaa.GPIO_Mode   = GPIO_Mode_IPU;//ÆÕͨÉÏÀ­ÊäÈë
	GPIO_Init(GPIOA,&aaa);
	
	//3¡¢Á¬½ÓÍⲿÖжÏÏߺͶÔÓ¦Òý½Å PA2----EXTI2
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource2);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource7);
	
	//4¡¢EXTI2 ³õʼ»¯  4¸ö°´¼ü¶ÔÓ¦Òý½Å ÍⲿÖжÏÏß³õʼ»¯
	EXTI_InitStructure.EXTI_Line = EXTI_Line2 |EXTI_Line13 | EXTI_Line6 |EXTI_Line7;//Ñ¡ÔñÒª³õʼ»¯µÄÍⲿÖжÏÏß
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//ÖжÏģʽ  ʼþģʽ²»Ñ¡
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //°´¼üÒ»°ãÊÇËÉ¿ª´¥·¢ÖÐ¶Ï 
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;//ÖжϿª¹Ø  ENABLE  DISABLE
	EXTI_Init(&EXTI_InitStructure);
	
	//5¡¢ÖжÏÓÅÏȼ¶ÅäÖÃ
	NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//È«¾ÖÖжϺŠ  stm32f10x.h  100+ÐÐÈ¥ÕÒ     
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;//µÚÒ»ÓÅÏȼ¶  ÇÀÕ¼ÓÅÏȼ¶
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;//µÚ¶þÓÅÏȼ¶  ÏìÓ¦ÓÅÏȼ¶
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//¿ªÆôNVICÖжϹÜÀí
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//È«¾ÖÖжϺŠ  stm32f10x.h  100+ÐÐÈ¥ÕÒ     
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//È«¾ÖÖжϺŠ  stm32f10x.h  100+ÐÐÈ¥ÕÒ     
	NVIC_Init(&NVIC_InitStructure);

}

//ÖжϺ¯ÊýÃûÊÇÏà¶Ô¹Ì¶¨µÄ ÔÚÆô¶¯ÎļþÕÒ .sÎļþ
void EXTI2_IRQHandler(void)
{
	//·­×ªD4
	if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)==0)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_0);
	}
	else
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_0);;
	}
	
	//Öжϱê־λÇåÁã
	EXTI_ClearITPendingBit(EXTI_Line2);
}


//EXTI6  EXTI7
void EXTI9_5_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line6)==1)
	{
		//ÅжÏPA6Òý½Å¶ÔÓ¦EXTI6±ê־λÊÇ·ñÖÃ1 À´Åжϸð´¼üÊÇ·ñ°´ÏÂ
		
		//Ö´Ðй¦ÄÜ
		if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_2)==0)
		{
			GPIO_SetBits(GPIOB,GPIO_Pin_2);
		}
		else
		{
			GPIO_ResetBits(GPIOB,GPIO_Pin_2);;
		}
		
		EXTI_ClearITPendingBit(EXTI_Line6);
	
	}
	
	if(EXTI_GetITStatus(EXTI_Line7)==1)
	{
		//ÅжÏPA7Òý½Å¶ÔÓ¦EXTI7±ê־λÊÇ·ñÖÃ1 À´Åжϸð´¼üÊÇ·ñ°´ÏÂ
		
		//Ö´Ðй¦ÄÜ
		if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==0)
		{
			GPIO_SetBits(GPIOB,GPIO_Pin_3);
		}
		else
		{
			GPIO_ResetBits(GPIOB,GPIO_Pin_3);;
		}
		EXTI_ClearITPendingBit(EXTI_Line7);
	
	}
}



void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line13)==1)
	{
		//ÅжÏPA7Òý½Å¶ÔÓ¦EXTI7±ê־λÊÇ·ñÖÃ1 À´Åжϸð´¼üÊÇ·ñ°´ÏÂ
		
		//Ö´Ðй¦ÄÜ
		if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)==0)
		{
			GPIO_SetBits(GPIOB,GPIO_Pin_1);
		}
		else
		{
			GPIO_ResetBits(GPIOB,GPIO_Pin_1);;
		}
		EXTI_ClearITPendingBit(EXTI_Line13);
	
	}


}

/////////////////////////End KEY////////////////////////////////////////



//////////////////////////RTC Configure//////////////////////////////////////////

void RTC_Configuration(void)
{
  /*ʹÄܵçÔ´¹ÜÀíÄ£¿éPWRʱÖÓºÍBKPºó±¸¼Ä´æÆ÷ʱÖÓ---ÕâÁ½²½ºÜ¹Ø¼ü ²»Ê¹ÄܶÁÈ¡²»ÁËBKP*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  /* ÔÊÐí·ÃÎÊBKPºó±¸´¢´æÇøÓò--BKPÏ൱ÓÚÒ»¸öС´ÅÅÌ¿Õ¼ä ÄܵôµçºóÓɵç³Ø¼ÌÐø¹©µç¶ø¹¤×÷ */
  PWR_BackupAccessCmd(ENABLE);

	
  /* ¸´Î»ºó±¸¼Ä´æÆ÷ÇøÓòÏà¹Ø¼Ä´æÆ÷--´ó¼Ò²»ÓÃ¸Ä */
  BKP_DeInit();

  /* Ñ¡ÔñÍⲿµÍËÙ¾§ÕñʱÖÓLSE---¾ÍÊÇ´ó¼ÒºËÐÄ°å×ÓÉϵÄY1 32.768Khz */
  RCC_LSEConfig(RCC_LSE_ON);
  /* µÈ´ýÍⲿµÍËÙ¾§ÕñʱÖÓ¾ÍÐ÷---¹Ø¼ü */
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {}

  /* Ñ¡ÔñÍⲿµÍËÙ¾§ÕñLSE×÷ΪRTCʱÖÓ*/
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  /* ʹÄÜRTCʱÖӵĹ©¸ø---Æäʵ¾ÍÊÇ¿ªÆôLSEÌṩʱÖÓ¸øRTC*/
  RCC_RTCCLKCmd(ENABLE);

  /* µÈ´ýRTCÄÚ²¿µÄʱÖÓͬ²½----ºÍLSEͬ²½ */
  RTC_WaitForSynchro();

  /* µÈ´ýÉÏÒ»¸ö¶ÔRTC¼Ä´æÆ÷²Ù×÷Íê³É */
  RTC_WaitForLastTask();
	
  /* ¿ªÆôRTCµÄÃëÖжÏ---ÔÝʱ²»Óã¬ÒòΪ¿ªÆôÁ˾ÍÒª */
  //RTC_ITConfig(RTC_IT_SEC, ENABLE);
	
  /* µÈ´ýÖжϿªÆôÍê³É ÒòΪÉÏÃæû¿ªÆôÖÐ¶Ï ÕâÀïÒ²²»ÐèÒª */
  //RTC_WaitForLastTask();
	
	  
  /* ÉèÖÃRTCÄÚ²¿µÄ·ÖƵϵÊý ¼ÆË㹫ʽ£ºRTCʱÖÓ=LSEʱÖÓ/·ÖƵϵÊý+1 = 32768Hz/32767+1 = 1Hz */
  //1Hz¾ÍÊÇ1sÒ»¸öÂö³å  RTCÄÚ²¿µÄ¼ÆÊýÆ÷¾Í»áÀ´Ò»¸öÂö³åÀÛ¼Æ1
  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  /* µÈ´ýÉÏÒ»¸ö¶ÔRTC¼Ä´æÆ÷²Ù×÷Íê³É */
  RTC_WaitForLastTask();
 
}


//º¯Êý×öÁËÐÞ¸Ä £¬¿ÉÒÔ¸ù¾Ý´«ÈëµÄÌõ¼þºÍʱ¼äÀ´ÉèÖÃʱ¼ä
//²ÎÊý1£ºSetFlag  ÉèÖñêÖ¾  ´«0±íʾĬÈÏÉèÖð´¼üδ°´Ï  ´«1±íʾÉèÖð´¼ü°´Ï£¬Í¬Ê±ÓɲÎÊý2´«ÈëÉèÖÃʱ¼ä  
//²ÎÊý2£ºSetTimeCount  ÉèÖÃʱ¼äµÄ¼ÆÊýÖµ  ÉèÖ÷½Ê½£ºÐ¡Ê±*3600+·Ö*60+Ãë
void  RTC_Init(unsigned int SetTimeCount)
{
	
	/* ʹÄܵçÔ´¹ÜÀíÄ£¿éPWRʱÖÓºÍBKPºó±¸¼Ä´æÆ÷ʱÖÓ---ÕâÁ½²½ºÜ¹Ø¼ü ²»Ê¹ÄܶÁÈ¡²»ÁËBKP*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

	/* ÔÊÐí·ÃÎÊBKPºó±¸´¢´æÇøÓò*/
	PWR_BackupAccessCmd(ENABLE);

	//ÒÔÉÏÁ½²½½ñÌìÏÂÎçÍüÁËд µ¼Ö³õʼ»¯RTC¿¨ËÀ
	//ÒòΪÏÂÃæÓжÁÈ¡BKP
	
	//¶ÁÈ¡BKPµÄµÚÒ»¿é´¢´æ¿Õ¼ä ÅжÏÆäÊÇ·ñΪ0xA5A5 --- Õâ¸ö¾ÍÊDZê¼Ç
	if (BKP_ReadBackupRegister(BKP_DR1) != 0xA6A6 )
	{
		/* µ÷ÓÃÉÏÃæ±àдµÄRTC³õʼ»¯º¯Êý */
		RTC_Configuration();

		//µÈ´ýÉÏÒ»¾äÅäÖÃÍê³É
		RTC_WaitForLastTask();

		/* Ð޸ĵ±Ç°Ê±¼ä SetTimeCountÊÇ´Óº¯Êýµ÷Óô¦´«Èë*/
		RTC_SetCounter(SetTimeCount);
		/* µÈ´ýÐÞ¸Äʱ¼äÍê³É */
		RTC_WaitForLastTask();

		/* ÕâÀïÊǽ«0xA5A5дÈëºó±¸´¢´æÆ÷  ×ö±ê¼Ç*/
		BKP_WriteBackupRegister(BKP_DR1, 0xA6A6);
	}
	
	//µÚ¶þ´Î½øÀ´ ÅäÖÃRTC
	else
	{
		/*¼ì²éµçÔ´Çé¿ö */
		if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
		{

		}
		/*¼ì²é¸´Î»Òý½ÅÊÇ·ñÖÃλ±êÖ¾*/
		else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
		{ 
		}

		/* µÈ´ýRTCͬ²½ */
		RTC_WaitForSynchro();

	}

	/* Çå³ý±ê־λ */
	RCC_ClearFlag();

}


void Set_Time(unsigned int SetTimeCount)
{
	/* µ÷ÓÃÉÏÃæ±àдµÄRTC³õʼ»¯º¯Êý */
		RTC_Configuration();

		//µÈ´ýÉÏÒ»¾äÅäÖÃÍê³É
		RTC_WaitForLastTask();

		/* Ð޸ĵ±Ç°Ê±¼ä SetTimeCountÊÇ´Óº¯Êýµ÷Óô¦´«Èë*/
		RTC_SetCounter(SetTimeCount);
		/* µÈ´ýÐÞ¸Äʱ¼äÍê³É */
		RTC_WaitForLastTask();
}


///////////////////////////RTC End//////////////////////////////////////


int main()
{
	unsigned int counter=0;
	short Templ;
	short Gx,Gy,Gz;
	short Ax,Ay,Az;
	float Pitch,Roll,Yaw;//Å·À­½Ç¼Ç¼±äÁ¿
	
	float Temp_AxAy;//ÁÙʱ¼Ç¼Ax Ay¼ÓËٶȵĺϳÉÄ£
	float Temp_ALL;
	int step=0;
	
	uart_init(115200);
	LED_Init();
	//KEY_Init();
	
	//OLED_Init();//Ïȳõʼ»¯OLED
	//OLED_Clear();//ÇåÆÁ
	
	////////////RTCÅäÖÃ//////////////////
	//RTC_Init(9*3600+28*60+50);//ĬÈÏÅäÖÃΪ16µãÕû
	////////////////////////////////////
	
	IIC_GPIOInit();
	
	//while(1);
	MPU_Init();

	while(1)
	{
	

	
		Templ = MPU_Get_Temperature();//»ñȡζÈÖµ
		MPU_Get_Gyroscope(&Gx,&Gy,&Gz);//»ñÈ¡ÍÓÂÝÒǽÇËÙ¶ÈԭʼADת»»Öµ
		MPU_Get_Accelerometer(&Ax,&Ay,&Az);//»ñÈ¡¼ÓËٶȼÆÏß¼ÓËÙ¶ÈԭʼADת»»Öµ
		
		Temp_AxAy = sqrt(Ax*Ax+Ay*Ay);
		Temp_ALL  = sqrt(Temp_AxAy*Temp_AxAy+Az*Az);
		//printf("×îÖÕÄ£´óС:%.2f\r\n",Temp_ALL);
		if(Temp_ALL>25000 && Temp_ALL<30000)
			step++;
		printf("²½Êý£º%d\r\n",step);
		//printf("Gx:%.3f Gy:%.3f Gz:%.3f   Ax:%d Ay:%d Az:%d\r\n",Gx/16.4,Gy/16.4,Gz/16.4,Ax,Ay,Az);
		//printf("ζȣº%.3f\r\n",Templ/100.0);
		
		//ÒÔÏÂÁ½ÐÐÊǽ«Êý¾Ý·¢¸ø  ÄäÃûËÄÖáÉÏλ»úÈí¼þ²é¿´µ÷ÊÔʹÓÃ
//		mpu6050_send_data(Temp_ALL,Ay,Az,Gx,Gy,Gz);//ÓÃ×Ô¶¨ÒåÖ¡·¢ËͼÓËٶȺÍÍÓÂÝÒÇԭʼÊý¾Ý
//		usart1_report_imu(Temp_ALL,Ay,Az,Gx,Gy,Gz,(int)(Roll*100),(int)(Pitch*100),(int)(Yaw*10));
		
		//printf("¸©Ñö½Ç£º%.2f  ºá¹ö½Ç£º%.2f  º½Ïò½Ç£º%.2f\r\n",Pitch,Roll,Yaw);
		delay_ms(5);
		
	
	}
	
	//return 0;
}

  • 写回答

1条回答 默认 最新

  • AI迅剑 2023-03-11 19:00
    关注

    原理图和PCB图:

    原理图:

    功能和操作说明:

    本系统以C51单片机为核心,通过软件在LCD1602上显示具体时间日期的系统。本质是一个简易电子时钟。同时可以通过4个按键来调整时间。

    在仿真开始后,LCD显示屏会显示初始时间,同时随着定时器工作,时钟会走动。若按下“MODEL”按键,则定时器停止工作,光标定位到年,同时可按下“+”,“-”键来完成对时间的更改,按下两次“MODEL”键,光标定位到月,三次,光标定位到周,四次到日,五次到时,六次到分钟,七次到秒。最后按下“CONFIRM”键,光标消失,定时器重新开始工作,时钟走动。
    ————————————————

    #include <reg51.h>
    #include <stdio.h>
    #include <intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit RW=P2^1;//定义1602液晶RW端,
    sbit RS=P2^0;  //定义1602液晶RS端
    sbit EN=P2^2;//定义1602液晶EN端
    sbit s1=P1^0;
    sbit s2=P1^1;
    sbit s3=P1^2;
    sbit s4=P1^3;
    sbit LED=P2^5;
    uchar count,s1_num,year,month,day,week,second,hour,minu;
    uchar code OP[]=" 20  -  -   ";//定义初始上显示状态 
    void DELAY_1(uint k)
    {
       int j;
       for(;k!=0;k--)
       {
          for(j=112;j>0;j--);
       }
    }
    void write_com(uchar com)//写命令函数
    {
       RS=0; 
       RW=0;
       EN=0;   
       P0=com;
       DELAY_1(5);
       EN=1;
       DELAY_1(5);
       EN=0;
    }
    void write_da(uchar dat)//写数据
    {
        RS=1;
        RW=0;
        EN=0;
        P0=dat;
        DELAY_1(5);
        EN=1;
        DELAY_1(5);
        EN=0;//执行
    }
    void write_yea(uchar pla,uchar date1)//LCD第一行写入
    {
            uchar hour1,hour2;
            hour1=date1/10;
            hour2=date1%10;
            write_com(0x80+pla);
            write_da(0x30+hour1);
            write_da(0x30+hour2); 
    }
    void write_sec(uchar add,uchar date)//LCD第二行写入
    {
            uchar hour1,hour2;
            hour1=date/10;
            hour2=date%10;
            write_com(0xC0+add);
            write_da(0x30+hour1);
            write_da(0x30+hour2); 
    }
    void write_week(char week)//星期显示函数
    {
            write_com(0x80+13);//第一行第12个位置
            switch(week)
            {
                    case 1:    write_da('M');DELAY_1(5);write_da('O');DELAY_1(5);write_da('N');break;
                    case 2:    write_da('T');DELAY_1(5);write_da('U');DELAY_1(5);write_da('E');break;
                    case 3:    write_da('W');DELAY_1(5);write_da('E');DELAY_1(5);write_da('D'); break;
                    case 4:    write_da('T');DELAY_1(5);write_da('H');DELAY_1(5);write_da('U');break;
                    case 5:    write_da('F');DELAY_1(5);write_da('R');DELAY_1(5); write_da('I');break;
                    case 6:    write_da('S');DELAY_1(5); write_da('A');DELAY_1(5); write_da('T');break;
                    case 7:    write_da('S');DELAY_1(5);write_da('U');DELAY_1(5);write_da('N');break;
                default: break;
            }
    }
    void writemon()//溢出判断
    {
       day=1;
       month++;
       if(month==13)
       {
             month=1;
             year++;
             if(year==100)
                year=0;
             write_yea(3,year);//年若变化则重新写入
            }
            write_yea(6,month);//月若变化则重新写入
    }
    void timeint()//定时器初始化
    {
           TMOD=0x01;
        ET0=1;
        EA=1;
        TR0=1;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
    }
    void init()//初始化LCD函数
    {
            uchar num;
            EN=0;
           RS=0;
           RW=0;
            year=22;//初始化种变量值
            month=7;
            day=4;
            week=1;
            hour=10;
            minu=59;
            second=50;
            count=0;
            s1_num=0;
            LED=0;
            write_com(0x38);//初始化LCD1602
            write_com(0x0c);//开显示
            write_com(0x06);//写读地址指针自动加一
            write_com(0x01);
            write_com(0x80);//设置显示第一行
            for(num=0;num<15;num++)//显示年月日星期
            {
                    write_da(OP[num]);
                    DELAY_1(5);
            }
                    DELAY_1(5);
                    write_com(0xc4);//写出时间显示部分的两个":"
                    write_da(':');
                    DELAY_1(5);
                    write_com(0xc7);
                    write_da(':');
                    DELAY_1(5);
            write_week(week);
            write_yea(3,year);//显示
            write_yea(6,month);
            write_yea(9,day);
            write_sec(8,second);//显示
            write_sec(5,minu);
            write_sec(2,hour);
    }
    void keyscan()//按键扫描函数
    {
            if(s1==0)        
            {
                    DELAY_1(5);
                    if(s1==0)//确认功能键被按下
                    {        
                           s1_num++;//功能键按下次数记录
                            while(!s1);                   
                            if(s1_num==1)//第一次被按下时
                            {
                                   TR0=0;  //关闭定时器
                                    write_com(0x84);//光标定位到年位置
                                    write_com(0x0f); //光标开始闪烁
                            }
                            if(s1_num==2)//第二次按下光标闪烁定位到月位置
                            {
                                    write_com(0x87);//第一行第六个
                            }
                            if(s1_num==3)//第三次按下光标闪烁定位到日位置
                            {
                                    write_com(0x8a);
                            }
                            if(s1_num==4)//第四次按下光标闪烁定位到星期位置
                            {
                                    write_com(0x8e);
                            }  
                if(s1_num==5)//第五次按下光标闪烁定位到时位置
                            {
                                    write_com(0xC3);
                            }
                if(s1_num==6)//第六次按下光标闪烁定位到分位置
                            {
                                    write_com(0xc6);
                            }
                            if(s1_num==7)//第七次被按下时光标定位到秒位置
                            {
                                    write_com(0xc9);
                            }
                            
              
                            if(s1_num==8)
                            {
                                    s1_num=0;//记录按键数清零
                                    write_com(0x0c);//取消光标闪烁
                                    TR0=1;        //启动定时器使时钟开始走
                            }               
                    }
            }
            if(s1_num!=0)//只有功能键被按下后,增加和减小键才有效
            {
              if(s4==0)//确认按键        
              {
                    DELAY_1(5);
                    if(s4==0)
                 {        
                    while(!s4);//释放确认
                    s1_num=0;//记录按键数清零
                    write_com(0x0c);//取消光标闪烁
                    TR0=1;        //启动定时器使时钟开始走   
                }
             }
                    if(s2==0)//+键
                    {
                            DELAY_1(5);
                            if(s2==0)
                            {
                                    while(!s2);//按键释放
                                    if(s1_num==1)//若功能键第一次按下
                                    {
                                            year++; //则调整年加1
                                            if(year==100)//若满100后将清零
                                                    year=0;
                                            write_yea(3,year);//每调节一次送液晶显示一下
                                            write_com(0x84);//显示位置重新回到调节处
                                    }
                                    if(s1_num==2)//若功能键第二次按下
                                    {
                                            month++;//则调整月加1
                                            if(month==13)//若满12后将置一
                                                    month=1;
                                            write_yea(6,month);//每调节一次送液晶显示一下
                                            write_com(0x87);//显示位置重新回到调节处
                                    }
                                    if(s1_num==3)//若功能键第三次按下
                                    {
                                            day++;//则调整日加1
                                            if(year%4==0&&month==2)
                                            {
                                                if(day==30)//若满29后将置一
                                                    day=1;
                                             }
                                             if(year%4!=0&&month==2)
                                            {
                                                if(day==29)//若满28后将置一
                                                    day=1;
                                             }
                                             if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
                                             {
                                                if(day==32)//若满31后将置一
                                                    day=1;
                                             }
                                             if(month==4||month==6||month==9||month==11)
                                             {         
                                                    if(day==31)//若满30后将置一
                                                    day=1;
                                             }
                                            write_yea(9,day);;//每调节一次送液晶显示一下
                                            write_com(0x8a);//显示位置重新回到调节处
                                    }
                                    if(s1_num==4)//若功能键第四次按下
                                    {
                                            week++;//则调整星期加1
                                            if(week==8)//若满8后将置一
                                                    week=1;
                                            write_week(week);//每调节一次送液晶显示一下
                                            write_com(0x8d);//显示位置重新回到调节处
                                    }
                     if(s1_num==5)//若功能键第五次按下
                                    {                                       
                                            hour++;
                                            if(hour==24)//若满24后将清零
                                         {
                                               hour=0;
                                            }
                        write_sec(2,hour);
                         write_com(0xc3);
                                      }  
                                    if(s1_num==6)//若功能键第二次按下
                                    {
                                            minu++;//则调整分钟加1
                                            if(minu==60)//若满60后将清零
                                                   minu=0;
                                            write_sec(5,minu);//每调节一次送液晶显示一下
                                            write_com(0xc6);
                                    }
                       if(s1_num==7)//若功能键第七次按下
                                    {
                                            second++; //整秒加1
                                            if(second==60)//满60后将清零
                                                    second=0;
                                            write_sec(8,second);//每调节一次送液晶显示一下
                                            write_com(0xc9);//调整显示位置
                                    }
                            }
                    }
            }
                    if(s3==0)//-键
                    {
                            if(s3==0)//确认减小键被按下
                            {
                                    while(!s3);//按键释放
                                    if(s1_num==1)//若功能键第一次按下
                                    {
                                            year--;//则调整秒减1
                                            if(year==-1)//若减到负数则将其重新设置为99
                                                    year=99;
                                            write_yea(3,year);//每调节一次送液晶显示一下
                                            write_com(0x84);//重新调整显示
                                    }
                                    if(s1_num==2)//若功能键第二次按下
                                    {
                                            month--;//则调整分钟减1
                                            if(month==0)//若减到负数则将其重新设置为59
                                                    month=12;
                                            write_yea(6,month);//每调节一次送液晶显示一下
                                            write_com(0x87);//重新调整显示
                                    }
                                    if(s1_num==3)//若功能键第3次按下
                                    {
                                            day--;//则调整日加1
                                            if(year%4==0&&month==2)
                                            {
                                                if(day==0)//若满29后将置一
                                                    day=29;
                                             }
                                             if(year%4!=0&&month==2)
                                            {
                                                if(day==0)//若满28后将置一
                                                    day=28;
                                             }
                                             if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
                                             {
                                                if(day==0)//若满31后将置一
                                                    day=31;
                                             }
                                             if(month==4||month==6||month==9||month==11)
                                             {         
                                                    if(day==0)//若满30后将置一
                                                    day=30;
                                             }
                                            write_yea(9,day);;//每调节一次送液晶显示一下
                                            write_com(0x8a);//重新调整显示
                                    }
                                    if(s1_num==4)//MODEL第4次按下
                                    {
                                            week--;//小时减1
                                            if(week==0)//若减到负数则将其重新设置为23
                                                    week=7;
                                            write_week(week);//每调节一次送液晶显示一下
                                            write_com(0x8d);//重新调整显示
                                    }
                                    
                    if(s1_num==5)//MODEL第5次按下
                                    {
                                            hour--;
                                            if(hour==-1)//若满24后将清零
                                               hour=23;
                                 }
                                    if(s1_num==6)//MODEL第6次按下
                                    {
                                            minu--;//则调整分钟减1
                                            if(minu==-1)//若减到负数则将其重新设置为59
                                                    minu=59;
                                            write_sec(5,minu);//每调节一次送液晶显示一下
                                            write_com(0xc6);//重新调整显示
                                    }
                                   if(s1_num==7)//若功能键第7次按下
                                    {
                                            second--;//则调整秒减1
                                            if(second==-1)//若减到负数则将其重新设置为59
                                                    second=59;
                                            write_sec(8,second);//每调节一次送液晶显示一下
                                            write_com(0xc9);//重新调整显示
                                    } 
                    }
            }       
    }
     
    void timer0() interrupt 1
    {
      
            TH0=(65536-50000)/256;//定时器初值
            TL0=(65536-50000)%256;
            count++; //中断次数累加
           if(count==20) //20次50毫秒为1秒
            {    
              LED=0;
              if(minu==59 && second==59 )   LED=1;
                    count=0;
                    second++;
                    if(second==60)//秒加到60则进位分钟
                    {
                            second=0;//同时秒数清零
                            minu++;
                            if(minu==60)//分钟加到60则进位小时
                            {
                                    minu=0;//同时分钟数清零
                                    hour++;                                
                                    if(hour==24)//小时加到24则小时清零
                                    {
                                            hour=0;
                                            week++;
                                               if(week==8)
                                               {
                                                   week=1;
                                               }
                                               write_week(week);//星期若变化则重新写入
                                               day++;
                                               if(year%4==0&&month==2)//判断是否为闰年的2月
                                               {
                                                  if(day==30)
                                                      {
                                                         writemon();                                                                                                                                                         
                                                      }
                                                    write_yea(9,day);//日若变化则重新写入
                                               }
                                               if(year%4!=0&&month==2)//判断是否为平年的2月
                                               {
                                                  if(day==29)
                                                      {
                                                         writemon();                                                                                                  
                                                      }
                                                      write_yea(9,day);//日若变化则重新写入
                                               }
                                               if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
                                               {
                                                  if(day==32)
                                                      {
                                                         writemon();                                                                                                  
                                                      }
                                                      write_yea(9,day);//日若变化则重新写入
                                               }
                                               if(month==4||month==6||month==9||month==11)
                                               {
                                                  if(day==31)
                                                      {
                                                         writemon();                                                                                                  
                                                      }
                                                      write_yea(9,day);//日若变化
                                               }
                                           
                                    }  
                                      write_sec(2,hour);
                            }
                            write_sec(5,minu);//分钟若变化
                    }
                    write_sec(8,second);//秒若变化        
            }   
    }
    /********************主函数*************************/
    void main()
    {       
            init();//初始化LCD160tr
            timeint();//定时器初始化化 
            while(1)
            { 
                    keyscan();//不停的检测按键是否被按下
             }
    }
    
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题