⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds12887.c

📁 该程序用来测试89C51与IDE硬盘的接口
💻 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 + -