做的基于单片机的运算器设计,仿真的时候LCD一直不显示数字,只是亮,有人能帮忙看看怎么回事吗
4条回答 默认 最新
- 乐观的study123 2022-07-06 13:45关注解决 无用评论 打赏 举报
- M..Y 2022-07-07 00:19关注
#include <reg51.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit pinRS = P2^0;
sbit pinRW = P2^1;
sbit pinE = P2^2;
//#include "LCD1602.h"
void shortdelay(uchar i)
{
for(;i>0;i--);
}
void longdelay(uint i)
{
uint j;
for(;i>0;i--)
{for(j=100;i>0;i--);}
}
void delay(int i)
{int j;
for(;i>0;i--)
for(j=0;j<100;j++);
}
void io_init()
{P1=0xff;
}
unsigned char key_scan()
{ unsigned char key;
unsigned char temp;
uint flag;
io_init();
P1=0xf0;
flag=0;
loop:temp=P1^0xf0;
while(temp)
{
P1=0xfe;
delay(1);
if((P1&0xfe)!=0xfe)
switch(P1)
{
case 0xee:key=0x11;flag=1;break;
case 0xde:key=0x12;flag=1;break;
case 0xbe:key=0x13;flag=1;break;
case 0x7e:key=0x14;flag=1;break;
}
if(flag)
goto exit;
else
P1=0xfd;
delay(1);
if((P1&0xfd)!=0xfd)
switch(P1)
{
case 0xed:key=0x21;flag=1;break;
case 0xdd:key=0x22;flag=1;break;
case 0xbd:key=0x23;flag=1;break;
case 0x7d:key=0x24;flag=1;break;
}
if(flag)
goto exit;
else
P1=0xfb;
delay(1);
if((P1&0xfb)!=0xfb)
switch(P1)
{
case 0xeb:key=0x31;flag=1;break;
case 0xdb:key=0x32;flag=1;break;
case 0xbb:key=0x33;flag=1;break;
case 0x7b:key=0x34;flag=1;break;
}
if(flag)
goto exit;
else
P1=0xf7;
delay(1);
if((P1&0xf7)!=0xf7)
switch(P1)
{
case 0xe7:key=0x41;flag=1;break;
case 0xd7:key=0x42;flag=1;break;
case 0xb7:key=0x43;flag=1;break;
case 0x77:key=0x44;flag=1;break;
}
exit:return key;
}
if(temp==0)
goto loop;
}
void initpindata(bit i)
{
//uchar pindata,pinRS,pinRW,pinE;
if(i==1)P0=0xff;
else P0=0X00;
}
void setRS(bit i)
{
if(i==1)pinRS=1;
else pinRS=0;
}
void setRW(bit i)
{
if(i==1)pinRW=1;
else pinRW=0;
}
void setE(bit i)
{
if(i==1)pinE=1;
else pinE=0;
}
uint read_BF_AC()
{
uint temp;
initpindata(1);
setRS(0);
setRW(1);
setE(1);
shortdelay(1);
temp=P0;
shortdelay(10);
setE(0);
return(temp);
}
bit statuscheck()
{
return((bit)(read_BF_AC()&0x80));
}
void writeinstruc(uint instruc)
{
while(statuscheck());
initpindata(0);
setRS(0);
setRW(0);
setE(0);
P0=instruc;
//short delay(1);
setE(1);
shortdelay(10);
setE(0);
}
void writedata(uint data1)
{
initpindata(0);
setRS(1);
setRW(0);
setE(0);
P0=data1;
setE(1);
shortdelay(10);
setE(0);
}
uint readdata(void)
{
uint temp;
initpindata(1);
setRS(1);
setRW(1);
setE(1);
shortdelay(1);
temp=P0;
shortdelay(10);
setE(0);
return(temp);
}
void dispcharacter(int x,uint y,uint data1)
{
uint temp;
while(statuscheck());
temp=y&0x0f;
x&=0x01;
if(x) temp|=0x40;writedata(data1); //setDDRAM_Add(temp);
}
void initLCD()
{
writeinstruc(0x01);
writeinstruc(0x06);
writeinstruc(0x0c);
writeinstruc(0x38);
}compute(char key1,i)
{
signed char m,n,c,act;
long int num1,num2,result;
signed char str[4][4]={{'7','8','9','/'},
{'4','5','6',''},
{'1','2','3','-'},
{'c','0','=','+'}};
signed char str1[11],string1[2];
m=(key1&0xf0);
m=m/16;
m=m-1;
n=key1&0x0f;
n=n-1;
c=str[m][n];
sprintf(string1,"%c",c);
strcat(str1,string1);
if((c=='+')||(c=='-')||(c=='')||(c=='/'))
{
act=c;
num1=atoi(str1);
memset(str1,0,11);
memset(string1,0,2);
}
if(c=='=')
{
num2=atoi(str1);
switch(act)
{
case'+':result=num1+num2;break;
case'-':result=num1-num2;break;
case'':result=num1num2;break;
case'/':result=num1/num2;break;
}
}
if(c=='c')
{
act=0;
num1=str1[0];
num1=str1[8];
memset(str1,0,11);
memset(string1,0,2);
num1=str1[0];
num1=str1[8];
}
longdelay(350);
switch(key1)
{case 0x11:dispcharacter(0,i,'7');i++;break;
case 0x12:dispcharacter(0,i,'8');i++;break;
case 0x13:dispcharacter(0,i,'9');i++;break;
case 0x14:dispcharacter(0,i,'/');i++;break;
case 0x21:dispcharacter(0,i,'4');i++;break;
case 0x22:dispcharacter(0,i,'5');i++;break;
case 0x23:dispcharacter(0,i,'6');i++;break;
case 0x24:dispcharacter(0,i,'*');i++;break;
case 0x31:dispcharacter(0,i,'1');i++;break;
case 0x32:dispcharacter(0,i,'2');i++;break;
case 0x33:dispcharacter(0,i,'3');i++;break;
case 0x34:dispcharacter(0,i,'-');i++;break;
case 0x41:writeinstruc(0x01);break;
case 0x42:dispcharacter(0,i,'0');i++;break;
case 0x44:dispcharacter(0,i,'+');i++;break;
case 0x43:dispcharacter(0,i,'=');i++;
m=result/10000;
result=result%10000;
if(m!=0||result==0)
{
n=0;
m=m+'0';
dispcharacter(0,i,m);i++;
}
m=result/1000;
result=result%1000;
if(m!=0||n==0)
{
m=m+'0';
n=0;
dispcharacter(0,i,m);i++;
}
m=result/100;
result=result%100;
if(m!=0||n==0)
{
m=m+'0';
n=0;
dispcharacter(0,i,m);i++;
}
m=result/10;
result=result%10;
if(m!=0||n==0)
{
m=m+'0';
n=0;
dispcharacter(0,i,m);i++;
}
m=result;
if(m!=0||n==0)
m=m+'0';
dispcharacter(0,i,m);i++;break;
//case 0x44:dispcharacter(0,i,'+');i++;break;
}
return(i);
}void main() { char key1,i; start:initpindata(0); //P2=0X00; initLCD(); TMOD=0x11; EA=1; ET0=1; ET1=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; i=0; scan:key1=key_scan(); i=compute(key1,i); if(key1==0x41) goto start; else goto scan; }
解决 无用评论 打赏 举报 - weixin_40615387 2022-11-30 15:04关注解决 无用评论 打赏 举报
- charliezran 2024-02-12 16:25关注解决评论 打赏 举报无用 1