?? calendar.c
字號(hào):
#include <REG52.H>
#include <intrins.h>
//#include "SoundPlay.h"
#define uchar unsigned char
#define uint unsigned int
sbit CS = P1^0; //片選 高電平有效 單片LCD使用時(shí)可固定高電平
sbit SID = P1^1; //數(shù)據(jù)
sbit SCLK= P1^2; //時(shí)鐘
sbit KEY_1=P2^0;
sbit KEY_2=P2^1;
sbit KEY_3=P2^2;
sbit KEY_4=P2^3;
sbit bz=P3^5;
void write(bit start, uchar ddata);
void sendbyte(uchar bbyte);
void delay1ms(uint di);
void lcdinit(void);
void lcdtest(void);
void lcdcls(void);
void write(bit start, uchar ddata) //寫指令或數(shù)據(jù)
{
uchar start_data,Hdata,Ldata;
if(start==0) start_data=0xf8; //寫指令
else start_data=0xfa; //寫數(shù)據(jù)
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
sendbyte(start_data); //發(fā)送起始信號(hào)
delay1ms(5); //延時(shí)是必須的
sendbyte(Hdata); //發(fā)送高四位
delay1ms(1); //延時(shí)是必須的
sendbyte(Ldata); //發(fā)送低四位
delay1ms(1); //延時(shí)是必須的
}
void sendbyte(uchar bbyte) //發(fā)送一個(gè)字節(jié)
{
uchar i;
for(i=0;i<8;i++)
{
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}
void delay1ms(uint k) //延時(shí)
{
uint m,n;
for(m=0;m<k;m++)
for(n=0;n<10;n++);
}
/*****************************************************************************/
//清屏函數(shù)
void lcm_clr(void)
{
write(0,0x01);
delay1ms(40); //啟動(dòng)等待,等LCM進(jìn)入工作狀態(tài)
}
/*****************************************************************************/
void set_function(uchar c)//功能設(shè)定基本功能0X30H,繪圖功能開0x36h 繪圖關(guān)0X34H
{
c=c+0x30;
write(0,c);
}
void addr_zero(void)/*地址歸零*/
{
write(0,0x02);
}
void dis_on_off(uchar c)/*顯示狀態(tài)*/
{
c=c+0x08;
write(0,c);
}
void lcdinit(void)
{
write(0,0x01); //清除顯示
write(0,0x30); //功能設(shè)置 基本功能
write(0,0x02); //地址歸零
write(0,0x04); // 鼠標(biāo)移動(dòng)和 顯示內(nèi)容同步
write(0,0x0c); // 游標(biāo)或顯示控制
write(0,0x01);
write(0,0x80); //顯示首地址
}
//設(shè)定字符和漢字坐標(biāo)。水平方向x:0~7,垂直方向y:0~3
void set_pos(uchar x,uchar y)/*設(shè)定行列*/
{write(0,(y%2)*0x10+(y/2)*0x08+x+0x80);}
// 向LCM發(fā)送一個(gè)字符串,長度64字符之內(nèi)
void lcm_w_word(uchar *str)
{
while(*str!='\0')
{
write(1,*str++);
}
*str=0;
}
//顯示作品信息
void disp_message(void)
{
write(0,0x80);write(1,4);write(1,4);write(1,4);write(1,4);
write(0,0x86);write(1,4);write(1,4);write(1,4);write(1,4);
write(0,0x80);lcm_w_word("****歡迎使用****") ;
write(0,0x90);lcm_w_word("--多功能萬年歷--");
write(0,0x88);lcm_w_word("作者:xxx ");
write(0,0x98);lcm_w_word("指導(dǎo)老師:劉熾輝") ;
}
/****************************************************************************/
// DS1302 驅(qū)動(dòng)
/*****************************************************************************/
//定義DS1302時(shí)鐘接口
sbit clock_clk = P1 ^ 3;//ds1302_clk(時(shí)鐘線)
sbit clock_dat = P1 ^ 4;//ds1302_dat(數(shù)據(jù)線)
sbit clock_Rst = P2 ^ 7;//ds1302_Rst(復(fù)位線?//為了編程方便定義的位變量
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;
/****************************************************************************/
//定義全局變量
uchar yy,mo,dd,xq,hh,mm,ss;//定義時(shí)間映射全局變量(專用寄存器)
bit w = 0; //調(diào)時(shí)標(biāo)志位
//1302驅(qū)動(dòng)程序
/*void clock_out(unsigned char dd)
{
unsigned char i;
ACC=dd;
for(i=8;i>0;i--)
{
clock_dat=a0;
clock_clk=1;
clock_clk=0;
ACC=ACC>>1;
}
}*/
/******************************************************************************/
/*unsigned char clock_in(void)
{
unsigned char i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
a7=clock_dat;
clock_clk=1;
clock_clk=0;
}
return(ACC);
}*/
//1302驅(qū)動(dòng)程序(底層協(xié)議)
void clock_out(uchar dd){
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302寫入字節(jié)(底層協(xié)議)
uchar clock_in(void){
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/*****************************************************************************/
//DS1302讀數(shù)據(jù)(底層協(xié)議)
uchar read_clock(uchar ord){
uchar dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
/*****************************************************************************/
/*****************************************************************************/
//常用時(shí)鐘數(shù)據(jù)讀取
void read_clockS(void){
ss = read_clock(0x81);//讀取秒數(shù)據(jù)
mm = read_clock(0x83);//讀取分鐘數(shù)據(jù)
hh = read_clock(0x85);//小時(shí)
dd = read_clock(0x87);//日
mo = read_clock(0x89);//月
xq = read_clock(0x8b);//星期
yy = read_clock(0x8d);//年
}
/*****************************************************************************/
//DS1302寫數(shù)據(jù)(底層協(xié)議)
void write_clock(uchar ord, uchar dd){
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/*****************************************************************************/
//調(diào)時(shí)用加1程序(上層應(yīng)用)
void Set_time(uchar sel){ //根據(jù)選擇調(diào)整的相應(yīng)項(xiàng)目加1并寫入DS1302
uchar address,item;
uchar max,mini;
write(0,0x9a);
if(sel==7) {address=0x80; max=0;mini=0;} //秒7
if(sel==6) {address=0x82; max=59;mini=0;} //分鐘6
if(sel==5) {address=0x84; max=23;mini=0;} //小時(shí)5
if(sel==4) {address=0x8a; max=7;mini=1;} //星期4
if(sel==3) {address=0x86; max=31;mini=1;} //日3
if(sel==2) {address=0x88; max=12;mini=1;} //月2
if(sel==1) {address=0x8c; max=99; mini=0;} //年1
//讀取1302某地址上的數(shù)值轉(zhuǎn)換成10進(jìn)制賦給item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(KEY_3 == 0){
delay1ms(10);
if(KEY_3 == 0){
item++;//數(shù)加 1
}
}
if(KEY_4 == 0){
delay1ms(10);
if(KEY_4 == 0){
item--;//數(shù)減 1
}
}
if(item>max) item=mini;//查看數(shù)值有效范圍
if(item<mini) item=max;
write_clock(0x8e,0x00);//允許寫操作
write_clock(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進(jìn)制寫入1302
write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
}
/*****************************************************************************/
//設(shè)置1302的初始時(shí)間
void Init_1302(void){//(2007年1月1日00時(shí)00分00秒星期一)
write_clock(0x8e,0x00);//允許寫操作
write_clock(0x8c,0x08);//年
write_clock(0x8a,0x03);//星期
write_clock(0x88,0x09);//月
write_clock(0x86,0x17);//日
write_clock(0x84,0x23);//小時(shí)
write_clock(0x82,0x59);//分鐘
write_clock(0x80,0x56);//秒
write_clock(0x90,0xa5);//充電
write_clock(0x8e,0x80);//禁止寫操作
}
/*****************************************************************************/
/*****************************************************************************/
//溫度傳感器定義
sbit DQ = P3 ^ 7;//定義ds18B20總線IO
/******************************************************************************/
void Delay(int num)//延時(shí)函數(shù)
{
while(num--) ;
}
/******************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
uchar x=0;
DQ = 1; //DQ復(fù)位
Delay(8); //稍做延時(shí)
DQ = 0; //單片機(jī)將DQ拉低
Delay(80); //精確延時(shí) 大于 480us
DQ = 1; //拉高總線
Delay(14);
x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
Delay(20);
}
/******************************************************************************/
uchar ReadOneChar(void)//讀一個(gè)字節(jié)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號(hào)
dat>>=1;
DQ = 1; // 給脈沖信號(hào)
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(uchar dat)//寫一個(gè)字節(jié)
{
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;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -