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

📄 print.c

📁 公司打印机转接板的一段小代码 主要功能是从ARM上通过I2C读取数据
💻 C
📖 第 1 页 / 共 2 页
字号:
//******************************************************************************
//程序名:	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 + -