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

📄 复件 l0.c

📁 本人写的C8051F020单片机的显示程序
💻 C
字号:
//pragma CODE DEBUG SYMBOLS OBJECTEXTEND
#include <c8051f020.h>                 // SFR declarations
#include <stdio.h>
#include <intrins.h>
#include<absacc.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>

typedef unsigned char uchar;
typedef unsigned int uint;


sbit SDA=P3^1;
sbit SCL=P3^2;

#define IIC_READ 	0xA3     //
#define IIC_WRITE 	0xA2   //
#define REG_READ 	0xD3		//rtc
#define REG_WRITE 	0xD2
xdata uchar SaveAddr;	//FM31256	内部存储参数起始地址
#define RUN 		1
#define STOP 		0
#define NOP 		_nop_()

#define AlarmParaSaveAddr	80	//告警参数存储地址	 ReadAlarmParameter  
#define DeviceParaSaveAddr	200	//功能参数存储地址
uchar bdata bbyte;
sbit a0=bbyte^0;
sbit a1=bbyte^1;
sbit a2=bbyte^2;
sbit a3=bbyte^3;
sbit a4=bbyte^4;
sbit a5=bbyte^5;
sbit a6=bbyte^6;
sbit a7=bbyte^7;
bit IFACK;		//record the SDA state to confirn if ACK has happened 
sbit fm1= P3^4;//蜂鸣器
#define DELAYNUM 1 
#define FiveNop;     _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 


#define SOMEnop;    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define SYSCLK      24576000          // SYSCLK frequency in Hz
#define BAUDRATE    9600           // Baud rate of UART in bps
//#define SAMPLERATE0	5000
#define NUM_SAMPLES 20
#define	TRUE	1
#define	FALSE	0



xdata float int_part,frc_part;//拆分浮点数为整数和小数部分
xdata uchar dotnum;			//记录小数点位置

//uchar DeviceParaSaveAddr;
/*---------------------------------------------------------*/
//	xdata float tmpa;
//	data uint tt;
//	xdata float ts;
//----------------------------------------------
void SYSCLK_Init (void)
{
   	xdata unsigned  int u;                     
  	OSCXCN    = 0x67;					//启动外部振荡器(22.1184MHz晶体)
    for (u = 0; u < 3000; u++);  		// Wait 1ms for initialization
   	while ((OSCXCN & 0x80) == 0);
    OSCICN = 0x88;                                             // detector
}
//---------------------------------------------------------------------------------------------

void PORT_Init (void)
{
	XBR0    = 0x04; 
   	XBR1    = 0x00; 
    XBR2    = 0x40;	//P0.0-TXD0  P0.1-RXD0 P0.2-TXD1  P0.3-RXD1

   	P0MDOUT = 0xc0;                    // enable TX0 as a push-pull output推挽输出
  	P1MDOUT  = 0x00;                    // 配置输出为漏极开路
  	P2MDOUT  = 0xff;                    // 配置输出为漏极开路

  	P3MDOUT = 0xff;         // Enable crossbar and weak pull-ups允许交叉开关和弱上拉
   	P74OUT = 0x33; 
	P7=0xff;


}
#define NOP25;    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
#define NOP50;    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define DELAY1us;    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
#define DELAY50us      50
#define DELAY100us     100
void DelaySomeNops()
{
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
//	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
//	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();       	
       	


}
//======================================
/*开始  当主机把SDA 从高电平拉为低电平,同时SCL信号为高电平时被认为是开始信号,
所有的读写操作均由开始信号开始。*/
//========================================
//FUNCTION:ROUTES TO PROVIDE A START SIGNAL
void start(void)
{//	EA = 0;	
	SCL=0;DelaySomeNops();
	SDA=1;DelaySomeNops();
	SCL=1;DelaySomeNops();
	SDA=0;DelaySomeNops();
	SCL=0;DelaySomeNops();
}
// SCL=0;SDA=1;SCL=1;SDA=0;SCL=0;
//=======================================
//FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
/*停止  当主机把SDA从低电平拉为高电平,同时SCL信号为高电平时认为是停止信号,*/
void stop(void)
{
	//SCL=0;
	SDA=0;DelaySomeNops();
	SCL=1;DelaySomeNops();
	SDA=1;DelaySomeNops();
	SCL=0;DelaySomeNops();
}
	//SCL=0;
//	SDA=0;SCL=1;SDA=1;	SCL=0;
//=====================================
//FUNCTION:ROUTES TO PROVIDE ACK SINGAL
/*应答  在任何传送中,应答信号出现在第8位数据位被传送之后,在这个状态下,发送方应该释放SDA
信号以便由接收方驱动。接受方驱动SDA为低电平,以应答收到一个字节数据。
*/

/*void ack(void)
{
	 //SCL=0;
	SDA=0;DelaySomeNops();
	SCL=1;DelaySomeNops();
	SCL=0;DelaySomeNops();
}*/
//	SDA=0;SCL=1;SCL=0;
//=====================================
//FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL 
//	             OR TO PROVIDE A NO_ACK SIGNAL
/* 	SDA=1;
	SCL=1;
	i=5;
	while(i--){;}
	IFACK=SDA;
	//while(SDA){;};
	SCL=0;
	IFACK=1;*/
void nack(void)
{
	
	xdata uchar i;
	//SCL=0;
	SDA=1;DelaySomeNops();
	SCL=1;DelaySomeNops();
	i=5;DelaySomeNops();
	while(i--){DelaySomeNops();} 
	IFACK=SDA;DelaySomeNops();
	//while(SDA){;};
	SCL=0;DelaySomeNops();
	IFACK=1;DelaySomeNops();
	
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE  TO THE MASTER
uchar  inbyte(void) {
	SDA=1;DelaySomeNops();
	SCL=1;DelaySomeNops();a7=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
	SCL=1;DelaySomeNops();a6=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
	SCL=1;DelaySomeNops();a5=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
	SCL=1;DelaySomeNops();a4=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
	SCL=1;DelaySomeNops();a3=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
	SCL=1;DelaySomeNops();a2=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
	SCL=1;DelaySomeNops();a1=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
	SCL=1;DelaySomeNops();a0=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
	return(bbyte);
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER 
void outbyte(uchar outdata) {
	bbyte=outdata;
	SDA=a7;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
	SDA=a6;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
	SDA=a5;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
	SDA=a4;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
	SDA=a3;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
	SDA=a2;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
	SDA=a1;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
	SDA=a0;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
}
//======================================================
//FUNCTION:BYTE WRITE.  'add'     THE WRITE ADDRESS, 'wbyte'   THE DATA WANT TO WRITE
void writebyte(uint add,uchar wbyte)
{	xdata uchar addh;
	start();			DelaySomeNops();
	outbyte(IIC_WRITE);	DelaySomeNops();
	nack();				DelaySomeNops();
	addh=add>>8;		DelaySomeNops();	
	outbyte(addh);		DelaySomeNops();
	nack();				DelaySomeNops();
	outbyte(add);		DelaySomeNops();
	nack();				DelaySomeNops();
	outbyte(wbyte);		DelaySomeNops();
	nack();				DelaySomeNops();
	stop();				DelaySomeNops();
}
//=====================================================
//FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
uchar readbyte (uint add)
{	xdata uchar addh;
	xdata uchar temp;
	start();			DelaySomeNops();
	outbyte(IIC_WRITE);	DelaySomeNops();
	nack();				DelaySomeNops();
	addh=add>>8;		DelaySomeNops();
	outbyte(addh);		DelaySomeNops();
	nack();				DelaySomeNops();
	outbyte(add);		DelaySomeNops();
	nack();				DelaySomeNops();
	start();			DelaySomeNops();
	outbyte(IIC_READ);	DelaySomeNops();
	nack();				DelaySomeNops();
	temp=inbyte();		DelaySomeNops();
	nack();				DelaySomeNops();
	stop();				DelaySomeNops();
	return(temp);
}
/*typedef struct _Device_Set{     //定义设备设置纪录集结构类型
    uchar   cell_type, cell_num;	//电池类型,电池数量
	uint	cell_inner_resistant;	//电池内阻
	uint	cell_content1,cell_content2;//剩余电量,
	uint	standard_Ah	;			//标称安时
	uint	cell_life;				//电池寿命
	uchar 	device_addr;			//设备地址
	uint	time_used;				//使用时间
	uchar	cell_groups;			//电池组数
	uint	Current_range;			//电流量程
	uint	Chg_Current1;		//浮充电流(放大倍)
	uint	Chg_Current2;		//浮充电流(放大倍)

	uint	dischg_Current1;			//放电电流(放大倍)
	uint	dischg_Current2;			//放电电流(放大倍)

	uint 	chg_current_display_threshold1;	//充电电流显示门坎(安,两位小数)	2字节
	uint 	chg_current_display_threshold2;	//充电电流显示门坎(安,两位小数)	2字节

	uint 	Chg_I_threshold1;		//充电电流计量门坎(安,两位小数)	2字节
	uint 	Chg_I_threshold2;		//充电电流计量门坎(安,两位小数)	2字节

	uint 	dischg_current_display_threshold1;	//放电电流显示门坎(安,两位小数)	2字节
	uint 	dischg_current_display_threshold2;	//放电电流显示门坎(安,两位小数)	2字节

	uint	disChg_I_threshold1;	//放电电流计量门坎(安,两位小数)	2字节
	uint	disChg_I_threshold2;	//放电电流计量门坎(安,两位小数)	2字节

	float	fDiagnose[8];				//诊断参数1~诊断参数8	
} T_Device_Set;*/



float inputfloat(float x,uchar knum,bit dot)
{
	frc_part=modf(x,&int_part);

	if(dot==0)
		int_part=int_part*10+knum;
	else
	{	
		if(dotnum==1)
		{	frc_part=(float)frc_part+(float)knum/10;
			dotnum++;
		}
		else if(dotnum==2)
		{	frc_part=(float)frc_part+(float)knum/100;
			dotnum++;
		}
		else if(dotnum==3)
			frc_part=(float)frc_part+(float)knum/1000;
		
	}
	x=int_part+frc_part;
	return x;
}
/*****************************************************************************************
	在addr 处显示 x
******************************************************************************************/
void DisFloat(unsigned int addr,float x)
{	
	bit sign;
	xdata unsigned char DisplayBuf[12];			//设置显示缓冲区
	xdata unsigned char Buf[12];	
	uchar i;
	if(x>=0) sign=0;
	else sign=1;
  	x=fabs(x);
	x=0.01234;	//2d
   	sprintf(DisplayBuf,"%e",x);
//	x=19.234;	//2b
  // 	sprintf(DisplayBuf,"%e",x);
//	x=6.234;
  // 	sprintf(DisplayBuf,"%e",x);

	//正数显示
	DisplayBuf[11]=DisplayBuf[11]-0x30;

	if(DisplayBuf[9]==0x2B)			//+
	{	if(DisplayBuf[11]==0)
		{	for(i=0;i<5;i++)
			{	Buf[i]=DisplayBuf[i];	
			}
		}
		else if(DisplayBuf[11]==1)
		{	
			Buf[0]=DisplayBuf[0];
			Buf[1]=DisplayBuf[2];
			Buf[2]=0x2e;
			Buf[3]=DisplayBuf[3];
			Buf[4]=DisplayBuf[4];
		}
		else if(DisplayBuf[11]==2)
		{	
			Buf[0]=DisplayBuf[0];
			Buf[1]=DisplayBuf[2];
			Buf[2]=DisplayBuf[3];
			Buf[3]=0x2e;
			Buf[4]=DisplayBuf[4];
		}
		else if(DisplayBuf[11]==3)
		{	
			Buf[0]=DisplayBuf[0];
			Buf[1]=DisplayBuf[2];
			Buf[2]=DisplayBuf[3];
			Buf[3]=DisplayBuf[4];
		}
	}
	else if(DisplayBuf[9]==0x2D)	//-
	{
		if(DisplayBuf[11]==1)
		{	
			Buf[0]=0x30;
			Buf[1]=0x2e;
			Buf[2]=DisplayBuf[0];
			Buf[3]=DisplayBuf[2];
			Buf[4]=DisplayBuf[3];
		}
		else if(DisplayBuf[11]==2)
		{	
			Buf[0]=0x30;
			Buf[1]=0x2e;
			Buf[2]=0x30;
			Buf[3]=DisplayBuf[0];
			Buf[4]=DisplayBuf[2];
		}
		else if(DisplayBuf[11]==3)
		{	
			Buf[0]=0x30;
			Buf[1]=0x2e;
			Buf[2]=0x30;
			Buf[3]=0x30;
			Buf[4]=DisplayBuf[0];
		}
	}

	if(sign==0)
	{	
	
	
	if(DisplayBuf[9]==0x2b)		//+
		{
			switch (DisplayBuf[11])
			{
				case 0:// Write_Num(addr,DisplayBuf[0]-0x30);
						//Write_Num(addr+1,0x10);	
						//Write_Num(addr+2,DisplayBuf[2]-0x30);
					//	Write_Num(addr+3,DisplayBuf[3]-0x30);
					//	Write_Num(addr+4,DisplayBuf[4]-0x30);
						break;
				case 1: 
						break;
				case 2: 
						break;
				case 3: 
						break;
				case 4: 
						break;

				default:break; 
			}
		}
		else if(DisplayBuf[9]==0x2D)		//-
		{

			switch (DisplayBuf[11])
			{
				case 1: 
						break;
				case 2:
						break;
				case 3: 
						break;
				case 4: 
						break;

				default:break; 
			}
		}
	}
	else if(sign==1)
	{

		if(DisplayBuf[9]==0x2b)		//-
		{
			switch (DisplayBuf[11])
			{
				case 0: 
						break;
				case 1: 
						break;
				case 2: 
						break;
				case 3: 
						break;
				default:break; 
			}
		}
		else if(DisplayBuf[9]==0x2D)		//-
		{

			switch (DisplayBuf[11])
			{
				case 1:
						break;
				case 2: 
						break;
				case 3:
						break;
				default:break; 
			}
		}
	}
}
delay100us()
{	uchar  i;
	i=190;
	while(i>0)
 	{	_nop_();	 _nop_();	 _nop_();	 _nop_();	 _nop_();
		_nop_();	 _nop_();	 _nop_();	 _nop_();	 _nop_();
		i--;
	}
}
delay245us()
{	uchar  i;
	i=255;
	while(i>0)
 	{	_nop_();	 _nop_();	 _nop_();	 _nop_();	 _nop_();
		_nop_();	 _nop_();	 _nop_();	 _nop_();	 _nop_();
		_nop_();	 _nop_();	 _nop_();	 _nop_();	 _nop_();
		_nop_();	 _nop_();	 _nop_();	 _nop_();	 _nop_();
		_nop_();
		i--;
	}
}

delay1us()
{
 	_nop_();	 _nop_();	 _nop_();	 _nop_();	 _nop_();
	_nop_();	 _nop_();	 _nop_();	 _nop_();	 _nop_();
	
}
delay5us()
{
	delay1us();
	delay1us();
	delay1us();
	delay1us();
	delay1us();
	delay1us();
}
delay1ms()
{	delay245us();
	delay245us();
	delay245us();
	delay245us();
}


//----------------------------------------------------------------------
void main (void) 
{
    uchar  i,nn=2,mm=0,p,a[4],j;

  	WDTCN = 0xde;                       // disable watchdog timer
   	WDTCN = 0xad;
	SYSCLK_Init ();
	PORT_Init ();
   	Lcd_Init();
	ClearScreen();

	MainShow();

	while(1)
	{
		fm1=!fm1;
		delay1ms();
	}                                                                                          
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -