?? 仿造樣板ds12cr887mnl.c
字號:
/*-----------------------------------------------------------------------------
電子智能時鐘程序
單片機:STC89C52RC
晶振:12MHz
時鐘芯片:DS12CR887+5
液晶屏:LCM-12864-ST7920
時間:2009年2月11日
LCM12864使用并口連接方式
-----------------------------------------------------------------------------*/
/*頭文件---------------------------------------------------------------------*/
#include <reg52.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
/*定義全局變量---------------------------------------------------------------*/
uchar sec,min,hour, day, date, month,year;
//秒,分,小時,星期,日期,月, 年
bit w = 0; //調時標志位
/*定義12864液晶屏數據線------------------------------------------------------*/
sbit LCM_RS = P1^0; //模式位,為0輸入指令,為1輸入數據
sbit LCM_RW = P1^1; //讀寫位,為0讀,為1寫
sbit LCM_EN = P1^2; //使能位
sbit LCM_PSB = P1^5; //H=并口; L=串口
sbit LCM_RST = P1^6;
#define Lcd_Bus P0 //LCM12864數據總線
/*定義按鍵-------------------------------------------------------------------*/
sbit K1 = P1^7; //K1-設置
sbit K2 = P3^2; //K2-確認
sbit K3 = P3^1; //K3-加
sbit K4 = P3^0; //K4-減
/*定義蜂鳴器-----------------------------------------------------------------*/
//sbit beep = P1^3;
/*定義DS18B20數據線----------------------------------------------------------*/
sbit DQ = P1^4;
/*定義DS12CR887數據線--------------------------------------------------------*/
sbit DS_CS = P3^4;
sbit DS_AS = P3^5;
sbit DS_RW = P3^6;
sbit DS_DS = P3^7;
#define Ds_Bus P2 //DS12CR887數據總線
/*定義累加器A中的各位--------------------------------------------------------*/
sbit a0 = ACC ^ 0;
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
/*延時程序-------------------------------------------------------------------*/
//延時函數 1MS/次
void DelayM(uint a)
{
uchar i;
while( --a != 0)
{
for(i = 0; i < 125; i++); //一個 ; 表示空語句,CPU空轉。
} //i 從0加到125,CPU大概就耗時1毫秒
}
//延時函數
void Delay(int num)
{
while(num--);
}
/*DS12CR887驅動程序----------------------------------------------------------*/
//往DS12CR887寫數據函數
void ds_write(uchar add,uchar date)
{
DS_CS=0;
DS_DS=1;
DS_RW=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_RW=0;
Ds_Bus=date;
DS_RW=1;
DS_AS=1;
DS_CS=1;
}
//讀取DS12CR887的數據
uchar ds_read(uchar add)
{
uchar z;
DS_CS=0;
DS_RW=1;
DS_DS=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_DS=0;
Ds_Bus=0xff;
z=Ds_Bus;
DS_DS=1;
DS_AS=1;
DS_CS=1;
return z;
}
//DS12CR887初始化
void ds_int()
{
DS_AS=0;
DS_DS=0;
DS_RW=0;
ds_write(0x0a,0x20);//DS12CR887寄存器A功能設置,開啟時鐘振蕩器
}
/*12864液晶顯示屏并口驅動程序------------------------------------------------*/
//檢查忙位(底層)
void chk_busy()
{
LCM_RS=0;
LCM_RW=1;
LCM_EN=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
LCM_EN=0;
}
//寫指令到LCD(底層)
void write_com(uchar cmdcode)
{
chk_busy();
LCM_RS=0;
LCM_RW=0;
LCM_EN=1;
Lcd_Bus=cmdcode;
LCM_EN=0;
}
//寫數據到LCD(底層)
void write_data(uchar Dispdata)
{
chk_busy();
LCM_RS=1;
LCM_RW=0;
LCM_EN=1;
Lcd_Bus=Dispdata;
LCM_EN=0;
}
//初始化LCD屏(被調用層)
void lcm_init()
{
LCM_PSB=1; //如果液晶屏的PSB在電路板中接了高電平的,這里可以屏蔽
LCM_RST=1; //如果液晶屏的RST在電路板中接了高電平的,這里可以屏蔽
write_com(0x30); //選擇8bit數據流
write_com(0x0c); //開顯示(無游標、不反白)
write_com(0x01); //清除顯示,并且設定地址指針為00H
}
//向LCM發送一個字符串,長度64字符之內。(被調用層)
//應用:lcm_w_word("您好!");
void lcm_w_word(uchar *s)
{
while(*s>0)
{
write_data(*s);
s++;
}
}
//寫指令或數據(被調用層)
void lcm_w_test(bit i,uchar word)
{
if(i == 0)
{
write_com(word);//寫指令或數據(0,指令)
}
else
{
write_data(word);//寫指令或數據(1,數據)
}
}
//清屏函數
void lcm_clr(void)
{
lcm_w_test(0,0x01);
}
/*DS18B20驅動程序------------------------------------------------------------*/
//初始化ds1820函數
void Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ復位
Delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
Delay(80); //精確延時 大于 480us
DQ = 1; //拉高總線
Delay(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
Delay(20);
}
//讀一個字節函數
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
//寫一個字節函數
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
//讀取溫度函數
uint ReadTemperature(void)
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器
a=ReadOneChar(); //讀低8位
b=ReadOneChar(); //讀高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍輸出并四舍五入
return(t);
}
/*公歷節日數據庫-------------------------------------------------------------*/
void days (viod)
{
lcm_w_test(0,0x98);//在液晶屏的第四行第一列顯示以下節日提示
if ( month == 1 && date == 1 ){ lcm_w_word(" 元旦快樂 "); }//1月
if ( month == 1 && date == 28 ){ lcm_w_word(" 世界麻風日 "); }
if ( month == 2 && date == 2 ){ lcm_w_word(" 世界濕地日 "); }//2月
if ( month == 2 && date == 13 ){ lcm_w_word(" 明天情人節了 "); }
if ( month == 2 && date == 14 ){ lcm_w_word(" 今天是情人節 "); }
if ( month == 3 && date == 1 ){ lcm_w_word(" 國際海豹日 "); }//3月
if ( month == 3 && date == 3 ){ lcm_w_word(" 全國愛耳日 "); }
if ( month == 3 && date == 8 ){ lcm_w_word("國際勞動婦女節 "); }
if ( month == 3 && date == 12 ){ lcm_w_word(" 植樹節 "); }
if ( month == 3 && date == 14 ){ lcm_w_word(" 國際警察日 "); }
if ( month == 3 && date == 15 ){ lcm_w_word(" 消費者權益日 "); }
if ( month == 3 && date == 17 ){ lcm_w_word(" 國際航海日 "); }
if ( month == 3 && date == 21 ){ lcm_w_word(" 世界森林日 "); }
if ( month == 3 && date == 22 ){ lcm_w_word(" 世界水日 "); }
if ( month == 3 && date == 23 ){ lcm_w_word(" 世界氣象日 "); }
if ( month == 3 && date == 24 ){ lcm_w_word("世界防治結核病日"); }
if ( month == 4 && date == 1 ){ lcm_w_word("愚人節 小心上當"); }//4
if ( month == 4 && date == 7 ){ lcm_w_word(" 世界衛生日 "); }
if ( month == 4 && date == 8 ){ lcm_w_word(" 復活節 "); }
if ( month == 4 && date == 13 ){ lcm_w_word(" 黑色星期五 "); }
if ( month == 5 && date == 1 ){ lcm_w_word("五一國際勞動節 "); }//5
if ( month == 5 && date == 4 ){ lcm_w_word(" 青年節 "); }
if ( month == 5 && date == 8 ){ lcm_w_word(" 世界紅十字日 "); }
if ( month == 5 && date == 12 ){ lcm_w_word(" 國際護士節 "); }
if ( month == 5 && date == 5 ){ lcm_w_word("近日請注意母親節"); }
if ( month == 5 && date == 15 ){ lcm_w_word(" 國際家庭日 "); }
if ( month == 5 && date == 31 ){ lcm_w_word(" 世界無煙日 "); }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -