📄 1602菜单实验.c
字号:
/*************************************************************************************
项 目:
编 译 器:
目 标 芯 片:
时 钟:
建 立 日 期:
最 后 修改 日期:
*****************************************************************************************/
/*------------------------------------------------------------------------------------------
头文件
------------------------------------------------------------------------------------------*/
#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 + -