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

📄 仪放_液晶.c

📁 这是我设计制作的仪表放大器的一个单片机程序。采用C51系列单片机
💻 C
字号:
/*该程序是仪表放大器的数码管显示程序,
键盘功能如下:
1 2 3 4 5 6 7 8
9 0   + -    set


#include <AT89X51.H>

static unsigned char dis_flag;
static unsigned char disbuffer[4];

static unsigned char xdata jianpan _at_ 0xa100;

static unsigned int step;
static unsigned char *pointer_buf;


#include <absacc.h>
#define uchar  unsigned char
#define uint   unsigned int
#define DELAY 5
#define SCM  XBYTE[0xa300]
#define SDA  XBYTE[0xa301]
#define MCM  XBYTE[0xa200]
#define MDA  XBYTE[0xa201]
/***************************************************/
/*调用方式:void OutMI(uchar i)
/*函数说明:发指令i到主窗口
/*程序内函数,私有
/***************************************************/
void OutMI(uchar i)
{      
	uchar d;
	d=DELAY;
	while(d)d--; 
	MCM=i;
}
/***************************************************/
/*调用方式:void OutMD(uchar i)
/*函数说明:发数据i到主窗口
/*程序内函数,私有
/***************************************************/
void OutMD(uchar i)
{
  	uchar d=DELAY;
	while(d)d--;	
    MDA=i;
}
/***************************************************/
/*调用方式:void OutSI(uchar i)
/*函数说明:发指令i到从窗口
/*程序内函数,私有
/***************************************************/
void OutSI(uchar i)
{
	uchar d=DELAY;
	while(d)d--;
    SCM=i;
}

/***************************************************/
/*调用方式:void OutSD(uchar i)
/*函数说明:发数据i到从窗口。(内函数,私有,用户不直接调用)
/***************************************************/
void OutSD(uchar i)
{
	uchar d=DELAY;
	while(d)d--;
	SDA=i;
}

/***************************************************/
/*调用方式:void LcdIni(void)
/*函数说明:12232点阵液晶初始化,开机后仅调用一次。
/***************************************************/
void LcdIni(void)
{
	OutMI(0XE2);OutSI(0XE2);//复位
	OutMI(0XAE);OutSI(0XAE);//POWER SAVE
	OutMI(0XA4);OutSI(0XA4);//动态驱动
	OutMI(0XA9);OutSI(0XA9);//1/32占空比
	OutMI(0XA0);OutSI(0XA0);//时钟线输出
	OutMI(0XEE);OutSI(0XEE);//写模式

	OutMI(0X00);OutMI(0XC0);
	OutSI(0X00);OutSI(0XC0);

	OutMI(0XAF);OutSI(0XAF);
} 

/***************************************************/
/*调用方式:void SetPage(uchar page0,uchar page1)
/*函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
/***************************************************/
void SetPage(uchar page0,uchar page1)
{
	OutMI(0xB8|page1);OutSI(0xB8|page0);
}

/***************************************************/
/*调用方式:void SetAddress(uchar address0,uchar address1)
/*函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
/***************************************************/
void SetAddress(uchar address0,uchar address1)
{
	OutMI(address1&0x7F);OutSI(address0&0x7F);
}

/***************************************************/
/*调用方式:void PutCharS(uchar ch)
/*函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
/***************************************************/
void PutCharS(uchar ch)
{
	OutSD(ch);
}

/***************************************************/
/*调用方式:void PutCharM(uchar ch)
/*函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
/***************************************************/
void PutCharM(uchar ch)
{
	OutMD(ch);
} 

/***************************************************/
/*uchar Inva(uchar)   1000 -> 0001
/*二进制数倒置
/***************************************************/
uchar Inva(uchar b)
{
	uchar v1=0,v2=0;
	uchar j1=0x80,j2=0x01;
	char i;
	for(i=7;i>=1;i=i-2)
	{
   	v1=((b<<i)&j1)|v1;
		v2=((b>>i)&j2)|v2;
		j1=j1>>1;
		j2=j2<<1;
	}
	return(v1|v2);
}
/***************************************************/
/*void DrawDw(char Xl,uchar width,uchar *bmp)
/***************************************************/
void DrawDw(char Xl,uchar width,uchar *bmp)
{
	uchar addr,i=0;
	bit window=0;
	char x;
	for(x=Xl;x>Xl-width;x--)
	{
		if (x<0) {window=1;addr=61+x;}
		else addr=x;

		SetPage(1,1);
		SetAddress(addr,addr);
		if (window) PutCharM(bmp[i]);
   		else PutCharS(bmp[i]);//画上层   
         i++;
		SetPage(0,0);
		SetAddress(addr,addr);
		if (window) PutCharM(bmp[i]);
         else PutCharS(bmp[i]);//画下层
    	i++;
	}
}
/***************************************************/
/*void DrawUp(char Xl,uchar width,uchar *bmp)
/***************************************************/
void DrawUp(char Xl,uchar width,uchar *bmp)
{
	uchar addr,i=0;
	char x;
	bit window=0;
	for(x=Xl;x>Xl-width;x--)
	{
		if (x<0) {window=1;addr=61+x;}
		else addr=x;

		SetPage(2,2);
		SetAddress(addr,addr);
		if (window) PutCharM(Inva(bmp[i]));
   		else PutCharS(Inva(bmp[i]));//画上层
         i++;
		SetPage(3,3);
		SetAddress(addr,addr);
		if (window) PutCharM(Inva(bmp[i]));
         else PutCharS(Inva(bmp[i]));//画下层
    	i++;
	}
}      
/***************************************************/
/*调用方式:void clrscr(void)
/*函数说明:清屏
/***************************************************/
void clrscr(void)
{
	uchar i;
	uchar page;

	for (page=0;page<4;page++)
	{
		SetPage(page,page);
		SetAddress(0,0);
		for (i=0;i<61;i++){PutCharS(0);PutCharM(0);}
	}
} 

/***************************************************/
/*              void OutCmd(uint addr,uchar m)
/*
/***************************************************/
//void OutCmd(uint addr,uchar m)
//{
//	uchar i=DELAY;
//	while(i--);
//	XBYTE[addr]=m;
//}
/*************************************************/
/*                                               */
/*                                               */
/*	              字模区			          */
/*                                               */
/*************************************************/
uchar code Start[]={
/*--  文字:  放  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x10,0x1F,0x92,0x72,0x13,0x11,0x02,0x1C,0xF3,0x50,0x10,0x11,0x1E,0x10,0x00,
0x02,0x0C,0xF0,0x02,0x01,0xFE,0x00,0x02,0x04,0x08,0xD0,0x70,0x8C,0x06,0x04,0x00,

/*--  文字:  大  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x04,0x04,0x04,0x04,0x04,0x04,0x05,0xFE,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
0x00,0x01,0x02,0x04,0x08,0x30,0xC0,0x00,0x80,0x60,0x10,0x0C,0x06,0x03,0x02,0x00,

/*--  文字:  倍  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x04,0x08,0x3F,0xC0,0x21,0x31,0x2F,0xA5,0x61,0x23,0x3D,0x29,0x21,0x21,0x00,
0x00,0x00,0x00,0xFE,0x00,0x00,0x7E,0x44,0x44,0x44,0x44,0x44,0x7E,0x00,0x00,0x00,

/*--  文字:  数  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x49,0x2A,0x1C,0xFF,0x1C,0x2A,0x4A,0x01,0x0F,0xF8,0x48,0x08,0x0F,0x08,0x00,
0x42,0x42,0x54,0x74,0xC8,0x58,0x64,0x40,0x02,0x04,0xC8,0x30,0xCC,0x06,0x04,0x00,

/*--  文字:  :  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

         };

uchar code num[]={
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,

/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0E,0x10,0x10,0x10,0x11,0x0E,0x00,0x00,0x0C,0x14,0x24,0x44,0x84,0x0C,0x00,

/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0C,0x10,0x11,0x11,0x12,0x0C,0x00,0x00,0x18,0x04,0x04,0x04,0x88,0x70,0x00,

/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x03,0x04,0x08,0x1F,0x00,0x00,0x00,0xE0,0x20,0x24,0x24,0xFC,0x24,0x00,

/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x1F,0x10,0x11,0x11,0x10,0x10,0x00,0x00,0x98,0x84,0x04,0x04,0x88,0x70,0x00,

/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x11,0x11,0x18,0x00,0x00,0x00,0xF0,0x88,0x04,0x04,0x88,0x70,0x00,

/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x1C,0x10,0x10,0x13,0x1C,0x10,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0E,0x11,0x10,0x10,0x11,0x0E,0x00,0x00,0x38,0x44,0x84,0x84,0x44,0x38,0x00,

/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0x00,0x8C,0x44,0x44,0x88,0xF0,0x00,
    };

void down_display()
{
   DrawDw(-8,8,num+disbuffer[0]*16);
   DrawDw(0,8,num+disbuffer[1]*16);
   DrawDw(8,8,num+disbuffer[2]*16);
   DrawDw(16,8,num+disbuffer[3]*16);
}


/*************************************/
void delay(unsigned char x)
{
	unsigned char i,j;
	for(i=0;i<x;i++)
		for(j=0;j<=1;j++)
		{;};
}
/*************************************/
unsigned char get_key_num(void)
{
	static unsigned char buff;
	static unsigned char keynum;
	keynum=0;
	P1_6=0;
	P1_7=1;
	buff=jianpan;								/**/
	if(buff!=255)
	{
		keynum=buff;
		delay(12);
		P1_6=0;
		P1_7=1;
		buff=jianpan;							/**/
		if(buff==keynum)
		{
			do{buff=jianpan;}while(buff!=0xff);	/**/
			keynum=255-keynum;
			goto aaa;
		};
	};
	P1_6=1;
	P1_7=0;
	buff=jianpan;								/**/
	if(buff!=255)
	{
		keynum=buff;
		delay(12);
		P1_6=1;
		P1_7=0;
		buff=jianpan;							/**/
		if(buff==keynum)
		{
			do{buff=jianpan;}while(buff!=0xff);	/**/
			keynum=255-keynum+5;
			goto aaa;
		}
		else
			return 'e';
	};
aaa:switch(keynum)
	{	case 1:return 1;break;
		case 2:return 2;break;
		case 4:return 3;break;
		case 8:return 4;break;
		case 16:return 5;break;
		case 32:return 6;break;
		case 64:return 7;break;
		case 128:return 8;break;
		case 6:return 9;break;
		case 7:return 0;break;
		case 9:return '.';break;
		case 13:return '+';break;
		case 21:return '-';break;
		case 37:return 'e';break;
		case 69:return 'e';break;
		case 133:return 's';break;
		default: return 'e'; 
    };
}

/*****************************************/
void step_increase()
{  
   if(disbuffer[3]==1)
     disbuffer[3]=0;
   if(disbuffer[0]>=9)
      { 
	    disbuffer[0]=0;
	    if(disbuffer[1]>=9)
		  {
		    disbuffer[1]=0;
			if(disbuffer[2]>=9)
			  {
               disbuffer[2]=0;
               disbuffer[3]=1;
               }
			else
			  disbuffer[2]++;
		   }
		else
		  disbuffer[1]++;
	  
	  }
   else disbuffer[0]++;

}
/*****************************************/
void step_decrease()
{
   if(disbuffer[0]==0)
      { 
	    disbuffer[0]=9;
	    if(disbuffer[1]==0)
		  {
		    disbuffer[1]=9;
			if(disbuffer[2]==0)
			  {disbuffer[2]=9;
               disbuffer[3]=0;}
			else
			  disbuffer[2]--;
		   }
		else
		  disbuffer[1]--;
	  
	  }
   else disbuffer[0]--;

}

/******************************************/
void reset()
{
  unsigned int x;
  pointer_buf=disbuffer;
  step=disbuffer[0]+10*disbuffer[1]+100*disbuffer[2]+1000*disbuffer[3];
  if(step>=0&&step<10)
    {
	 x=4095*step/10;
     P0_0=x^0;
	 P0_1=x^1;
	 P0_2=x^2;
	 P0_3=x^3;
	 P0_4=x^4;
	 P0_5=x^5;
	 P0_6=x^6;
     P0_7=x^7;

	 P1_0=1;
	 delay(10);
     P1=0x00;

	 P0_0=x^8;
	 P0_1=x^9;
	 P0_2=x^10;
	 P0_3=x^11;
     P0_4=1;               /*此处是用第二个373的第四个管脚来控制1倍的量程*/
	 P0_5=0;
	 P0_6=0;               /*如果此处发生中断,可能出错*/
	 P0_7=0;
	 
	 P1_1=1;
	 delay(10);
	 P1=0x00;
	}
  else if(step>=10&&step<100)
    {
     x=4095*step/100;
	 P0_0=x^0;
	 P0_1=x^1;
	 P0_2=x^2;
	 P0_3=x^3;
	 P0_4=x^4;
	 P0_5=x^5;
	 P0_6=x^6;
     P0_7=x^7;

	 P1_0=1;
	 delay(10);
     P1=0x00;

	 P0_0=x^8;
	 P0_1=x^9;
	 P0_2=x^10;
	 P0_3=x^11;
     P0_4=0;               /*此处是用第二个373的第五个管脚来控制1倍的量程*/
	 P0_5=1;
	 P0_6=0;               /*如果此处发生中断,可能出错*/
	 P0_7=0;
	 
	 P1_1=1;
	 delay(10);
	 P1=0x00;

	}
  else if(step>=100&&step<=1000)
    {
     x=4095*step/1000;
	 P0_0=x^0;
	 P0_1=x^1;
	 P0_2=x^2;
	 P0_3=x^3;
	 P0_4=x^4;
	 P0_5=x^5;
	 P0_6=x^6;
     P0_7=x^7;

	 P1_0=1;
	 delay(10);
     P1=0x00;

	 P0_0=x^8;
	 P0_1=x^9;
	 P0_2=x^10;
	 P0_3=x^11;
     P0_4=1;               /*此处是用第二个373的第六个管脚来控制1倍的量程*/
	 P0_5=0;
	 P0_6=0;               /*如果此处发生中断,可能出错*/
	 P0_7=0;
	 
	 P1_1=1;
	 delay(10);
	 P1=0x00;
	}
	delay(255);
    
}

/*****************************************/
void set_num()
{
  unsigned char j,m;

  disbuffer[0]=0;
  disbuffer[1]=0;
  disbuffer[2]=0;
  disbuffer[3]=0;
  pointer_buf=disbuffer+2;
  m=0;

  while(1)
 {
  j=get_key_num();
  if(j>=0&&j<=9)
    {
	  m++;
	  if(m>3)
	     {
		   goto aaa;
		 }
	  else
	    {
          *pointer_buf=j;
          down_display();
		  pointer_buf--;
		}

     }
   else if(j=='s')
    { 
      down_display();
	  reset();
      return;
	}
  }

aaa:
    while(1)
	{
	  j=get_key_num();
	  if(j=='s')
       {down_display();reset();return;}
	}   
}

/****************************************
void timer0_isr(void) interrupt 1 using 1
{
	TR0=0;
	TH0=0xf0;
	TL0=0x5f;
    down_display();
	TR0=1;
} */

/*****************************************/
void main()
{
    static unsigned char i;
    P1=0x00;

	LcdIni();             //初始显示
	clrscr();
    
	DrawUp(64,80,Start);
	DrawDw(16,32,Start+160);

	  pointer_buf=disbuffer;
      while(1)
 	   {
	    i=get_key_num();
	    if(i=='s')
	      {
	        set_num();}
	    else if(i=='+')
	      {step_increase();
           down_display();
  	       reset();
		  }
	    else if(i=='-')
	      {step_decrease();
           down_display();
		   reset();
		  }
	   }
	      
}

⌨️ 快捷键说明

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