📄 x1203.c
字号:
//X1203 串行总线实时时钟芯片
#include <AT89X51.H>
#include <ABSACC.H>
#include <INTRINS.H>
#define uchar unsigned char
#define CSIOPBASE 0x0200
#define CTLA XBYTE[CSIOPBASE+0x0002]
#define DIRA XBYTE[CSIOPBASE+0x0006]
#define OUTA XBYTE[CSIOPBASE+0x0004]
#define INA XBYTE[CSIOPBASE+0x0000]
#define CTLB XBYTE[CSIOPBASE+0x0003]
#define DIRB XBYTE[CSIOPBASE+0x0007]
#define OUTB XBYTE[CSIOPBASE+0x0005]
#define INB XBYTE[CSIOPBASE+0x0001]
#define DIRC XBYTE[CSIOPBASE+0x0014]
#define OUTC XBYTE[CSIOPBASE+0x0012]
#define INC XBYTE[CSIOPBASE+0x0010]
#define DIRD XBYTE[CSIOPBASE+0x0015]
#define OUTD XBYTE[CSIOPBASE+0x0013]
#define IND XBYTE[CSIOPBASE+0x0011]
#define RAMSTART XBYTE[0x2000]
#define CSLCD XBYTE[0x0300]
//*************************************************
#define scl P1_3
#define irq P1_4
#define sda P1_2
//*************************************************
//GND-4,SERICK-PD2,SERIDA-PD1,VCC-1; 74164---PSD913F
//1,2 VCC; 3 scl_AD7416; 4 OTI; 5 sda;
//6 scl_X1203; 7 IRQ; 8,9,10 GND; A0=1;A1=1;A2=0;
//*************************************************
bdata int Tcc; //存放温度
sbit T00=Tcc^0; sbit T01=Tcc^1; sbit T02=Tcc^2; sbit T03=Tcc^3;
sbit T04=Tcc^4; sbit T05=Tcc^5; sbit T06=Tcc^6; sbit T07=Tcc^7;
sbit T08=Tcc^8; sbit T09=Tcc^9; sbit T10=Tcc^10;sbit T11=Tcc^11;
sbit T12=Tcc^12;sbit T13=Tcc^13;sbit T14=Tcc^14;sbit T15=Tcc^15;
//*************************************************
bdata uchar Bcc;
sbit a0=Bcc^0; sbit a1=Bcc^1; sbit a2=Bcc^2; sbit a3=Bcc^3;
sbit a4=Bcc^4; sbit a5=Bcc^5; sbit a6=Bcc^6; sbit a7=Bcc^7;
//*************************************************
void DELAYL (uchar t){ //长时间延时子程序
uchar s; while (t--)
{for (s=0xff;s>0;s--) {_nop_();_nop_();} } }
//*************************************************
void DELAYS (uchar t){ //短时间延时子程序
while (t--) {;} }
//*************************************************
uchar change(uchar d) //16进制码转换成可供数码管显示的码值
{switch (d)
{case 0x00:{d=0xc0;}break; //xian 0 4个74LS164的小板子
case 0x01:{d=0xf9;}break; //xian 1
case 0x02:{d=0xa4;}break; //xian 2
case 0x03:{d=0xb0;}break; //xian 3
case 0x04:{d=0x99;}break; //xian 4
case 0x05:{d=0x92;}break; //xian 5
case 0x06:{d=0x82;}break; //xian 6
case 0x07:{d=0xf8;}break; //xian 7
case 0x08:{d=0x80;}break; //xian 8
case 0x09:{d=0x90;}break; //xian 9
case 0x0a:{d=0x88;}break; //xian a
case 0x0b:{d=0x83;}break; //xian b
case 0x0c:{d=0xc6;}break; //xian c
case 0x0d:{d=0xa1;}break; //xian d
case 0x0e:{d=0x86;}break; //xian e
case 0x0f:{d=0x8e;}break; //xian f
default:{d=0xff;}; } return (d);}
//*************************************************
void show(uchar h) //P1.0,P1.1模拟串行口使数码管显示
{ if((h&0x01)==0x01){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}
if((h&0x02)==0x02){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}
if((h&0x04)==0x04){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}
if((h&0x08)==0x08){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}
if((h&0x10)==0x10){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}
if((h&0x20)==0x20){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}
if((h&0x40)==0x40){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}
if((h&0x80)==0x80){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;} }
//*************************************************
void SHOW_BCD(uchar b){ //显示当前时钟
uchar a;a=b>>4;b=b&0x0f;a=change(a);show(a);b=change(b);show(b);}
//*************************************************
void START(void) //start 开始条件
{sda=1;scl=1;_nop_();_nop_();sda=0;_nop_();scl=0;}
//*************************************************
void STOP(void){ //stop 结束条件
sda=0;scl=1;_nop_();_nop_();sda=1;scl=0;}
//*************************************************
void S_OUT(uchar dd){ //write 串行输出到X1203(以MCU为中心)
Bcc=dd;scl=0;
sda=a7;scl=1;_nop_();scl=0;
sda=a6;scl=1;_nop_();scl=0;
sda=a5;scl=1;_nop_();scl=0;
sda=a4;scl=1;_nop_();scl=0;
sda=a3;scl=1;_nop_();scl=0;
sda=a2;scl=1;_nop_();scl=0;
sda=a1;scl=1;_nop_();scl=0;
sda=a0;scl=1;_nop_();scl=0;
sda=1; scl=1;_nop_();scl=0;}
//*************************************************
uchar S_IN(void){ //read 从X1203串行输入一位
sda=1;
scl=1;a7=sda;scl=0;_nop_();
scl=1;a6=sda;scl=0;_nop_();
scl=1;a5=sda;scl=0;_nop_();
scl=1;a4=sda;scl=0;_nop_();
scl=1;a3=sda;scl=0;_nop_();
scl=1;a2=sda;scl=0;_nop_();
scl=1;a1=sda;scl=0;_nop_();
scl=1;a0=sda;scl=0;_nop_();
sda=1;scl=1;_nop_();scl=0;
return(Bcc); }
//*************************************************
main(){ uchar SEC,MIN,HOU,DAT,MON,YEA,WEK,CEN;
CTLA=0x00;DIRA=0xff; //PSD端口初始化
CTLB=0x00;DIRB=0xff;
DIRC=0xff;DIRD=0x06;
OUTC=0x00;show(0xC0);show(0xC0);show(0xC0);show(0xC0);
show(0xC0);show(0xC0);show(0xC0);show(0xC0);
DELAYL(0xff);DELAYS(0xff);OUTC=0xff; //PCB板上的LED点亮一会儿
//*************************************************
START();S_OUT(0xde);S_OUT(0x00);S_OUT(0x3f);S_OUT(0x02);STOP();
START();S_OUT(0xde);S_OUT(0x00);S_OUT(0x3f);S_OUT(0x06);STOP();
//设置写使能锁存,寄存器写使能锁存
START();S_OUT(0xde);S_OUT(0x00);S_OUT(0x30);
S_OUT(0x00);S_OUT(0x20);S_OUT(0x09);S_OUT(0x06);
S_OUT(0x05);S_OUT(0x01);S_OUT(0x00);S_OUT(0x20);STOP();
//设置秒,分,小时,日 月,年,星期,世纪
//*************************************************
//设置报警0的秒,分,小时,日,月,年,星期,世纪
//*************************************************
//设置报警1的秒,分,小时,日,月,年,星期,世纪
//*************************************************
while(1){
START();S_OUT(0xde);S_OUT(0x00);S_OUT(0x30);START();S_OUT(0xdf);
SEC=S_IN();MIN=S_IN();HOU=S_IN();DAT=S_IN();
MON=S_IN();YEA=S_IN();WEK=S_IN();CEN=S_IN();STOP();
SHOW_BCD(CEN);SHOW_BCD(WEK);SHOW_BCD(YEA);SHOW_BCD(MON);DELAYL(0xff);}
SHOW_BCD(DAT);SHOW_BCD(HOU);SHOW_BCD(MIN);SHOW_BCD(SEC);DELAYL(0xff);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -