仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <STC89C5xRC.H>
- #include "12864.h"
- #include "1302.h"
- #include "wenzi.h"
- #define uchar unsigned char
- #define uint unsigned int
- //===============接口定义===============
- sbit key1 = P3^2; //确定/设置 按键
- sbit key2 = P3^3; //减 键
- sbit key3 = P3^4; //加 键
- sbit key4 = P3^5; //返回键
- sbit LED = P2^0; //背光
- sbit beep = P2^1; //喇叭
- sbit GY=P3^7;
- //======================================
- uchar year,month,date,xq,hour,minute,second,shi,ge,ge1,shi1,ddd; //时间/闹钟相关
- uchar t_ss,t_ss1,t_mm,t_hh,t_dd,t_xq,t_yf,t_yy; //走时变量
- uchar idata t,danian; //农历 t:节日显示跳转时间 danian判断12月份大小月
- bit idata f0,f1,f2,f3; //反白相关标志
- uchar idata setk,setc;
- uchar e,k,n;
- uchar idata kk,kk1,bgk,bsj,bld;
- bit idata w;
- uchar idata ta,tb;
- bit idata dinga;
-
- //==============延时函数===================
- void Delay(int num)
- {
- while(num--) ;
- }
- //============反白标志================
- void f_qc(void)
- {
- f0=f1=f2=f3=0;
- }
- void displaytime(void)
- {
- year=read_random(DS3231_YEAR);//调用3231时钟数据中的年数据,从地址0x8d中
- WRITE_STRING(3,0,0,year/10,0);
- WRITE_STRING(3,1,0,year%10,0);
- WRITE_STRING(3,1,1,8,0); //年
-
- month=read_random(DS3231_MONTH);//调用3231时钟数据中的月数据,从地址0x05中
- WRITE_STRING(3,4,0,month/10,0);
- WRITE_STRING(3,5,0,month%10,0);
- WRITE_STRING(3,3,1,7,0); //月
-
- date=read_random(DS3231_DAY);//从3231芯片中读取日数据,从地址0x04中
- WRITE_STRING(3,8,0,date/10,0);
- WRITE_STRING(3,9,0,date%10,0);
- WRITE_STRING(3,5,1,6,0); //日
-
- xq=read_random(DS3231_WEEK);//从3231芯片中读取日数据,从地址0x04中
- WRITE_STRING(3,7,1,xq-1,0);
- //小时
- hour =read_random(DS3231_HOUR); //从3231芯片中读取小时数据,从地址0x02中
- WRITE_STRING(0,0,2,hour/10,0);
- WRITE_STRING(0,1,2,hour%10,0);
- WRITE_STRING(0,2,2,10,0); //时
- //分钟
- minute= read_random(DS3231_MINUTE); //从3231芯片中读取分钟数据,从地址0x01中
- WRITE_STRING(0,3,2,minute/10,0);
- WRITE_STRING(0,4,2,minute%10,0);
- WRITE_STRING(0,5,2,10,0); //分
- //秒钟
- second =read_random(DS3231_SECOND); //从3231芯片中读取秒钟数据,从地址0x01中
- WRITE_STRING(0,6,2,second/10,0);
- WRITE_STRING(0,7,2,second%10,0);
-
- //WRITE_STRING(3,7,1,xq,c);
- }
-
- void Set_time(uchar sel)
- {
- signed char address,item;
- signed char max,mini;
- if(sel==0) {WRITE_STRING(2,7,1,8,0);address=DS3231_YEAR; max=99; mini=0;} //年?????
- if(sel==1) {WRITE_STRING(2,7,1,7,0);address=DS3231_MONTH; max=12; mini=1;} //月
- if(sel==2) {WRITE_STRING(2,7,1,6,0);address=DS3231_DAY; max=31; mini=1;} //日
- if(sel==3) {WRITE_STRING(2,7,1,9,0);address=DS3231_WEEK; max=7;mini=1;}//星
- if(sel==4) {WRITE_STRING(2,7,1,11,0);address=DS3231_HOUR; max=23;mini=0;}//时
- if(sel==5) {WRITE_STRING(2,7,1,12,0);address=DS3231_MINUTE; max=59;mini=0;}//钟
-
- //读取3231某地址上的数值转换成10进制赋给item
- item=(read_random(address));
- if(key3 == 0){item++;}
- if(key4 == 0){item--;}
- if(item>max) item=mini;
- if(item<mini) item=max;
- //write_byte(0, 0x98);//允许写操作
- write_byte(address,(item/10)*16+item%10);//转换成10进制写入3231
- // write_byte(0x8e,0x80);//写保护,禁止写操作
-
- DelayM(20);
- displaytime();
-
- }
-
- void main()
- {
- uchar e=0;
- LCD_ST7565_INIT(); //液晶初始化
- Lcd12864_ClearScreen(); //清屏
- while(1)
- {
- if(w==0)
- {
- displaytime();//显示时间
- } //正常走时
- else {} //否则启动调时
- //设置键------------------------------------------------------------------------
- if (key1 == 0) // 设置时间
- {
- DelayM(20); //按键消抖
- if(key1 == 0 && w == 1) //当是调时状态 本键用于调整下一项
- {
- e++;
- if (e >= 6 ){e = 0;}
- Set_time(e); //调整
- }
- if(key1 == 0 && w == 0) //当是正常状态时就进入调时状态
- {
- Lcd12864_ClearScreen(); //清屏
- w=1; //进入调时
- Set_time(e); //调整
- }
- while(key1 == 0); //等待键松开
- }
- //确认,返回键-------------------------------------------------------------------
- if (key2 == 0) //在调时状态时就退出调时
- {
- DelayM(20); //按键消抖
- if(key2 == 0 && w == 1)
- {
- w = 0; //退出调时
- e = 0; //"下一项"计数器清0
- }
- if(key2 == 0 && w == 0)
- {
- Lcd12864_ClearScreen(); //清屏
- while(key2 == 0);
- }
- Lcd12864_ClearScreen(); //清屏
- displaytime(); //显示时间
- while(key2 == 0);
- }
- //加调整------------------------------------------------------------------------
- if (key3 == 0 && w == 1)
- {
- DelayM(20);
- if(key3 == 0 && w == 1) { Set_time(e); }
- while(key3 == 0);
- }
- //减调整------------------------------------------------------------------------
- if (key4 == 0 && w == 1)
- {
- DelayM(20);
- if(key4 == 0 && w == 1) { Set_time(e); }
- while(key4 == 0);
- }
- }
- /*液晶背光控制,按一下亮,再按一下灭----------------------------------------
- if(K5 == 0)
- {
- DelayM(20); q = ~q; //标志位取反
- if(q){BLK = BLK | 1;}
- else {BLK = BLK & 0;}
- while(K5 == 0);
- } */
- }
复制代码
所有资料51hei提供下载:
st12864电子钟+ds3232 -成功显示可调时钟.7z
(125.97 KB, 下载次数: 105)
|