📄 print.c
字号:
//******************************************************************************
//程序名: print.c
//创建人: DingYan
//创建时间: 2005-2-1
//程序功能: 监护仪与旧打印机转接板驱动程序
//版本: 1.0
//******************************************************************************
#include <reg932.h>
#include <math.h>
#define LOAD_HIGH 0x3c //定时器定时常数
#define LOAD_LOW 0xb0
#define I2CADDR 0xf //I2C联机地址
#define I2CALLADDR 254
#define uchar unsigned char
#define uint unsigned int
void printname(void);
void cpu_init(void);
void print_init(void);
void printwrite(uchar m);
void print_stringdata(uchar *string);
void i2init(void);
void i2wrbyte(uchar dat,uchar con);
void printwaveset(char v);
void printwordset(uchar m);
void delay(uint m);
uchar hextoasc(uchar m);
void readbuf(uchar m);
void printdata(void);
void datainit(void);
void i2pro(void);
//void watchdog(void);
uchar val(uchar m);
uchar hund0(uint m);
uchar ten0(uint m);
uchar one0(uint m);
uchar one1(uchar m);
uchar ten1(uchar m);
uchar hund1(uchar m);
void i2comx(void);
void i2stop(void);
void i2slaw(uchar calladdr);
void i2mfrbgn(void);
void i2redata(void);
void i2txok(void);
void i2reok(void);
uchar xdata printbuf[256]; //打印机波形发送发送缓冲区
uchar idata i2rebuf[80]; //I2C接收缓冲区
uchar idata i2renum=0,i2txnum=0,i2relen=0;
uchar idata printwenum=0,printrenum=0,printstate=0,savestate=0;
uchar idata date[6],brea,spo2,heart,pluse,dia,alarm; //数据存储器
int idata st2;
uint idata sys,temp1,temp2;
uchar idata time=0;
uchar idata rtiretime=0;
bit bdata i2end=0; //I2C接收结束标记
bit bdata busy_flag; //打印机忙或开门缺纸状态位
bit bdata i2txbusy_flag; //i2c总线忙状态
sbit busy=P2^5; //忙信号
sbit stb=P2^0; //写脉冲
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
void delay(uint m)
{
while(m--);
}
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
void main(void)
{
cpu_init();
datainit();
print_init();
i2init();
IP1=1;
IP1H=0;
EI2C=1;
EA=1;
delay(100);
while(1)
{
i2pro();
if(printrenum!=printwenum)
printwrite(printbuf[printrenum++]);
/* if(busy_flag==1)
{
printstate|=0x80;STA=1;
while(busy);
printstate|=0x00;STA=1;
}*/
}
}
//*********************************************************************
//函数名:void cpu_init(void)
//输入参数:
//输出参数:
//函数功能:cpu初始化
//全局变量:
//*********************************************************************
void cpu_init(void)
{
DIVM=0; //CCLK=OSCCLK(CRYSTAL,11.0592)
PCON=0;
IEN0=0; //CLOSE ALL INTR
IEN1=0;
AUXR1=0;
P0M1=0x00; //P0为输出
P0M2=0xff;
P1M1=0xff;
P1M2=0xdf;
P2M1=0x20;
P2M2=0x00;
RSTSRC=0;
RTCCON=0x60; //DISABLE REAL-CLOCK TIMER
TMOD=0x01; //USE TIMER0 TO SAMPLE
TAMOD=0;
TCON=0;
TL0=LOAD_LOW; //SET T0(1/200s)
TH0=LOAD_HIGH;
EA=0;
}
//*********************************************************************
//函数名:void datainit(void)
//输入参数:
//输出参数:
//函数功能:数据初始化
//全局变量:
//*********************************************************************
void datainit(void)
{
stb=1;
printstate=0;
}
//*********************************************************************
//函数名:void print_init(void)
//输入参数:
//输出参数:
//函数功能:
//全局变量:打印机初始化
//*********************************************************************
void print_init(void)
{
printwrite(241);
printwrite(242);
}
//*********************************************************************
//函数名:void printwrite(uchar m)
//输入参数:uchar m 所写数据
//输出参数:无
//函数功能:打印机写一个数据
//全局变量:busy, busy_flag
//*********************************************************************
void printwrite(uchar m)
{
while(busy);
P0=m;
stb=0;
// delay(2);
stb=1;
/* unsigned int i=0;
while(i<60000&&busy)
{
i++;
}
if(i==60000) busy_flag=1;
else {P0=m;stb=0;busy_flag=0;stb=1;}*/
}
//*********************************************************************
//函数名:void print_stringdata(uchar *string)
//输入参数:uchar *string 所写字符串
//输出参数:
//函数功能:打印机写数据串
//全局变量:busy_flag
//*********************************************************************
void print_stringdata(uchar *string)
{
while(*string!='\0')
{
printwrite(*string++);
// if(busy_flag) break;
}
}
//*********************************************************************
//函数名:void i2init(void)
//输入参数:null
//输出参数:null
//函数功能:
//全局变量:
//*********************************************************************
void i2init(void)
{
I2ADR=I2CADDR<<1;
I2CON=0x44; //从接受从发送
I2SCLL=8;
I2SCLH=8;
}
//*********************************************************************
//函数名:void i2stop(void)
//输入参数:
//输出参数:
//函数功能:发停止I2C状态
//全局变量:
//*********************************************************************
void i2stop(void)
{
STO=1;
i2txbusy_flag=0;
i2comx();
}
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
void i2slaw(uchar calladdr)
{
I2DAT=calladdr;
i2txbusy_flag=1;
i2comx();
}
/*void i2mfrbgn(void)
{
i2txbusy_flag=0;
i2comx();
}*/
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
void i2redata(void)
{
i2rebuf[i2renum++]=I2DAT;
i2comx();
}
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
void i2txok(void)
{
rtiretime=0;
i2stop();
}
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
void i2norpd(void)
{
if(rtiretime>=3) i2txok();
else {rtiretime++;i2comx();}
}
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
void i2reok(void)
{
i2end=1;
i2comx();
}
//void i2tmhead()
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
void i2comx(void)
{
SI=0;
}
//*********************************************************************
//函数名:void i2intr(void) interrupt 6 using 2
//输入参数:
//输出参数:
//函数功能:i2c中断处理函数
//全局变量:
//*********************************************************************
void i2intr(void) interrupt 6 using 2
{
uchar m;
EA=0;
printstate&=0x7f;
if(busy_flag) printstate|=0x80;
m=I2STAT;
switch(m)
{
case 0x08:i2slaw(I2CALLADDR);break; //发从地址
case 0x18:I2DAT=0x80;i2txnum=2;i2comx();break; //发数据,等待应答
case 0x20:i2norpd();break;
case 0x28:switch(i2txnum--)
{
case 0:i2txok();break;
case 2:I2DAT=0xf1;i2comx();break;
case 1:I2DAT=printstate;i2comx();break;
}
case 0x30:i2norpd();break;
case 0x60:i2comx();i2renum=0;break; //接受到自身地址
// case 0x68:i2mfrbgn();break;
case 0x80:i2redata();break; //读数据
case 0xa0:i2reok();break; //接收完毕
default:i2stop();break; //停止
}
EA=1;
}
//*********************************************************************
//函数名:
//输入参数:
//输出参数:
//函数功能:
//全局变量:
//*********************************************************************
/*void time0intr(void) interrupt 1
{
TR0=0;
TH0=LOAD_HIGH;
TL0=LOAD_LOW;
TR0=1;
}*/
//*********************************************************************
//函数名:void i2pro(void)
//输入参数:
//输出参数:
//函数功能:i2c数据处理函数,在主函数中作为一个历程
//全局变量:
//*********************************************************************
void i2pro(void)
{ uchar m,crc=0;
uchar i,j;
char bag[35],v;
for(i=0;i<=i2rebuf[0];i++)
crc+=i2rebuf[i]; //校验
i2rebuf[0]=0;
if(i2end==1&&crc==0) //接受结束标记置位
{
m=i2rebuf[1];
printstate=(i2rebuf[2]&0xf0)>>4;
switch((m&0xf0)>>4)
{
case 7: alarm=0;
printname();
printstate&=0xf3; //实时打印开始是的数据包,包括开始打印时间
printstate|=0x4;
for(i=0;i<6;i++)
date[i]=i2rebuf[i+2];
v=i2rebuf[8];
i=1;j=0;
/* bag[j++]=hextoasc(date[i]/10);
bag[j++]=hextoasc(date[i++]%10);
*/
bag[j++]=hextoasc(date[i]/10);
bag[j++]=hextoasc(date[i++]%10);
bag[j++]='-';
bag[j++]=hextoasc(date[i]/10);
bag[j++]=hextoasc(date[i++]%10);
bag[j++]='-';
bag[j++]=hextoasc(date[i]/10);
bag[j++]=hextoasc(date[i++]%10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -