📄 keyboard.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 + -