📄 ds12887.c
字号:
//DS12887
#include <INTRINS.H>
#include <ABSACC.H>
#include <AT89x51.H>
#define uchar unsigned char
#define unint unsigned int
//#################################################
bdata uchar Bcc; //定义一个可位寻址的全局变量
sbit B0=Bcc^0; sbit B1=Bcc^1; sbit B2=Bcc^2; sbit B3=Bcc^3;
sbit B4=Bcc^4; sbit B5=Bcc^5; sbit B6=Bcc^6; sbit B7=Bcc^7;
//#################################################
//LCD32X122 A0-P23;RW-P24;E1-P25;E2-P26;
//LCD16X2(16X80) RS-P23;RW-P24;EN-P27
//DS12887 CS-P20;$$$$$$$ PCF8574T SDA-P22;SCL-P21;
#define EN P2_7
#define RS P2_3
#define RW P2_4
#define SEC XBYTE [0xfe00] //秒
#define SEC_ALARM XBYTE [0xfe01] //秒警报
#define MIN XBYTE [0xfe02] //分钟
#define MIN_ALARM XBYTE [0xfe03] //分钟警报
#define HOU XBYTE [0xfe04] //小时
#define HOU_ALARM XBYTE [0xfe05] //小时警报
#define WEEK XBYTE [0xfe06] //星期几
#define DAT XBYTE [0xfe07] //日期
#define MON XBYTE [0xfe08] //月份
#define YEA XBYTE [0xfe09] //年份
#define SEGA XBYTE [0xfe0A] //寄存器A
#define SEGB XBYTE [0xfe0B] //寄存器B
#define SEGC XBYTE [0xfe0C] //寄存器C
#define SEGD XBYTE [0xfe0D] //寄存器D
//#################################################
uchar idata GOOD[]={ 0x47,0x4f,0X4F,0x44,0x21,0x00};//GOOD!
//#################################################
void DELAYL(uchar T) {uchar S;while (T--) //延时子程序
{for (S=200;S>0;S--){_nop_();_nop_();_nop_();} } }
//*************************************************
void WAIT(void){ EN=0; RS=0; RW=1; //读忙标志,忙则继续等待
do {EN=0;EN=1;_nop_();Bcc=P0;EN=0;} while(B7==1); }
//*************************************************
void COMMAND(uchar a){ //向液晶里写入指令、控制字
EN=0;RS=0;RW=0;EN=1;P0=a;_nop_();EN=0;WAIT();}
//*************************************************
void RESET(void){ //液晶模块软件复位
EN=0;RS=0;RW=0;EN=1;P0=0x38;_nop_();EN=0;DELAYL(0x09);
EN=0;RS=0;RW=0;EN=1;P0=0x38;_nop_();EN=0;DELAYL(0x06);COMMAND(0x38);}
//置功能 (8位总线宽度、双行显示、5X7点阵显示)
//*************************************************
void LCDSTART(void){ //液晶模块初始化
RESET(); //液晶模块软件复位
COMMAND(0x38); //置功能 (总线宽度、单/双行显示、5X7或5X10显示)
COMMAND(0x06); //置输入模式(地址计数器自加减、画面左右移动)
COMMAND(0x0c); //显示、光标、光标闪烁的开关
COMMAND(0x01);} //清屏幕的显示
//*************************************************
void WORD_W(uchar s){ //向指定的显示存储器地址写入待显示的单个字符
EN=0;RS=1;RW=0;EN=1;P0=s;EN=0;WAIT();} //写数据方式输出数据
//*************************************************
void DISPLAY(s) uchar idata *s; //向指定的显示存储器地址写入待显示的字符串
{uchar i=0;while (s[i]!=0x00){EN=0;RS=1;RW=0; //写数据方式
EN=1;P0=s[i];EN=0;WAIT();i++;_nop_();} } //输出数据
//*************************************************//DS12887正在更新,不可读写
void UPDATE(void){uchar a;do{a=SEGA;}while((a&0x80)==0x80);}
//*************************************************
void COMSTART(void)
{ TMOD=0X2d;TL1=0xfd;TH1=0xfd; //256-11059200/384/9600=0xfd
SCON=0x50;PCON=0x00;TR1=1;} //方式1计数器开
//*************************************************
void TXD2(uchar z) //串口发送子程序
{ SBUF=z; while(TI==0); TI=0; }//为0等待
//*************************************************
main(){ uchar S,R;
LCDSTART();COMSTART();
COMMAND(0x80);DISPLAY(GOOD);COMMAND(0x01);//从液晶第一行开头显示GOOD
//*****************************************
SEGA=0xa6;S=SEGA;TXD2(S); //开晶振,分频输出为2Hz
SEGB=0x7e;S=SEGB;TXD2(S); //数据正常更新,允许周期中断,允许警报中断
//更新介绍中断允许,允许方波输出,二进制格式,24小时格式,不允许夏令时
S=SEGC;TXD2(S); //C寄存器只读,中断警报的标志位
S=SEGD;TXD2(S); //D寄存器只读,内部锂电池状态标志位
//*****************************************//下面为时钟初始状态设定
SEC=0x00;MIN=0x00;HOU=0x09;WEEK=0x02;DAT=0x0a;MON=0x09;YEA=0x01;
SEC_ALARM=0x00;MIN_ALARM=0x00;HOU_ALARM=0xc0;//警报设定
//*****************************************
while(1){
UPDATE();S=YEA; TXD2(S);COMMAND(0x80);WORD_W(0x32);//年份
WORD_W(0x30);COMMAND(0x82);WORD_W(0x30);WORD_W(0x30+S);
UPDATE();S=MON; TXD2(S);COMMAND(0x85); //月份
WORD_W(0x30+(S/10));WORD_W(0x30+(S%10));WORD_W(0x3a);
UPDATE();S=DAT; TXD2(S);COMMAND(0x88); //日期
WORD_W(0x30+(S/10));WORD_W(0x30+(S%10));WORD_W(0x3a);
UPDATE();S=WEEK;TXD2(S);COMMAND(0x8b);WORD_W(0x30+S);//星期
UPDATE();S=HOU; TXD2(S);COMMAND(0xc0); //小时
WORD_W(0x30+(S/10));WORD_W(0x30+(S%10));WORD_W(0x3a);
UPDATE();S=MIN; TXD2(S);COMMAND(0xc3); //分钟
WORD_W(0x30+(S/10));WORD_W(0x30+(S%10));WORD_W(0x3a);
do{UPDATE();S=SEC;}while(S==R);TXD2(R);R=S;COMMAND(0xc6);//秒
WORD_W(0x30+(S/10));WORD_W(0x30+(S%10)); }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -