📄 wrfram.c
字号:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define _Nop() _nop_() /*define nop */
sfr WDTC=0x9F; /*WATCH DOG USE*/
sfr SCONF=0xBF;
bit ack;
bdata uchar a,b,sendata;
sbit sendbit_0=sendata^0;
sbit a_0=a^0;sbit a_7=a^7;
ulong cost;
sbit PSW_5=PSW^5;
sbit sda=P1^1; sbit scl=P1^0; /*FM24C16A use*/
sbit SER=P1^5; sbit RCLK=P1^7; sbit SRCLK=P1^6; /*display use*/
sbit ALARM=P2^0;
uchar Rst_Buf;
uchar idata DispBuf[5];
uchar code FM24C16A_Page[8]={0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae};
uchar code disptab[23]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x0b,
0x7f,0x0e,0xff,0x80,0xe3,0x44,0x41,0x23,0x11,0x10,
0xc3,0x00,0x03};
/*88H-"0",ebH-"1",4cH-"2",49H-"3",2bH-"4",19H-"5",18H-"6",cbH-"7",08H-"8"*/
/*0bH-"9",7fH-"-",0eH-"P",ffH-" " because add not-gat no-logic */
/*g f a b dp c d e*/
void Rst_Wdog(void);
void Start(); /*IIC总线*/
void Stop();
void Ack_NoAck(bit askbit);
void SendByte(uchar c);
uchar RcvByte();
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
void sendchar(uchar *dispbuf1);
void main()
{ uchar addr;
/*0012306777 100.26 0012306778 100.27 0012306779 100.28 0012306780 100.29*/
/*0012306783 100.30 */
/* uchar dat[5]={0x00,0x00,0xbb,0xc9,0x5f};*/
uchar dat[6]={0x05,0x31,0x64,0x17,0x58,0x06};
/*0x00,0x26,
0x00,0x00,0xBB,0xC9,0x5A,0x01,0x00,0x27,
0x00,0x00,0xBB,0xC9,0x5B,0x01,0x00,0x28,
0x00,0x00,0xBB,0xC9,0x5D,0x01,0x01,0x30,
0x00,0x00,0xBB,0xC9,0x5E,0x01,0x02,0x31,
0x00,0x00,0xBB,0xC9,0x5F,0x01,0x03,0x32,
0x00,0x00,0xBB,0xC9,0x60,0x01,0x30,0x26,
0x00,0x00,0xBB,0xC9,0x61,0x01,0x40,0x27,
0x00,0x00,0xBB,0xC9,0x62,0x01,0x50,0x28
0x00,0x00,0xBB,0xC9,0x63,0x01,0x60,0x29,
0x00,0x00,0xBB,0xC9,0x64,0x01,0x71,0x30,
0x00,0x00,0xBB,0xC9,0x65,0x01,0x82,0x31,
0x00,0x00,0xBB,0xC9,0x66,0x01,0x93,0x32,
0x00,0x00,0xBB,0xC9,0x67,0x01,0x60,0x29,
0x00,0x00,0xBB,0xC9,0x68,0x02,0x71,0x30,
0x00,0x00,0xBB,0xC9,0x69,0x03,0x82,0x31,
0x00,0x00,0xBB,0xC9,0x6a,0x04,0x93,0x32,
0x00,0x00,0xBB,0xC9,0x6b,0x05,0x99,0x99
}; */
uchar dat1[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
ALARM=0;
addr=0;
ISendStr(FM24C16A_Page[4],addr,dat,5);
addr=0x00;
IRcvStr(FM24C16A_Page[0],addr,dat1,8);
DispBuf[0]=dat1[5]&0x0f;
DispBuf[1]=(dat1[6]>>4)&0x0f;
DispBuf[2]=(uchar)(dat1[6]&0x0f)+13;
DispBuf[3]=(dat1[7]>>4)&0x0f;
DispBuf[4]=dat1[7]&0x0f;
b=dat1[7]&0x0f;
cost=(ulong)b;
b=(dat1[7]>>4)&0x0f;
cost=cost+(ulong)b*10;
b=dat1[6]&0x0f;
cost=cost+(ulong)b*100;
b=(dat1[6]>>4)&0x0f;
cost=cost+(ulong)b*1000;
b=dat1[5]&0x0f;
cost=cost+(ulong)b*10000;
SP=0xd0;
Rst_Buf=SCONF;
if((Rst_Buf&0x80)==0) WDTC=0x81;
else { Rst_Buf=SCONF;
SCONF=Rst_Buf&0x7f;
Rst_Buf=WDTC;
WDTC=Rst_Buf|0x20;
WDTC=0x81;
}
while(1)
{ Rst_Wdog();
sendchar(DispBuf);
}
}
void Rst_Wdog(void)
{ Rst_Buf=WDTC;
WDTC=Rst_Buf|0x20;
}
void Start()
{ EA=0;
sda=1; /*发送起始条件的数据信号*/
scl=1;
_Nop(); /*起始条件建立时间大于4.7US延时*/
_Nop();
_Nop();
_Nop();
_Nop();
sda=0; /*发送起始信号*/
_Nop(); /*起始条件锁定*/
_Nop();
_Nop();
_Nop();
_Nop();
scl=0;
}
void Stop()
{ sda=0; /*发结束条件的数据信号*/
scl=1; /*发结束条件的时钟信号*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
sda=1; /*发送IIC总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
sda=0;
scl=0;
EA=1;
}
void Ack_NoAck(bit askbit)
{
if(askbit==0) sda=0; /*在此发应答或非应答信号*/
else sda=1;
_Nop();
_Nop();
_Nop();
scl=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
scl=0; /*清时钟线,钳住IIC总线以便继续接收*/
_Nop();
_Nop();
}
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c<<BitCnt)&0x80) sda=1; /*判断发送位*/
else sda=0;
_Nop();
scl=1; /*置时钟为高,通知被控器开始接收数据*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
scl=0;
}
_Nop();
_Nop();
sda=1; /*8 位发送完后释放数据线,准备接收应答位*/
_Nop();
_Nop();
scl=1;
_Nop();
_Nop();
_Nop();
if(sda==1) ack=0;
else ack=1; /*判断是否接收到应答信号*/
scl=0;
_Nop();
_Nop();
}
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0) return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0) return(0);
for(i=0;i<no;i++)
{
SendByte(*s); /*发送数据*/
if(ack==0) return(0);
s++;
}
Stop(); /*结束总线*/
return (1);
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
sda=1; /*置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
scl=0; /*置时钟线为低,准备接收数据*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
scl=1; /*置时钟线为高使数据线上数据有效*/
_Nop();
_Nop();
retc=retc<<1;
if(sda==1) retc=retc+1; /*读数据位,接收的数据放入RETC中*/
_Nop();
_Nop();
}
scl=0;
_Nop();
_Nop();
return(retc);
}
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start(); /*启动总线 */
SendByte(sla); /*发送器件地址*/
if(ack==0) return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0) return(0);
Start();
SendByte(sla+1);
if(ack==0) return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*发送数据*/
Ack_NoAck(0); /*发送应答位*/
s++;
}
*s=RcvByte();
Ack_NoAck(1); /*发送非应答位*/
Stop(); /*结束总线*/
return(1);
}
void sendchar(uchar *dispbuf1)
{
uchar dispbit ,disptime;
RCLK=0;
for(dispbit=0;dispbit<5;dispbit++)
{sendata=disptab[dispbuf1[dispbit]];
for(disptime=0;disptime<8;disptime++)
{SRCLK=0;
SER=sendbit_0;
SRCLK=1;
sendata=sendata>>1;
}
}
RCLK=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -