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

📄 keyboard.c

📁 本程序源码为基于51单片机的lcd显示万年历
💻 C
字号:
/*硬件连接:
将Lcd1602插入主板的Lcd1602插槽,
使用连接线将LCD1602的引针接口连接到MCU:
//LCD1602,8位接口,即使用D0-D7数据口接入MCU_P1
//P0.4 --- jing//蜂鸣器
//P0.3 --- A //背光灯 LCD_A
//P0.2 --- RS  LCD_RS
//P0.1 --- R/W LCD_R/W
//P0.0 --- E   LCD_E
//P1.0 --- D0
//P1.1 --- D1
//P1.2 --- D2
//P1.3 --- D3
//P1.4 --- D4 
//P1.5 --- D5 
//P1.6 --- D6 
//P1.7 --- D7 
*/
#define with_Calendar 1  //是否编译 万年历 部分程序
#include"LCD1602.h"
#include"LCD1602.c"
#define Back_LED_open LCD_A=0    //LCD背景灯开
#define Back_LED_close LCD_A=1
#define Alarm_open jing=0        //鸣响,报警
#define Alarm_close jing=1
#define Time_set_byte_select_hour 0
#define Time_set_byte_select_min 1
#define Time_set_byte_select_day 2
#define Time_set_byte_select_month 3
#define Time_set_byte_select_year_plug 4
#define Time_set_byte_select_year_del 5


sbit jing=P0^4;   //蜂鸣器报警引脚
sbit drip_signal=P3^4;
sbit liquid_level=P3^5;
sbit swl=P0^7;//左侧按键
sbit swr=P0^6;//右侧按键
unsigned char time[15]="N/A  /04/09",month=04,day=1,hour=12,min=0,second=0;
unsigned int  year=2009,n=3999;
unsigned char rate_set=60,rate=0;
bit time_or_rate=0;       //标志时间设置1还是液滴速度设置0
bit	set_mode=0,if_selected_set_target=0;
unsigned char time_set_byte_select;
bit leap;    //闰年标志位
main(){
	void timer_inital();
	void refurbish_screen();//刷新显示声明
	void time_read();
	void time_save();
	void refurbish_screen();
	void keyboard();
	void check_if_leap();

	lcd_init();
	Back_LED_open;
	check_if_leap();
	lcd_goto_xy(0,0);
	lcd_puts("wellcome to use!");
	lcd_xy_puts(0,1,"Set Date Please!");
	lcd_delay_ms(250);
	lcd_delay_ms(250);
	lcd_delay_ms(250);
	timer_inital();
//	Alarm_open;
	while(1){
	lcd_delay_ms(50);
	if(!set_mode|if_selected_set_target)
		refurbish_screen();
	keyboard();
	}
}
void keyboard(void){
void delay_s(char);
void check_if_leap();
	if(!swl&!swr){
		while(!swl&!swr);
		if(set_mode){
			time_set_byte_select=set_mode=if_selected_set_target=time_or_rate=0;
			TCON=0x50;
			return;
		}
		else{
			if(time_or_rate)TCON=0;
			set_mode=1;
			lcd_xy_puts(0,0,"1.Set Drip speed");
			lcd_xy_puts(0,1,"2.Set Date&Time ");
			delay_s(1);
		}
	}
	if(!swl&swr){
		while(!swl&swr);
		if(set_mode){
			if(if_selected_set_target){
				if(time_or_rate){
					switch(time_set_byte_select){
					case Time_set_byte_select_hour:
						if(hour<23)hour++;
						else hour=0;
						break;
					case Time_set_byte_select_min:    
						if(min<59)min++;
						else min=0;
						break;
					case Time_set_byte_select_day:
						if(day<28)day++;
						else{
						 switch(month)
						 {
						 case 1:
						 case 3:
						 case 5:
						 case 7:
						 case 8:
						 case 10:
						 case 12:if(day<31)day++;
						 		 else
									day=1;
								 break;
						 case 4:
						 case 6:
						 case 9:
						 case 11:if(day<30)day++;
						 		 else
									day=1;
								 break;
						 case 2:if(leap){
						 		if(day<29)day++;
								else day=1;
						 		}
						 		else day=1;
						 }

						}
						break;
					case Time_set_byte_select_month:
						if(month<12)month++;
						else month=1;
						break;
					case Time_set_byte_select_year_plug:
						year++;
						break;
					case Time_set_byte_select_year_del:
						year--;
						break;
					}
				check_if_leap();
				}
				else rate_set--;
			}
			else{                              //按此键选择液滴速度设置
				lcd_xy_puts(0,0,"Wellcome to set ");
				lcd_xy_puts(0,1,"  Drip Speed    ");
				time_or_rate=0;
				if_selected_set_target=1;
				delay_s(3);
				refurbish_screen();
			}
		}
		else rate_set--;
	}
	if(swl&!swr){
		while(swl&!swr);
		if(set_mode){
			if(if_selected_set_target){
				if(time_or_rate){
					if(time_set_byte_select<5)
						time_set_byte_select++;
					else 
						time_set_byte_select=0;
				}
				else rate_set++;
			}
			else{
				lcd_xy_puts(0,0,"Wellcome to set ");
				lcd_xy_puts(0,1,"   Date&Time    ");
				time_or_rate=1;
				if_selected_set_target=1;
				delay_s(3);
				refurbish_screen();
			}
		}
		else rate_set++;
	}
}
void timer_inital(void){
	PSW=0;
	TCON=0;
	TMOD=0x25;
	TL1=6;
	TH1=6;//溢出一次250us
	TR1=1;
//	TR0=1;
	IE=0x8a;
}

void counter_INT()interrupt 1 using 3{
	EA=0;
	lcd_xy_puts(0,1,"Over >65525/min");
	TCON=0x50;
	EA=1;
}
void timer_INT() interrupt 3 using 2{
	EA=0;
	Alarm_close;
	if(n)n--;
	else {
		n=3999;
		if(second<59){
			second++;
			if(second%2)time[2]=' ';else time[2]=':';
		}
#if with_Calendar 
		else {
			second=0;
			if(min<59)min++;
			else {
				min=0;
				if(hour<23)hour++;
				else{
					 hour=0;
					 if(day<28)day++;
					 else{
						 switch(month)
						 {
						 case 1:
						 case 3:
						 case 5:
						 case 7:
						 case 8:
						 case 10:
						 case 12:if(day<31)day++;
						 		 else{
								 	if(month<12)month++;
									else month=1,year++;
									day=1;
									}break;
						 case 4:
						 case 6:
						 case 9:
						 case 11:if(day<30)day++;
						 		 else{
								 	if(month<12)month++;
									else month=1,year++;
									day=1;
									}break;
						 case 2:
							if(leap){
								if(day<29)day++;
								else{
								 	if(month<12)month++;
									else month=1,year++;
									day=1;
								 }
							 }
							 else{
							 	if(month<12)month++;
								else month=1,year++;
								day=1;
							 }
						 }
						 }
					 }
				}
			}
#endif
	}
	TCON=0x50;
	EA=1;
}
void refurbish_screen(void){
	unsigned char a;
	Clear_screen();
	lcd_xy_puts(0,0,"T:");
	a=year%100;
	time[13]=a%10+0x30;
	time[12]=a/10+0x30;
	time[5]=time[8]=time[11]='/';
	time[10]=month%10+0x30;
	time[9]=month/10+0x30;
	time[7]=day%10+0x30;
	time[6]=day/10+0x30;
//	time[2]=':';
	time[4]=min%10+0x30;
	time[3]=min/10+0x30;
	time[1]=hour%10+0x30;
	time[0]=hour/10+0x30;
	lcd_puts(time);
	lcd_xy_puts(0,1,"Rate");
	lcd_putc(rate%10+0x30);
	lcd_putc(rate/10%10+0x30);
	lcd_putc(rate/100+0x30);
	lcd_puts("/min ");
	lcd_xy_putc(15-4,1,'(');
	lcd_putc(rate_set/100+0x30);
	lcd_putc(rate_set/10%10+0x30);
	lcd_putc(rate_set%10+0x30);
	lcd_putc(')');
}

void time_read(void){
	void EEPROM_read();
	void EEPROM_write();

}
void time_write(void){
	void EEPROM_read();
	void EEPROM_write();

}
void check_if_leap(void){
 		if(year%4)
 			leap=0;
		else{
			if(year%100)leap=1;
			else{
				if(year%400)
				 	leap=0;
				else
					leap=1;
			}
		}
}
void delay_s(unsigned char n){
	for(n*=10;n>0;n--)
	lcd_delay_ms(100);
}

⌨️ 快捷键说明

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