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

📄 1602菜单实验.c

📁 自己设计的5路定时器!用于公司。内附电路图(DXP)
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************************
项           目:       
编   译      器:        
目  标   芯  片:        
时           钟:        
建  立  日   期:        
最 后 修改 日期:        
*****************************************************************************************/

/*------------------------------------------------------------------------------------------
头文件
------------------------------------------------------------------------------------------*/

#include <avr/io.h>
#include <util/delay.h> 
#include <avr/eeprom.h>
#include "bitfield.h" 
//#include "key.h" 
#include "DS1302.h"
#include <avr/interrupt.h>   
     
/*-----------------------------------------------------------------------------------------
管脚宏定义
------------------------------------------------------------------------------------------*/ 
#define	PORT_595 PORTD
#define	DDR_595  DDRD


#define  key_DDR  DDRB
#define  key_PORT PORTB
#define  key_PIN  PINB

#define  key_h PC1


#define	LCR GET_IO_BIT(&PORTD,PD6)
#define	SCR GET_IO_BIT(&PORTD,PD7)
#define	SDI GET_IO_BIT(&PORTD,PD5)

#define	LCR1 GET_IO_BIT(&DDRD,PD6)
#define	SCR1 GET_IO_BIT(&DDRD,PD7)
#define	SDI1 GET_IO_BIT(&DDRD,PD5)

#define LED1 PD3
#define LED2 PD2
#define LED3 PD1
#define LED4 PD0
/******************************************************************** */

#define	SETBIT(x,y) (x|=(1<<y))      
#define	CLRBIT(x,y) (x&=(~(1<<y)))   
#define	CHKBIT(x,y) (x&(1<<y))

#define buzzer   GET_IO_BIT(&PORTC,PC0) 
#define buzzer_1  GET_IO_BIT(&DDRC,PC0)
#define buzzer_2  GET_IO_BIT(&PINC,PC0)

volatile unsigned char switch1=0,t=0;
volatile unsigned char stop1=0,stop2=0,stop3=0,stop4=0,stop5=0;

unsigned char start1=0,start2=0,start3=0,start4=0,start5=0;
volatile unsigned char add_dec1=0,add_dec2=0,add_dec3=0,add_dec4=0,add_dec5=0;



unsigned char startdata=0,start1_1=0,start2_2=0,start3_3=0,start4_4=0,start5_5=0;

static char buffer3[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};

volatile unsigned char key=0,temp1;  //全局变量,所有程序有效

//unsigned char timerrom __attribute__((section(".eeprom")));//EEPROM 变量定义方式

unsigned char data[11]={0x3F,0x30,0x5B,0x79,0x74,0x6D,0x6F,0x38,0x7F,0x7D,0x00};
//					      0	  1		2	 3	  4		5	6	7	  8	  9
unsigned char display[6][4]={{0x00,0x00,0x00,0x00},//时钟
                        {0x00,0x00,0x00,0x00},//
						{0x00,0x00,0x00,0x00},//
						{0x00,0x00,0x00,0x00},//
						{0x00,0x00,0x00,0x00},//
						{0x00,0x00,0x00,0x00}};//

volatile unsigned int display1[6][4]={{0x3F,0x3F,0xBF,0x3F},//定时器
                        			 {0x3F,0x3F,0xBF,0x3F},//
					 	 			 {0x3F,0x3F,0xBF,0x3F},//
						 			 {0x3F,0x3F,0xBF,0x3F},//
						 			 {0x3F,0x3F,0xBF,0x3F},//
						 			 {0x00,0x00,0x00,0x00}};//
						 

unsigned char timerbit[5][4]={{0x00,0x00,0x00,0x00},//定时器状态
                        	 {0x00,0x00,0x00,0x00},//
							 {0x00,0x00,0x00,0x00},//
							 {0x00,0x00,0x00,0x00},//
							 {0x00,0x00,0x00,0x00}};//

unsigned char logtimer[5][4]={{0x00,0x00,0x00,0x00},//定时器状态
                        	 {0x00,0x00,0x00,0x00},//
							 {0x00,0x00,0x00,0x00},//
							 {0x00,0x00,0x00,0x00},//
							 {0x00,0x00,0x00,0x00}};//
							

void wr595(unsigned char DAT);
void our595(void);
/******************************************************************** */
//按键判断
/******************************************************************** */

void scankey()
{       if(switch1)
        {display_out();//防抖延时函数,可以适当增加减少,改变按键反应时间
		 display_out();}
		else
		{display1_out();
		 display1_out();}

		key_DDR = 0X08;
    	key_PORT=0XF7;
    	_delay_us(10);
		if(key_PIN==0xF1)
		key=16;

		key_DDR = 0X10;
		key_PORT = 0xEF;
		_delay_us(10);
		if(key_PIN==0xE9)	
		key=17;
		
		key_DDR = 0X20;
		key_PORT = 0xDF;
		_delay_us(10);
		if(key_PIN==0xD9)	
		key=18;

		key_DDR = 0X40;
		key_PORT = 0xBF;
		_delay_us(10);
		if(key_PIN==0xB9)	
		key=19;

		key_DDR = 0X80;
		key_PORT = 0x7F;
		_delay_us(10);
		if(key_PIN==0x79)	
		key=13;



        key_DDR = 0X08;
    	key_PORT=0XF7;
    	_delay_us(10);
	if(key_PIN==0xF3)
		key=1;
	if(key_PIN==0xF5)	 
		key=2;
	if(key_PIN==0xF6)	
		key=3;

	key_DDR = 0X10;
	key_PORT = 0xEF;
	_delay_us(10);
	if(key_PIN==0xEB)	
		key=4;
	if(key_PIN==0xED)	
		key=5;
	if(key_PIN==0xEE)	
		key=6;
		

	key_DDR = 0X20;
	key_PORT = 0xDF;
	_delay_us(10);
	if(key_PIN==0xDB)	
		key=7;
	if(key_PIN==0xDD)	
		key=8;
	if(key_PIN==0xDE)	
		key=9;


	key_DDR = 0X40;
	key_PORT = 0xBF;
	_delay_us(10);
	if(key_PIN==0xBB)	
		key=10;
	if(key_PIN==0xBD)	
		key=11;
	if(key_PIN==0xBE)	
		key=12;

	key_DDR = 0X80;
	key_PORT = 0x7F;
	_delay_us(10);
	if(key_PIN==0x7B)	
		key=13;
	if(key_PIN==0x7D)	
		key=14;
	if(key_PIN==0x7E)	
		key=15;

  if(switch1)
        {display_out();//防抖延时函数,可以适当增加减少,改变按键反应时间
	   	 display_out();
		 }
		else
		{display1_out();
		display1_out();
		 }
		  

	DDRB=0X00;
    PORTB=0X00;

}
/******************************************************************** */
//日期调整按键
/******************************************************************** */

void key_day(void)
	{
		switch( key )
		{	
	    	case	3:     v_Get1302(buffer3);          //年加
       				       temp1= BcdToBin(buffer3[6]);
						   if(temp1>=79)temp1=0;
						   else temp1++;
						   temp1=BinToBcd(temp1);
						   v_Setdd1302(0x8c,temp1);
	 				       v_Get1302(buffer3);
						   key=0;  
						    break;

		    case	4:	   v_Get1302(buffer3); 			//月加
          			   	   temp1= BcdToBin(buffer3[4]);
						   if(temp1>=12)temp1=1;
						   else temp1++;
						   temp1=BinToBcd(temp1);
						   v_Setdd1302(0x88,temp1);
	 				       v_Get1302(buffer3); 
						   key=0;  
						   break;

	    	case	6:	   v_Get1302(buffer3); 			//日加
          				   temp1= BcdToBin(buffer3[3]);
						   if(temp1>=31)temp1=1;
						   else temp1++;
						   temp1=BinToBcd(temp1);
						   v_Setdd1302(0x86,temp1);
	   					    v_Get1302(buffer3); 
							key=0;  
							break;

		    case   	7:	   v_Get1302(buffer3);			//小时加
          				    temp1= BcdToBin(buffer3[2]);
		  					if(temp1>=23)temp1=0;
		 					else temp1++;
		 					temp1=BinToBcd(temp1);
		  					 v_Setdd1302(0x84,temp1);
	      					v_Get1302(buffer3);
							key=0;
					 	    break;

	     	case	9:	   v_Get1302(buffer3);			//分钟加
        				   temp1= BcdToBin(buffer3[1]);
						   if(temp1>=59)temp1=0;
						   else temp1++;
		  				   temp1=BinToBcd(temp1);
						   v_Setdd1302(0x82,temp1);
	     				   v_Get1302(buffer3);
						   key=0;  
						    break;
   
		     default:
	       break;
       }
							
  }
/******************************************************************** */
//定时器调整按键
/******************************************************************** */

void key_timer(void)
	{
		switch( key )
		{	
	    	case	1:      if(!start1)	
							{if(timerbit[0][1]==9)		//一组,分加	                 
						     {timerbit[0][1]=0;
						       if(timerbit[0][0]==9)
							   timerbit[0][0]=0;
							   else timerbit[0][0]++;}
							 else  timerbit[0][1]++;
							logtimer[0][1]=timerbit[0][1];
							logtimer[0][0]=timerbit[0][0];
							//eeprom_write_word((unsigned char *)1,timerbit[0][0]);
							//eeprom_write_word((unsigned char *)2,timerbit[0][1]);							
							add_dec1=0;}
							key=0;
						    break;

		    case	2:	   if(!start1)
							{if(timerbit[0][3]==9)		//一组,秒加	                 
						     {timerbit[0][3]=0;
						       if(timerbit[0][2]==5)
							   timerbit[0][2]=0;
							   else timerbit[0][2]++;}
							 else  timerbit[0][3]++;
							logtimer[0][3]=timerbit[0][3];
							logtimer[0][2]=timerbit[0][2];
							//eeprom_write_word((unsigned char *)3,timerbit[0][2]);
							//eeprom_write_word((unsigned char *)4,timerbit[0][3]);
							add_dec1=0;}
							key=0;
						    break;

	    	case	3:	   if(stop1==0)
							{display1[5][1]=~display1[5][1];//一组,开始/暂停
							 if(display1[5][1])
							  display1[5][0]+=1;
							 else 
							  display1[5][0]-=1;							
							 start1=~start1;							
							 DDRB=0XF8;       
 							 PORTB=0X07; 
							 while(PINB!=0x07)       //如果有1脚为0即有按键动作
							  {display1_out();}
							 v_Get1302(buffer3);
							 if((timerbit[0][0]+timerbit[0][1]+timerbit[0][2]+timerbit[0][3])==0)
							  add_dec1=~add_dec1;							
							 start1_1=data[BcdToBin(buffer3[0]&0x0f)];}
							else {buzzer=0;
								  display1[5][1]=~display1[5][1];
								  if(display1[5][1])
								  display1[5][0]+=1;
								  else 
								  display1[5][0]-=1;
								  stop1=~stop1;
								  timerbit[0][0]=logtimer[0][0];
								  timerbit[0][1]=logtimer[0][1];
								  timerbit[0][2]=logtimer[0][2];
								  timerbit[0][3]=logtimer[0][3];

								  DDRB=0XF8;       
 								  PORTB=0X07; 
							      while(PINB!=0x07)       //如果有1脚为0即有按键动作
								   {display1_out();}								  
							 }
								  key=0;break;

		    case   	4:	    if(!start2)
							{if(timerbit[1][1]==9)		//二组,分加	                 
						     {timerbit[1][1]=0;
						       if(timerbit[1][0]==9)
							   timerbit[1][0]=0;
							   else timerbit[1][0]++;}
							 else  timerbit[1][1]++;
							logtimer[1][1]=timerbit[1][1];
							logtimer[1][0]=timerbit[1][0];
							add_dec2=0;}
							key=0;
						    break;

	     	case	5:	   if(!start2)
							{if(timerbit[1][3]==9)		//二组,秒加	                 
						     {timerbit[1][3]=0;
						       if(timerbit[1][2]==5)
							   timerbit[1][2]=0;
							   else timerbit[1][2]++;}
							 else  timerbit[1][3]++;
							logtimer[1][2]=timerbit[1][2];
							logtimer[1][3]=timerbit[1][3];
							add_dec2=0;}
							key=0;
						    break;

 			 case	6:	   	if(stop2==0)
							{display1[5][2]=~display1[5][2];//二组,开始/暂停
							 if(display1[5][2])
							  display1[5][0]+=2;
							 else 
							  display1[5][0]-=2;							
							 start2=~start2;							
							 DDRB=0XF8;       
 							 PORTB=0X07; 
							 while(PINB!=0x07)       //如果有1脚为0即有按键动作
							  {display1_out();}
							 v_Get1302(buffer3);
							 if((timerbit[1][0]+timerbit[1][1]+timerbit[1][2]+timerbit[1][3])==0)
							  add_dec2=~add_dec2;							
							 start2_2=data[BcdToBin(buffer3[0]&0x0f)];}
							else {buzzer=0;
								  display1[5][2]=~display1[5][2];
								  if(display1[5][2])
								  display1[5][0]+=2;
								  else 
								  display1[5][0]-=2;
								  stop2=~stop2;
								  timerbit[1][0]=logtimer[1][0];
								  timerbit[1][1]=logtimer[1][1];
								  timerbit[1][2]=logtimer[1][2];
								  timerbit[1][3]=logtimer[1][3];
								  DDRB=0XF8;       
 								  PORTB=0X07; 
							      while(PINB!=0x07)       //如果有1脚为0即有按键动作
								   {display1_out();}								  
							 }
								  key=0;break;

 		     case  	7:	   if(!start3) 
			 				{if(timerbit[2][1]==9)		//三组,分加	                 
						     {timerbit[2][1]=0;
						       if(timerbit[2][0]==9)
							   timerbit[2][0]=0;
							   else timerbit[2][0]++;}
							 else  timerbit[2][1]++;
							logtimer[2][1]=timerbit[2][1];
							logtimer[2][0]=timerbit[2][0];
							add_dec3=0;}
							key=0;
						    break;

	     	case	8:	   if(!start3)
							{if(timerbit[2][3]==9)		//三组,秒加	                 
						     {timerbit[2][3]=0;
						       if(timerbit[2][2]==5)
							   timerbit[2][2]=0;
							   else timerbit[2][2]++;}
							 else  timerbit[2][3]++;
							logtimer[2][2]=timerbit[2][2];
							logtimer[2][3]=timerbit[2][3];
							add_dec3=0;}
							key=0;
						    break;

			case	9:	   	if(stop3==0)
							{display1[5][3]=~display1[5][3];//三组,开始/暂停
							 if(display1[5][3])
							  display1[5][0]+=4;
							 else 
							  display1[5][0]-=4;							
							 start3=~start3;							
							 DDRB=0XF8;       
 							 PORTB=0X07; 
							 while(PINB!=0x07)       //如果有1脚为0即有按键动作
							  {display1_out();}
							 v_Get1302(buffer3);
							 if((timerbit[2][0]+timerbit[2][1]+timerbit[2][2]+timerbit[2][3])==0)
							  add_dec3=~add_dec3;							
							 start3_3=data[BcdToBin(buffer3[0]&0x0f)];}
							else {buzzer=0;
								  display1[5][3]=~display1[5][3];
								  if(display1[5][3])
								  display1[5][0]+=4;
								  else 
								  display1[5][0]-=4;
								  stop3=~stop3;
								  timerbit[2][0]=logtimer[2][0];
								  timerbit[2][1]=logtimer[2][1];
								  timerbit[2][2]=logtimer[2][2];
								  timerbit[2][3]=logtimer[2][3];
								  DDRB=0XF8;       
 								  PORTB=0X07; 
							      while(PINB!=0x07)       //如果有1脚为0即有按键动作
								   {display1_out();}								  
							 }
								  key=0;break;

			case   	10:	   if(!start4)
							{if(timerbit[3][1]==9)		//四组,分加	                 
						     {timerbit[3][1]=0;
						       if(timerbit[3][0]==9)
							   timerbit[3][0]=0;
							   else timerbit[3][0]++;}
							 else  timerbit[3][1]++;
							logtimer[3][1]=timerbit[3][1];
							logtimer[3][0]=timerbit[3][0];
							add_dec4=0;}
							key=0;
						    break;

	     	case	11:	   if(!start4)
							{if(timerbit[3][3]==9)		//四组,秒加	                 
						     {timerbit[3][3]=0;
						       if(timerbit[3][2]==5)
							   timerbit[3][2]=0;
							   else timerbit[3][2]++;}
							 else  timerbit[3][3]++;
							logtimer[3][2]=timerbit[3][2];
							logtimer[3][3]=timerbit[3][3];
							add_dec4=0;}
							key=0;
						    break;

			case	12:	   	if(stop4==0)
							{display[5][1]=~display[5][1];//四组,开始/暂停
							 if(display[5][1])
							  display1[5][0]+=8;
							 else 
							  display1[5][0]-=8;							
							 start4=~start4;							
							 DDRB=0XF8;       
 							 PORTB=0X07; 
							 while(PINB!=0x07)       //如果有1脚为0即有按键动作
							  {display1_out();}
							 v_Get1302(buffer3);
							 if((timerbit[3][0]+timerbit[3][1]+timerbit[3][2]+timerbit[3][3])==0)
							  add_dec4=~add_dec4;							
							 start4_4=data[BcdToBin(buffer3[0]&0x0f)];}
							else {buzzer=0;
								  display[5][1]=~display[5][1];
								  if(display[5][1])
								  display1[5][0]+=8;
								  else 
								  display1[5][0]-=8;
								  stop4=~stop4;
								  timerbit[3][0]=logtimer[3][0];
								  timerbit[3][1]=logtimer[3][1];
								  timerbit[3][2]=logtimer[3][2];
								  timerbit[3][3]=logtimer[3][3];
								  DDRB=0XF8;       
 								  PORTB=0X07; 
							      while(PINB!=0x07)       //如果有1脚为0即有按键动作
								   {display1_out();}								  
							 }
								  key=0;break;

			case   	13:	   if(!start5)
							{if(timerbit[4][1]==9)		//五组,分加	                 
						     {timerbit[4][1]=0;
						       if(timerbit[4][0]==9)
							   timerbit[4][0]=0;

⌨️ 快捷键说明

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