51单片机驱动ds12887c语言,51单片机+DS12887+12864大数字时钟程序+电路
/*---------------------------------------------------------------------------
電子智能時鐘程序
單 片 機:STC89C52RC
晶? ? 振:12MHz
時鐘芯片:DS12887
液 晶 屏:LCM-12864-ST7920
時? ? 間:2010年3月28日
LCM12864使用并口連接方式,PSB、RST接高電平
頭文件----------------------------------------------------------------------*/
#include
#include
#include "LCD12864.h"
#include "DS12CR887.h"
#include "DS18B20.h"
#include "nongli.h"
#include "displaytime.h"
#define uint??unsigned int
#define uchar unsigned char
/*--------------------定義按鍵-----------------------------------------------*/
sbit K1??= P3^2; //K1-設置
sbit K2??= P3^1; //K2-確認、返回
sbit K3??= P3^0; //K3-加
sbit K4??= P1^7; //K4-減
sbit K5??= P1^6; //液晶背光控制按鍵,按一下亮,再按一下滅
sbit BLK = P1^3; //液晶背光控制輸出,低電平有效,PNP三極管控制。
void DelayM(uint);
/*定義變量-------------------------------------------------------------------*/
bit q=0, w=0;? ? //調時標志位
/*延時函數 1MS/次------------------------------------------------------------*/
void DelayM(uint a)
{
uchar i;
while( --a != 0) { for(i = 0; i < 125; i++); }
}
/*日期、時間設置函數---------------------------------------------------------*/
void Set_time(uchar sel)
{
signed char address,item;
signed char max,mini;
unsigned char yy,mo,moontemp1,moontemp2;
ds_write(0x0a,0x00);? ???//進入調時,關閉時鐘振蕩器
write_com(0x30); write_com(0x06);
write_com(0x98); lcm_w_word("設置");
if(sel==5)??{lcm_w_word("秒鐘");address=0; max=59;mini=0;}??//秒鐘0
if(sel==4)??{lcm_w_word("分鐘");address=2; max=59;mini=0;}??//分鐘2
if(sel==3)??{lcm_w_word("小時");address=4; max=23;mini=0;}??//小時4
//? ? ? ? if(sel==3)??{lcm_w_word("星期");address=6; max=7; mini=1;}??//星期6??修改為自動計算
//? ? ? ? if(sel==2)??{lcm_w_word("日期");address=7; max=31;mini=1;}??//日期7
if(sel==2)??{lcm_w_word("日期");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //日期修改為按月份實際天數調整
address=7;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //日期7
mo = ds_read(0x08);//讀月
moontemp1=mo/16;
moontemp2=mo%16;
mo=moontemp1*10+moontemp2;//轉換成10進制月份數據
yy = ds_read(0x09);//讀年
moontemp1=yy/16;
moontemp2=yy%16;
yy=moontemp1*10+moontemp2;//轉換成10進制年份數據
if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
if(mo==2&&yy%4==0){max=29;mini=1;}//閏年2月29天
if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//每月31天的月份
if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;} //每月30天的月份
}
if(sel==1)??{lcm_w_word("月份");address=8; max=12;mini=1;}??//月份8
if(sel==0)??{lcm_w_word("年份");address=9; max=99;mini=0;}??//年份9
item=ds_read(address);? ? ? ???//讀取DS12CR887某地址上的數值賦給item
if(K3 == 0) {item++;}? ? //K3-加數:1
if(K4 == 0) {item--;}? ? //K4-減數:1
if(item>max) item=mini;??//限制數值最大有效范圍
if(item
ds_write(address,item);??//將調整好的item值寫入DS12CR887
displaydate(); ? ? ? ? ? ? ? ? ? ? ? ???//顯示日期
displaytime();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//顯示時間
displaynl();? ? ? ? ? ? ? ? ? ? ? ???? ? ? ???//顯示農歷
displayxq();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//顯示星期
}
/*主函數---------------------------------------------------------------------*/
void main()
{
uchar e=0;
K1=1;K2=1;K3=1;K4=1;K5=1;BLK=0;
ds_int();? ? ? ? ? ? ? ? ? ? ? ? //時鐘芯片初始化
lcm_init();? ? ? ? ? ? ? ? ? ? ? ? //液晶初始化
welcome();? ? ? ? ? ? ? ? ? ? //調用歡迎信息
DelayM(2000); ? ? ? ? ? ? ? ? //延時
lcm_clr();? ?? ?? ?? ?//清屏
Clean_12864_GDRAM();? ? ? ???//清屏
while(1)
{
if (w == 0) ? ? ? ? ? ? ? ???//正常走時
{
displaydate();? ? ? ???//顯示日期
displaynl();? ? ? ???//顯示農歷
displaytime();? ? ? ???//顯示時間
read_temp();? ? ? ???//讀取溫度
ds1820disp(); ? ? ? ???//顯示溫度
displayxq();
}
else {}? ?? ?? ?? ???//否則啟動調時
/*----------------------------設置時間--------------------------------------*/
if (K1 == 0)
{
DelayM(20);? ? ? ?? ?? ?? ?? ?? ? //按鍵消抖
if(K1 == 0 && w == 1)? ?? ?//當是調時狀態 本鍵用于調整下一項
{
e++;
if (e >= 7 ) {e = 0;}
while(! K1 );? ?? ?? ?? ?//等待鍵松開
Set_time(e);? ?? ?? ???//調整
}
if(K1 == 0 && w == 0)? ?? ?//當是正常狀態時就進入調時狀態
{
lcm_clr();
Clean_12864_GDRAM();? ?//清屏
w=1;? ? ? ?? ?? ?? ?? ?? ? //進入調時
Set_time(e);
}
while(K1 == 0);? ?? ?? ?? ?//等待鍵松開
}
/*--------------------------------------------------------------------------*/
if (K2 == 0)? ?? ?? ?? ?? ?? ? // 當在調時狀態時就退出調時
{
DelayM(20);
if(K2 == 0 && w == 1)
{
w = 0;? ? ? ?? ?? ?? ?? ?? ? //退出調時
e = 0;? ? ? ? ? ? ? ?? ?? ?? ?? ?//"下一項"計數器清0
}
if(K2 == 0 && w == 0)
{
lcm_clr(); Clean_12864_GDRAM();
write_com(0x30); write_com(0x06);
welcome();
while(K2 == 0);
}
lcm_clr(); Clean_12864_GDRAM();
ds_write(0x0a,0x20);? ?? ? //調時完畢,開啟時鐘振蕩器
displaydate();
displaynl();
displaytime();
read_temp();
ds1820disp();
while(K2 == 0);
}
/*加調整--------------------------------------------------------------------*/
if (K3 == 0 && w == 1)
{
DelayM(20);
if(K3 == 0 && w == 1) { Set_time(e); }
//? ? ? ? ? ? ? ? ? ? ? ? while(K3 == 0);
while(! K3 );
}
/*減調整--------------------------------------------------------------------*/
if (K4 == 0 && w == 1)
{
DelayM(20);
if(K4 == 0 && w == 1) { Set_time(e); }
//? ? ? ? ? ? ? ? ? ? ? ? while(K4 == 0);
while(! K4 );
}
/*液晶背光控制,按一下亮,再按一下滅----------------------------------------*/
if(K5 == 0)
{
DelayM(20); q = ~q;? ?? ?//標志位取反
if(q){BLK = BLK | 1;}
else {BLK = BLK & 0;}
while(K5 == 0);
}
}
}
/*結束----------------------------------------------------------------------*/
總結
以上是生活随笔為你收集整理的51单片机驱动ds12887c语言,51单片机+DS12887+12864大数字时钟程序+电路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都理工大学c语言复试,2020年成都理
- 下一篇: c语言中二次规划函数是哪个好,c语言程序