标题:
单片机计算器,但是lcd1602显示屏不显示数字
[打印本页]
作者:
Zhang汤
时间:
2021-1-12 15:02
标题:
单片机计算器,但是lcd1602显示屏不显示数字
设计一个简易计算器,但是lcd1602显示屏不显示数字,代码如下,硬件检查无错,求救,急急急!
#include <reg52.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;//指令0,数据1
sbit rw=P2^1;//读0,写1,引脚
sbit lcden=P2^2;//使能端
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
uchar temp,num,flag,i,j,k,n,m,aa[10]={0},bb[11]={0};
bit flag_1;
uint sum[20]={0},count;
uint m_delay;
/*我自己写的一个pow,只能算整数*/
int pow_wozijxiede(int xx,int yy)
{
uint i;
int product=1;
for(i=0;i<yy;i++)
{
product=product*xx;
}
return product;
}
/**********************************************
延时函数 ms
*********************************************/
void delayms(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/**********************************************
1602指令,数据,初始化
*********************************************/
void write_1602com(uchar com)
{
P0=com;
rs=0;//指令
rw=0;//写
lcden=0;
delayms(20);
lcden=1;
delayms(20);
lcden=0;
}
void write_1602date(uchar date)
{
P0=date;
rs=1;//数据
rw=0;//写
lcden=0;
delayms(20);
lcden=1;
delayms(20);
lcden=0;
}
void init_lcd1602()
{
write_1602com(0x38);//选择16x2显示,5x7点阵
delayms(20);
write_1602com(0x0f);//开显示,开光标,光标闪烁
delayms(20);
write_1602com(0x06);//读或写后,指针加一,光标加一
delayms(20);
write_1602com(0x01);//清屏
delayms(20);
}
/*****************************************
检测按键并输出
******************************************/
uchar keyscan()
{
P3=0xfe;
temp=P3;
while(temp!=0xfe)
{
delayms(5);
temp=P3;
while(temp!=0xfe)
{
switch(temp)
{
case 0xee:num=7;
break;
case 0xde:num=8;
break;
case 0xbe:num=9;
break;
case 0x7e:num='/';
break;
}
while(temp!=0xfe)
{
flag=1;
temp=P3;
}
}
}
P3=0xfd;
temp=P3;
while(temp!=0xfd)
{
delayms(5);
temp=P3;
while(temp!=0xfd)
{
switch(temp)
{
case 0xed:num=4;
break;
case 0xdd:num=5;
break;
case 0xbd:num=6;
break;
case 0x7d:num='*';
break;
}
while(temp!=0xfd)
{
flag=1;
temp=P3;
}
}
}
P3=0xfb;
temp=P3;
while(temp!=0xfb)
{
delayms(5);
temp=P3;
while(temp!=0xfb)
{
switch(temp)
{
case 0xeb:num=1;
break;
case 0xdb:num=2;
break;
case 0xbb:num=3;
break;
case 0x7b:num='-';
break;
}
while(temp!=0xfb)
{
flag=1;
temp=P3;
}
}
}
P3=0xf7;
temp=P3;
while(temp!=0xf7)
{
delayms(5);
temp=P3;
while(temp!=0xf7)
{
switch(temp)
{
case 0xe7:num='c';
break;
case 0xd7:num=0;
break;
case 0xb7:num='=';
break;
case 0x77:num='+';
break;
}
while(temp!=0xf7)
{
flag=1;
temp=P3;
}
}
}
if(P1_0==0)
{
for(m_delay=0;m_delay<3000;m_delay++);
if(P1_0==0)
{
num='^';
flag=1;
while(!P1_0);
}
}
if(P1_1==0)
{
for(m_delay=0;m_delay<3000;m_delay++);
if(P1_1==0)
{
num='#';
flag=1;
while(!P1_1);
}
}
if(P1_2==0)
{
for(m_delay=0;m_delay<3000;m_delay++);
if(P1_2==0)
{
num='&';
flag=1;
while(!P1_2);
}
}
return num;
}
/*********************************************
将逐个输入数 aa[] 转化为整数
*********************************************/
void zuan_shu()
{
switch(n)
{
case 0:sum[j++]=0;break;
case 1:sum[j++]=aa[0];break;
case 2:sum[j++]=aa[0]*10+aa[1];break;
case 3:sum[j++]=aa[0]*100+aa[1]*10+aa[2];break;
case 4:sum[j++]=aa[0]*1000+aa[1]*100+aa[2]*10+aa[3];break;
/* case 5:sum[j++]=aa[0]*10000+aa[1]*1000+aa[2]*100+aa[3]*10+aa[4];break;
case 6:sum[j++]=aa[0]*100000+aa[1]*10000+aa[2]*1000+aa[3]*100+aa[4]*10+aa[5];break;
case 7:sum[j++]=aa[0]*1000000+aa[1]*100000+aa[2]*10000+aa[3]*1000+aa[4]*100+aa[5]*10+aa[6];break;
case 8:sum[j++]=aa[0]*10000000+aa[1]*1000000+aa[2]*100000+aa[3]*10000+aa[4]*1000+aa[5]*100+aa[6]*10+aa[7];break;
*/
}
}
/****************************************************
液晶显示函数
******************************************************/
void lcd1602_display(uint count)
{
uchar a,b,c,d,e; //f,g,h;
a=count%10;
b=count/10%10;
c=count/100%10;
d=count/1000%10;
e=count/10000%10;
/* f=count/100000%10;
g=count/1000000%10;
h=count/10000000%10;
write_date(0x30+h);
write_date(0x30+g);
write_date(0x30+f);
*/
if(e!=0)
write_1602date(0x30+e);
if((e==0&&d!=0)||e!=0)
write_1602date(0x30+d);
if((e==0&&d==0&&c!=0)||e!=0||d!=0)
write_1602date(0x30+c);
if((e==0&&d==0&&c==0&&b!=0)||e!=0||d!=0||c!=0)
write_1602date(0x30+b);
write_1602date(0x30+a);
}
/*************************************************
运算结果函数并保存至 sum[k]
**************************************************/
void yunsuan()
{
uchar m;
for(k=0;bb[k]!=0&&k<10;k++) //先找出高级运算符运算
{
if(bb[k]=='*')
{
sum[k+1]=sum[k]*sum[k+1];
sum[k]='N';
}
if(bb[k]=='/')
{
if(sum[k+1]!=0)
{
sum[k+1]=sum[k]/sum[k+1];
sum[k]='N';
}
else
{
for(m_delay=0;m_delay<10;m_delay++)
{
sum[m_delay]=0;
}
flag_1=1;
}
}
}
for(k=0;bb[k]!=0&&k<10;k++)
{
if(bb[k]=='+')
{
for(m=1;sum[k+m]=='N';)
{
m++;
}
sum[k+m]=sum[k]+sum[k+m];
}
if(bb[k]=='-')
{
for(m=1;sum[k+m]=='N';)
{
m++;
}
sum[k+m]=sum[k]-sum[k+m];
}
if(bb[k]=='^')
{
for(m=1;sum[k+m]=='N';)
{
m++;
}
sum[k+m]=pow_wozijxiede(sum[k],sum[k+m]);
}
if(bb[k]=='#')
{
for(m=1;sum[k+m]=='N';)
{
m++;
}
sum[k+m]=sqrt(sum[k]);
}
}
}
/*************************************************
main函数
***************************************************/
void main()
{
init_lcd1602();
while(1)
{
flag=0;
keyscan();
if(flag!=0)
{
if(num>=0&&num<=9)
{
aa[i++]=num;
write_1602date(0x30+num);
n++;
}
if(num=='+')
{
write_1602date(0x20+11);//1602 '+'符
bb[k++]=num;
zuan_shu();
for(i=0;i<n;i++)
aa[i]=0;
i=0;
n=0;
}
if(num=='-')
{
write_1602date(0x20+13);//1602 '-'符
bb[k++]=num;
zuan_shu();
for(i=0;i<n;i++)
aa[i]=0;
i=0;
n=0;
}
if(num=='*')
{
write_1602date(0x20+10);//1602 '*'符
bb[k++]=num;
zuan_shu();
for(i=0;i<n;i++)
aa[i]=0;
i=0;
n=0;
}
if(num=='/')
{
write_1602date(0xf0+13);//1602 '/'符
bb[k++]=num;
zuan_shu();
for(i=0;i<n;i++)
aa[i]=0;
i=0;
n=0;
}
if(num=='c'&&m==0) //删除一个数或一个运算符
{
write_1602com(0x04);//读或写后,指针减一,光标减一
write_1602date(' ');//1602 空符
write_1602com(0x06);//读或写后,指针加一,光标加一
if(n!=0)
{
n--;
aa[--i]=0;
}
else
{
bb[--k]=0;
}
}
if(num=='^')
{
write_1602date(0xdf);//1602 '^'符
bb[k++]=num;
zuan_shu();
for(i=0;i<n;i++)
aa[i]=0;//[/i][i]
i=0;
n=0;
}
if(num=='#')
{
write_1602date(0xde);//1602 '#'符
bb[k++]=num;
zuan_shu();
for(i=0;i<n;i++)
aa[i]=0;//[/i][i]
i=0;
n=0;
}
if(num=='&')
{
for(m_delay=0;m_delay<10;m_delay++)
{
aa[m_delay]=0;
sum[m_delay]=0;
bb[m_delay]=0;
}
i=0;
n=0;
k=0;
j=0;
m=0;
flag_1=0;
init_lcd1602();
write_1602com(0x01);//清屏
delayms(20);
}
if(num=='=')
{
m=1;
write_1602com(0xc0);
write_1602date(0x30+13);//1602 '='符
zuan_shu();
yunsuan();
if(flag_1)
{
count=0;
write_1602date(0x45);//1602 '#'符
}
else
{
count=sum[k];
lcd1602_display(count);
}
write_1602com(0x0c);
flag_1=0;
}
}
}
}
复制代码
作者:
wwh2382
时间:
2021-1-12 17:14
先确认1602能不能正常显示字符或字符串
作者:
人人学会单片机
时间:
2021-1-12 18:22
看这个贴子 单片机+LCD1602显示℃ 这种自定义符号
http://www.51hei.com/bbs/dpj-200685-1.html
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1