计算器感悟及模块化程序分析

11.22与11.23学习感悟:

  1.这两天主要学习了如何画PCB,PCB板的布局与布线,布局主要是将模块联系紧密的放在一起,连接的虚线尽量不要交叉,然后大致的按原理图布局就好。布线一定要先设置好规则主要是线宽,焊盘要适当的大,布线尽量不要出现直角和锐角,最后就是布线尽量美观,最后板子完成后要加泪滴。DXP这个软件还有很多要学习的,还需要持续的学习。

 2.程序部分要建立模块化的概念,不能把所有的杂糅在一起。

程序分析:

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
uchar code table1[]={0,0x3d-0x30,0x01-0x30,0x2f-0x30,7,8,9,0x2a-0x30,4,5,6,0x2d-0x30,1,2,3,0x2b-0x30};
uchar code table2[]={"rorre           "};
uchar code table[]={0,0,0,0,7,8,9,0,4,5,6,0,1,2,3,0};
uchar keyvalue,d,fuhao,j,flag1=0;
long a=0,b=0,c=0;
void delay(uchar x)
{
	uchar i;
	while(x--)
	{
		for(i=0;i<250;i++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
    }
  }
}
void lcd_mang()
{
	rs=0;
	rw=1;
	e=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
  while(P0&0x80);//½á¹ûÊÇ1£¬±íʾæµִÐÐwhile(1)ËÀÑ­»·£¬Îª0£¬±íʾ²»Ã¦
	e=0;
}
void write_lcd(uchar com,uchar i)
{
	lcd_mang();
	e=0;
	rs=i;
	rw=0;
	_nop_();
	_nop_();
	e=1;
	_nop_();
	_nop_();
	P0=com;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	e=0;
}
void init()
{
	write_lcd(0x38,0);
	delay(1);
	write_lcd(0x08,0);
	delay(1);
	write_lcd(0x01,0);//ÇåÆÁ
	delay(1);
	write_lcd(0x06,0);//ÉèÖÃÖ¸Õë×Ô¼Ó1
	delay(1);
	write_lcd(0x0c,0);
	delay(1);
	a=0;b=0;d=0;fuhao=0;j=0;flag1=0;
}

这里我是把写命令函数和写数据函数写在了一起——write_lcd()函数,通过改变i的值来改变是写命令还是写数据。

uint keydown()
{
	uint temp;
	char a=0;
	int flag_key=0;
	P1=0x0f;
	if(P1!=0x0f)
	{
		delay(10);
		if(P1!=0x0f)
		{
			P1=0x0f;
			temp=P1;
			switch(temp)
			{
				case(0X07):	keyvalue=0;break;
				case(0X0b):	keyvalue=1;break;
				case(0X0d): keyvalue=2;break;
				case(0X0e):	keyvalue=3;break;
			}
			P1=0XF0;
			temp=P1;
			switch(temp)
			{
				case(0X70):	keyvalue=keyvalue;flag_key=1;break;
				case(0Xb0):	keyvalue=keyvalue+4;flag_key=1;break;
				case(0Xd0): keyvalue=keyvalue+8;flag_key=1;break;
				case(0Xe0):	keyvalue=keyvalue+12;flag_key=1;break;
			}
			while((a<50)&&(P1!=0xf0))	 
			{
				delay(10);
				a++;
			}
		}
	}
	if(flag_key==1)   
		return keyvalue;
	else             
		return 16;
}
这个是按键扫描函数,行列扫描完后会得到一个键值,将键值返回,每个键值对应不同的数字和运算符号
void xianshi(long x)
{
		if(x>100000000)
		{
			for(d=0;d<16;d++)
			{
				write_lcd(table2[d],1);
				delay(1);
			}
		}
		if(x==0)
		{
			write_lcd(0x30,1);
		}
		while(x!=0)
		{
		  write_lcd(0x30+x%10,1);
		  x=x/10;
		}
		x=0;
}
显示函数,因为单片机内部有最大值,所以我们需要设置一个阈值所能计算的结果不能超过此阈值,通过取余和整数除法来显是数值,
void jisuan(long m,long n,uchar xincan)
{
	if(xincan==15)
	{
		c=m+n;
		xianshi(c);
	}
	else if(xincan==11)
	{
		if(m>=n)
		{
			c=m-n;
			xianshi(c);
		}
		else
		{
			c=n-m;
		  xianshi(c);
			write_lcd(0x30+table1[11],1);
		}
	}
	else if(xincan==7)
	{
		c=m*n;
		xianshi(c);
	}
	else if(xincan==3)
	{
		if(b==0)
		{
			for(d=0;d<16;d++)
			{
		    write_lcd(table2[d],1);
	      delay(1);
			}
		}
		else
		{
			uchar i=0;
			write_lcd(0x80+0x4f,0);
			write_lcd(0x04,0);
			i=1;
			c=(long)(((float)m/n)*10000);//ÓɺóÃæ(10000)À´¸Ä±ä¾«¶È
			while(c!=0||i<=5)
			{
				write_lcd(0x30+c%10,1);
				c=c/10;
				i++;
				if(i==5)
					write_lcd(0x2e,1);
			}
			if(m/n<=0)
				write_lcd(0x30,1);
			a=0;b=0;c=0;flag1=0;fuhao=0;
		}
	}
	write_lcd(0x3d,1);
}
计算函数,当按下对应的运算符后会得到对应的符号值,分别进行计算并显示。
void jiance(uchar keyvalu)
{
	long i;
		if(keyvalu==3||keyvalu==7||keyvalu==11||keyvalu==15)
		{
			flag1=1;
			fuhao=keyvalu;//¼Ç¼·ûºÅ
			write_lcd(0x30+table1[keyvalu],1);
		}
		if(keyvalu==0||keyvalu==4||keyvalu==5||keyvalu==6||keyvalu==8||keyvalu==9||keyvalu==10||keyvalu==12||keyvalu==13||keyvalu==14)
		{
			if(flag1==0)
			{
				a=a*10+table[keyvalu];
			}
			else if(flag1==1)
			{
				b=b*10+table[keyvalu];
			}
			i=table1[keyvalu];
			xianshi(i);
		}
		else if(keyvalu==1)
		{
			write_lcd(0x80+0x4f,0);
	    write_lcd(0x04,0);
			if(fuhao==3||fuhao==7||fuhao==11||fuhao==15)
				jisuan(a,b,fuhao);
			a=0;b=0;fuhao=0;flag1=0;
		}
		else if(keyvalu==2)
		{
			write_lcd(0x01,0);a=0;b=0;flag1=0;fuhao=0;
		}
}
按键检测后将得到的键值传入检测函数中,当按下计算符时,将键值付给对应的符号值,并显示。按下等号后,计算并显示结果。
void main()
{
	uint key_data;
	init();
	while(1)
	{
		key_data=keydown();
		if(key_data!=16)
		{
			jiance(key_data);
		}
	}
}


2017.12.3


你可能感兴趣的:(学习感悟)