?? rt1602c+ds1302二號.c
字號:
//單片機RT1602_C語言程序__DS1302讀寫一體化C51源程序
//2006年3月8951_LCD_1602_Q_D_MCU適用
//AT89C54_Ver1.00
//KS0070(44780) 16x2 字符液晶屏驅動演示程序總線方式
//DB0=P1.0 DB1=P1.1 DB2=P1.2 DB3=P1.3 DB4=P1.4 DB5=P1.5
//DB6=P1.6 DB7=P1.7 R/W=P2.0 RS=P2.1 E=P2.7
//[注]:AT89C51的晶振頻率為12MHz
#include <REGX51.H>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <SS89BIN.h>
sbit E_E=P3^3; //片選,下降沿觸發
sbit R_S=P3^4; //H數據寄存器,L指令寄存器
sbit R_W=P3^5; //H讀數據,L寫數據
sbit DS1302_RST=P0^3; //DS1302_RST
sbit DS1302_IO =P0^4; //DS1302_IO
sbit DS1302_SCL=P0^5; //DS1302_CLK
unsigned char settime[7]={0x55,0x59,0x23,0x31,0x12,0x07,0x04};
//設置時間:秒 分 時 日 月 星期 年
unsigned char data rdtime[7];
unsigned char bdata data_ds1302;
sbit bit_data0=data_ds1302^0;
sbit bit_data7=data_ds1302^7;
unsigned char bdata x;
sbit x0=x^0;
sbit x7=x^7;
void close_write_bit()
{char i;
DS1302_SCL=0;
_nop_();
DS1302_RST=1;
_nop_();_nop_();
data_ds1302=0x8E; //寫控制代碼
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
data_ds1302=0x80; //關閉寫保護
DS1302_IO=0;
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
}
void open_write_bit()
{char i;
DS1302_SCL=0;
_nop_();
DS1302_RST=1;
_nop_();_nop_();
data_ds1302=0x8E; //寫控制代碼
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
data_ds1302=0x00; //關閉寫保護
DS1302_IO=0;
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
}
void initial_ds1302()
{unsigned char i;
DS1302_SCL=0;
_nop_();
DS1302_RST=1;
_nop_();_nop_();
data_ds1302=0x8E; //寫控制代碼
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
data_ds1302=0x80; //關閉寫保護
DS1302_IO=0;
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
DS1302_RST=0;
_nop_();
DS1302_SCL=0;
DS1302_SCL=0;
_nop_();
DS1302_RST=1;
_nop_();_nop_();
data_ds1302=0x90; //recharge register
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
data_ds1302=0xA4; //no rechaarge for battery
DS1302_IO=0;
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
DS1302_RST=0;
_nop_();
DS1302_SCL=0;
DS1302_SCL=0;
_nop_();
DS1302_RST=1;
_nop_();_nop_();
data_ds1302=0x80; //關閉寫保護
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
data_ds1302=0x80; //關閉寫保護
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
DS1302_RST=0;
_nop_();
DS1302_SCL=0;
}
unsigned char read_ds1302(char command)
{char i;
data_ds1302=(command<<1)|0x81;
DS1302_SCL=0;
_nop_();
DS1302_RST=1;
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
DS1302_SCL=1;
for(i=1;i<=8;i++)
{data_ds1302=data_ds1302>>1;
DS1302_SCL=0;_nop_();
bit_data7=DS1302_IO;DS1302_SCL=1;
}
DS1302_RST=0;
_nop_();
DS1302_SCL=0;
return(data_ds1302);
}
void write_ds1302(unsigned char address,unsigned char numb)
{char i; //寫入時分秒
DS1302_RST=0;
DS1302_SCL=0;
DS1302_RST=0;
DS1302_RST=1;
data_ds1302=0x80|(address<<1);
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
data_ds1302=numb;
for(i=1;i<=8;i++)
{DS1302_SCL=0;
DS1302_IO=bit_data0;
_nop_();DS1302_SCL=1;
data_ds1302=data_ds1302>>1;
}
DS1302_RST=0;
DS1302_SCL=1;
}
void read_time() //讀秒分時日月星期年
{unsigned char n;
for(n=0;n<7;n++)
{rdtime[n]=read_ds1302(n);
}
}
void set_time()
{unsigned char data n;
open_write_bit();
for(n=0;n<7;n++)
{write_ds1302(n,settime[n]);
}
close_write_bit();
}
void TIME(int nt) //延時函數
{long int it=0;
for(it=0;it<nt*1000;it++);
return;
}
void DELAY(void) //判斷液晶顯示器是否忙的子程序
{P1=0xFF;
R_S=0;R_W=1;E_E=0;
_nop_();
E_E=1;
while(P1_7); //如果P1.7為高電平表示忙就循環等待
return;
}
void WR1602C(char mun,char rs) //寫入控制命令的子程序
{P1=mun; //將代碼送到P1口
R_S=rs; //1數據寄存器,0指令寄存器
R_W=0;E_E=0; //執行顯示命令
DELAY(); //判斷液晶模塊是否忙
E_E=1; //顯示完成,程序停車
return;
}
void main(void)
{ P3_1=0;P3_2=1;TIME(3); //指示燈閃爍
P3_1=1;P3_2=0;TIME(3);
P3_1=0;P3_2=1;TIME(3);
WR1602C(B0000_0001,0); //清屏并光標復位
WR1602C(B0011_1000,0); //設置顯示模式:8位2行5x7點陣
WR1602C(B0000_1111,0); //顯示器開,光標開,光標允許閃爍
WR1602C(B0000_0110,0); //文字不動,光標自動右移
WR1602C(B1110_1000,0); //寫入顯示起始地址(第一行第一個位置)
WR1602C(B0100_0001,1); //字母A的代碼
WR1602C(B0100_0010,1);
WR1602C(B0100_0011,1);
TIME(5);
initial_ds1302(); //上電啟用,否則不走時
set_time(); //將數組中的時間置入DS1302
START:
read_time(); //讀取當前時分秒,放在數組中
WR1602C(B1100_0000,0); //寫入顯示起始地址(第二行第一個位置)
WR1602C(0x4E,1);WR1602C(0x6F,1); //第二排從頭開始顯示NowTime
WR1602C(0x77,1);WR1602C(0x54,1);
WR1602C(0x69,1);WR1602C(0x6D,1);
WR1602C(0x65,1);WR1602C(0x20,1);
WR1602C(rdtime[2]/16+48,1); //時鐘_時_十位
WR1602C(rdtime[2]%16+48,1); //時鐘_時_個位
WR1602C(0x3A,1); //顯示:
WR1602C(rdtime[1]/16+48,1); //時鐘_分_十位
WR1602C(rdtime[1]%16+48,1); //時鐘_分_個位
WR1602C(0x3A,1); //顯示:
WR1602C(rdtime[0]/16+48,1); //時鐘_秒_十位
WR1602C(rdtime[0]%16+48,1); //時鐘_秒_個位
WR1602C(B1110_1000,0); //寫入顯示起始地址(第一行第一個位置)
WR1602C(0x32,1);WR1602C(0x30,1); //第一排從頭開始顯示20世紀
WR1602C(rdtime[6]/16+48,1); //時鐘_年_十位
WR1602C(rdtime[6]%16+48,1); //時鐘_年_個位
WR1602C(0x2F,1); //顯示/
WR1602C(rdtime[4]/16+48,1); //時鐘_月_十位
WR1602C(rdtime[4]%16+48,1); //時鐘_月_個位
WR1602C(0x2F,1); //顯示/
WR1602C(rdtime[3]/16+48,1); //時鐘_日_十位
WR1602C(rdtime[3]%16+48,1); //時鐘_日_個位
WR1602C(0x20,1);
WR1602C(0x57,1);WR1602C(0x65,1); //顯示Week
WR1602C(0x65,1);WR1602C(0x6B,1);
WR1602C(rdtime[5]%16+48,1); //時鐘_星期幾
TIME(5);
goto START;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -