?? clock.c
字號:
/****************************************************************************/
//頭文件
#include <AT89X52.h>
#include <string.h>
/*****************************************************************************/
/****************************************************************************/
//引腳定義
//P2.0是遙控解碼器的輸入口。
sbit SID = P2^1; //數據
sbit SCLK = P2^2; //時鐘
/*****************************************************************************/
//定義DS1302時鐘接口.
sbit clock_clk = P3 ^ 5;//ds1302_clk(時鐘線)
sbit clock_dat = P3 ^ 4;//ds1302_dat(數據線)
sbit clock_Rst = P3 ^ 3;//ds1302_Rst(復位線)
/*****************************************************************************/
//定義累加器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;
/****************************************************************************/
//定義全局變量.
unsigned char yy,mo,dd,xq,hh,mm,ss;//定義時間映射全局變量(專用寄存器)
bit w = 0; //調時標志位
//*****************************************************************
#define IR_RE P3_2
bit k=0; //紅外解碼判斷標志位,為0則為有效信號,為1則為無效
unsigned char date[4]={0xff,0xff,0xff,0xff}; //date數組為存放地址原碼,反碼,數據原碼,反碼
//******************************************************************
/*--------------------------延時1ms程子程序-----------------------*/
delay1000()
{
unsigned char i,j;
i=5;
do{j=95;
do{j--;}
while(j);
i--;
}while(i);
}
/*---------------------------延時882us子程序-----------------------*/
delay882()
{
unsigned char i,j;
i=6;
do{j=71;
do{j--;}
while(j);
i--;
}while(i);
}
/*--------------------------延時2400ms程子程序-----------------------*/
delay2400()
{
unsigned char i,j;
i=5;
do{j=237;
do{j--;}
while(j);
i--;
}while(i);
}
//**************************************************************
//**************************************************************
/*----------------------------------------------------------*/
/*-----------------------紅外解碼程序(核心)-----------------*/
/*----------------------------------------------------------*/
void IR_decode()
{
unsigned char i,j;
while(IR_RE==0);
delay2400();
if(IR_RE==1) //延時2.4ms后如果是高電平則是新碼
{
delay1000();
delay1000();
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR_RE==0); //等待地址碼第1位高電平到來
delay882(); //延時882ms判斷此時引腳電平
///CY=IR_RE;
if(IR_RE==0)
{
date[i]>>=1;
// date[i]=date[i]&0x7f;
}
else if(IR_RE==1)
{
delay1000();
date[i]>>=1;
date[i]=date[i]|0x80;
}
} //1位數據接收結束
} //32位二進制碼接收結束
}
}
//*****************************************************************
//********************************************************************
/*------------------------外部中斷0程序-------------------------*/
/*------------------主要用于處理紅外遙控鍵值--------------------*/
void int0() interrupt 0
{
unsigned char i;
k=0;
EX0=0; //檢測到有效信號關中斷,防止干擾
for(i=0;i<1;i++)
{
delay1000();
if(IR_RE==1){k=~k;} //剛開始為9ms的引導碼,如果4ms內出現高電平則退出解碼程序
}
if(k==0)
{
// EX0=0; //檢測到有效信號關中斷,防止干擾
IR_decode(); //如果接收到的是有效信號,則調用解碼程序
}
delay2400();
delay2400();
delay2400();
EX0=1; //開外部中斷,允許新的遙控按鍵
}
//*********************************************************************
/****************************************************************************/
void DelayM(unsigned int a){//延時函數 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一個 ; 表示空語句,CPU空轉。
} //i 從0加到125,CPU大概就耗時1毫秒
}
/****************************************************************************/
/******************************************************************************/
//延時(LCM占用)
void delaynms(unsigned int di) {
unsigned int da,db;
for(da=0;da<di;da++);
for(db=0;db<10;db++);
}
/*****************************************************************************/
/******************************************************************************/
//發送一個字節(底層函數)
void lcm_w_byte(unsigned char bbyte) {
unsigned char i;
for(i=0;i<8;i++){
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}
/******************************************************************************/
/******************************************************************************/
//寫指令或數據 (0,指令) (1,數據)
void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //0:寫指令
else
start_data=0xfa; //1:寫數據
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
lcm_w_byte(start_data); //發送起始信號
delaynms(10); //延時是必須的
lcm_w_byte(Hdata); //發送高四位
delaynms(10); //延時是必須的
lcm_w_byte(Ldata); //發送低四位
delaynms(10); //延時是必須的
}
/******************************************************************************/
/****************************************************************************/
//初始化LCM
void lcm_init(void) {
delaynms(100); //啟動等待,等LCM講入工作狀態
lcm_w_test(0,0x30); //8 位介面,基本指令集
lcm_w_test(0,0x0c); //顯示打開,光標關,反白關
lcm_w_test(0,0x01); //清屏,將DDRAM的地址計數器歸零
delaynms(100); //啟動等待,等LCM講入工作狀態
}
/******************************************************************************/
/*****************************************************************************/
//清屏函數
void lcm_clr(void){
lcm_w_test(0,0x01);
delaynms(40); //啟動等待,等LCM講入工作狀態
}
/*****************************************************************************/
/*****************************************************************************/
//向LCM發送一個字符串,長度64字符之內。
//應用:lcm_w_word("您好!");
void lcm_w_word(unsigned char *str){
while(*str != '\0'){
lcm_w_test(1,*str++);
}
*str = 0;
}
/******************************************************************************/
/*****************************************************************************/
//1302驅動程序(底層協議)
void clock_out(unsigned char 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寫入字節(底層協議)
unsigned char 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讀數據(底層協議)
unsigned char read_clock(unsigned char ord){
unsigned char 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);
}
/*****************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -