|
单片机万年历1602仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真
单片机源程序如下:
- //此为主程序,查看完成下载附件,包含仿真,可运行
- #include "reg52.h"
- #include "main.h"
- #include "LCD1602.h" //显示模块函数在LCD1602.c文件中
- //屏幕中第一行和第二行显示的框架
- code char lcd_line[2][16]={
- "Date 20__-__-__ ", //显示日期
- "Time __:__:__ ", //显示时间
- };
- //按键
- sbit S1 = P3^1; //设置
- sbit S2 = P3^5; //加
- sbit S3 = P3^6; //减
- //当前时间
- char time_hour=23;
- char time_min=59;
- char time_sec=55;
- char time_year=18;
- char time_month=6;
- char time_day=30;
- uchar mode = 0; //当前模式
- //STC89系列单片机延时1ms
- void delay_ms(unsigned int x)
- {
- char j=0;
- while(x--)
- for(j=0;j<125;j++)
- ;
- }
- //读取时间数据
- void read_ds1302_all()
- {
- time_hour = ds1302_read_hour();//读取小时
- time_min = ds1302_read_min();//分钟
- time_sec = ds1302_read_sec(); //秒钟
- time_year = ds1302_read_year();
- time_month = ds1302_read_month();
- time_day = ds1302_read_day();
- }
- //显示
- void display_time()
- {
- //时分秒
- lcd_write_char(6,1,time_hour/10+'0');
- lcd_write_char(7,1,time_hour%10+'0');
- lcd_write_char(9,1,time_min/10+'0');
- lcd_write_char(10,1,time_min%10+'0');
- lcd_write_char(12,1,time_sec/10+'0');
- lcd_write_char(13,1,time_sec%10+'0');
- //年月日
- lcd_write_char(7,0,time_year/10+'0');
- lcd_write_char(8,0,time_year%10+'0');
- lcd_write_char(10,0,time_month/10+'0');
- lcd_write_char(11,0,time_month%10+'0');
- lcd_write_char(13,0,time_day/10+'0');
- lcd_write_char(14,0,time_day%10+'0');
- }
- //按键扫描
- char key_scan()
- {
- if(S1==0 || S2==0 || S3==0) // 如果按下了
- {
- delay_ms(5); //去抖动
- if(S1==0 || S2==0 || S3==0) //确实按下了
- {
- if(S1==0){while(S1==0); return 1;} //按键1确实按下了。依此类推。
- if(S2==0){while(S2==0); return 2;} //
- if(S3==0){while(S3==0); return 3;} //
- }
- }
- return 0; //没有按键按下
- }
- //按键动作
- void key_action()
- {
- char key=0;
- key=key_scan();
- if(key == 0) return;
- if(key==1)
- {
- mode++;
- if(mode > 6)
- {
- mode = 0;
- lcd_write(0,0x0c);//显示器开,光标关,字符不闪烁
- }
- }
- switch(mode)
- {
- case 1: //秒
- {
-
- lcd_write(0,0x0f); //光标闪烁
- lcd_write(0,0x80+0x40+13); //位置
- if(key==2){time_sec++;} //秒++
- if(key==3){time_sec--;} //秒--
- if(time_sec>=60){time_sec=0;}
- if(time_sec<0){time_sec=59;}
- lcd_write_char(12,1,time_sec/10+'0'); //显示
- lcd_write_char(13,1,time_sec%10+'0');
- lcd_write(0,0x80+0x40+13); //回到原位
- ds1302_set_sec(time_sec );
-
- }
- break;
- case 2: //分
- {
-
- lcd_write(0,0x0f); //光标闪烁
- lcd_write(0,0x80+0x40+10); //定位
- if(key==2){time_min++;} //分++
- if(key==3){time_min--;} //分--
- if(time_min>=60){time_min=0;}
- if(time_min<0){time_min=59;}
- lcd_write_char(9,1,time_min/10+'0'); //显示
- lcd_write_char(10,1,time_min%10+'0');
- lcd_write(0,0x80+0x40+10); //回到原位
- ds1302_set_min(time_min );
- }
- break;
- case 3: //时
- {
-
- lcd_write(0,0x0f); //光标闪烁
- lcd_write(0,0x80+0x40+7); //定位
- if(key==2){time_hour++;} //时++
- if(key==3){time_hour--;} //时--
- if(time_hour>=24){time_hour=0;}
- if(time_hour<0){time_hour=23;}
- lcd_write_char(6,1,time_hour/10+'0'); //显示
- lcd_write_char(7,1,time_hour%10+'0');
- lcd_write(0,0x80+0x40+7); //回到原位
- ds1302_set_hour(time_hour);
- }
- break;
- case 4: //年
- {
-
- lcd_write(0,0x0f);
- lcd_write(0,0x80+8);
- if(key==2){time_year++;}
- if(key==3){time_year--;}
- lcd_write_char(7,0,time_year/10+'0');
- lcd_write_char(8,0,time_year%10+'0');
- lcd_write(0,0x80+8); //回到原位
- ds1302_set_year(time_year);
- }
- break;
- case 5: //月
- {
-
- lcd_write(0,0x0f);
- lcd_write(0,0x80+11);
- if(key==2){time_month++;}
- if(key==3){time_month--;}
- if(time_month>12){time_month=1;}
- if(time_month<0){time_month=12;}
- lcd_write_char(10,0,time_month/10+'0');
- lcd_write_char(11,0,time_month%10+'0');
- lcd_write(0,0x80+11); //回到原位
- ds1302_set_month(time_month);
- }
- break;
- case 6: //日
- {
-
- lcd_write(0,0x0f);
- lcd_write(0,0x80+14);
- if(key==2){time_day++;}
- if(key==3){time_day--;}
- //判断28天30天或31天
- if(time_min==2) //2月28天
- {
- if(time_day>28){time_day=0;}
- if(time_day<0){time_day=28;}
- }
- if(time_month==4 || time_month==6 || time_month==9 || time_month==11) //30天
- {
- if(time_day>30){time_day=0;}
- if(time_day<0){time_day=30;}
- }
- if(time_month==1 || time_month==3 || time_month==5 || time_month==7 || time_month==8 || time_month==10 || time_month==12 ) //31天
- {
- if(time_day>31){time_day=0;}
- if(time_day<0){time_day=31;}
- }
- lcd_write_char(13,0,time_day/10+'0');
- lcd_write_char(14,0,time_day%10+'0');
- lcd_write(0,0x80+14); //回到原位
- ds1302_set_day(time_day);
- }
- break;
- }
- }
- //主程序
- void main()
- {
- lcd_init();//LCD1602液晶显示屏初始化
- ds1302_init();
- lcd_write_line(0,lcd_line[0]);//屏幕显示第一行框架
- lcd_write_line(1,lcd_line[1]);//屏幕显示第二行框架
- ds1302_set_sec(time_sec);
- ds1302_set_min(time_min);
- ds1302_set_hour(time_hour);
- //
- ds1302_set_day(time_day);
- ds1302_set_month(time_month);
- ds1302_set_year(time_year);
- //主循环
- while(1)
- {
- key_action();
-
- if(!mode) //没有进入设定时间
- {
- read_ds1302_all(); //显示年月日时分秒
- display_time(); //显示
- }
- else //读回设定时间
- {
- ds1302_set_sec(time_sec);
- ds1302_set_min(time_min);
- ds1302_set_hour(time_hour);
- //
- ds1302_set_day(time_day);
- ds1302_set_month(time_month);
- ds1302_set_year(time_year);
- }
-
- }
- }
- ////////////////////////////////////
复制代码
所有资料51hei提供下载:
ds1302万年历.rar
(107.16 KB, 下载次数: 488)
|
评分
-
查看全部评分
|