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);
}
}
}