标题:
1602制作计算器
[打印本页]
作者:
清醒梦
时间:
2017-10-31 14:07
标题:
1602制作计算器
有谁可以帮忙看下程序吗?就是程序无法做运算?
#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit lcden=P2^7;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x30);
write_com(0x80);
}
void write_char(uchar x,uchar y,uchar dat)
{
if(y==0)
{
write_com(0x80+x);
}
else
{
write_com(0xc0+x);
}
write_data( dat);
}
void write_string(uchar x,uchar y,uchar *s)
{
if(y==0)
{
write_com(0x80+x);
}
else
{
write_com(0xc0+x);
}
while(*s)
{
write_data(*s);
s++;
}
}
uchar keyscan()
{
unsigned char cord_h,cord_l;
P1=0x0f;
cord_h=P1&0x0f;
if(cord_h!=0x0f)
{
delay(50);
if((P1&0x0f)!=0x0f)
{
cord_h=P1&0x0f;
P1=cord_h|0xf0;
cord_l=P1&0xf0;
while((P1&0xf0)!=0xf0);
return(cord_h+cord_l);
}
}
return(0xff);
}
unsigned char keypro()
{
switch(keyscan())
{
case 0x77:return '+';break;
case 0x7b:return '-';break;
case 0x7d:return 'x';break;
case 0x7e:return '/';break;
case 0xbb:return '3';break;
case 0xbd:return '6';break;
case 0xbe:return '9';break;
case 0xb7:return '=';break;
case 0xdb:return '2';break;
case 0xdd:return '5';break;
case 0xde:return '8';break;
case 0xd7:return '0';break;
case 0xeb:return '1';break;
case 0xed:return '4';break;
case 0xee:return '7';break;
case 0xe7:return '.';break;
default:return 0xff;break;
}
}
void main()
{
unsigned char i,num,sign;
unsigned char temp[16];
bit firstflag;
float a=0,b=0;
unsigned char s;
init();
delay(10);
write_com(0x01);
while(1)
{
num=keypro();
if(num!=0xff)
{
if(i==0)
write_com(0x01);
if(('+'==num)||(i==16)||('-'==num)||('*'==num)||('='==num)||('/'==num))
{
i=0;
if(firstflag==0)
{
sscanf(temp,"%f",&a);
firstflag=1;
}
else
sscanf(temp,"%f",&b);
for(s=0;s<16;s++)
temp[s]=0;
write_char(0,1,num);
if(num!='=')
{
write_char(0,0,num);
sign=num;
}
else
{
firstflag=0;
switch(sign)
{
case '+':a=a+b;break;
case '-':a=a-b;break;
case '*':a=a*b;break;
case '/':a=a/b;break;
default:break;
}
sprintf(temp,"%f",a);
write_string(1,1,temp);
sign=0;a=b=0;
for(s=0;s<16;s++)
temp[s]=0;
}
}
else if(i<16)
{
if((0==i)&&(temp[0]=0))
{
if(num=='0')
{
write_com(0x01);
}
else
{
temp[0]=num;
i++;
write_char(0,0,num);
}
}
else
{
temp[i]=num;
write_char(i,0,num);
i++;
}
}
}
}
}
作者:
莫先生
时间:
2017-11-1 09:32
好厉害
作者:
Lb12138
时间:
2017-11-1 10:32
厉害了
作者:
blue2008czm
时间:
2017-11-1 10:48
厉害了
作者:
blue2008czm
时间:
2017-11-1 10:49
厉害啊,学习
作者:
weiwei850113
时间:
2017-11-2 21:04
运行不起来么
作者:
zhu814046410
时间:
2017-11-3 16:02
#include <reg51.h>
sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
sbit K5=P2^4;
sbit K6=P2^5;
sbit K7=P2^6;
sbit K8=P2^7;
sbit K9=P1^5;
sbit K10=P1^6;
sbit bell=P1^7;
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
void init();
void wcom(unsigned char i);
void wdata(unsigned char i);
void ifnotbusy(void);
unsigned char code music_H[]={0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe, 0xfa,0xfb,0xfb,0xfb,0xfa, 0xf9,0xfa,0xfb, 0xfb,0xfa,0xfb,0xfb,0xfa,0xf9,0xf9,0xfa,0xf9,0xfb,0xfa,0xfa,0xf9,0xf9,0xfb,0xf9,0xf9,0xfb,0xf9, 0xf9,0xf9,0xfa, 0xf9,0xf9,0xfa, 0xfb,0xfb,0xfb,0xfb,0xfb,0xf9,0xfa};
unsigned char code music_L[]={0x8f,0xef,0x45,0x6c,0xb4,0xf4,0x2e,0x3d, 0x8c,0x68,0xe9,0x68,0xbc, 0xe1,0x8c,0x68, 0x68,0x8c,0x68,0x68,0x8c,0xe1,0x21,0x8c,0xe1,0x68,0xd8,0x8c,0x21,0xe1,0x68,0x21,0xe1,0x68,0x21, 0x21,0x21,0x8c, 0x21,0x21,0x8c, 0xe9,0xe9,0xe9,0xe9,0x68,0x21,0x8c};
unsigned char code Time[]={500,500,500,500,500,500,500,500,500,500,500,500,500,250,250,500,500,800,500,500,500,500,250,250,500,500,800,500,500,1000,500,500,1000,500,500,500,500,500,500,500,500,500,500,500,500,500};
int i;
void fy();
void delay( int k);
main()
{
TMOD=0x01; //选择方式1
TH0=music_H[i]; // 高八位
TL0=music_L[i]; //低八位
//TR0=1; //启动计时
while(1){
if(K1==0)
{delay(10);
if(K1==0)
{
i=0;
fy();
init();
wcom(0x80);
wdata(0x31);
}
}
if(K2==0)
{delay(10);
if(K2==0)
{
i=1;
fy();
init();
wcom(0x80);
wdata(0x32);
}
}
if(K3==0)
{delay(10);
if(K3==0)
{
i=2;
fy();
init();
wcom(0x80);
wdata(0x33);
}
}
if(K4==0)
{delay(10);
if(K4==0)
{ i=3;
fy();
init();
wcom(0x80);
wdata(0x34);
}
}
if(K5==0)
{delay(10);
if(K5==0)
{ i=4;
fy();
init();
wcom(0x80);
wdata(0x35);
}
}
if(K6==0)
{delay(10);
if(K6==0)
{ i=5;
fy();
init();
wcom(0x80);
wdata(0x36);
}
}
if(K7==0)
{delay(10);
if(K7==0)
{ i=6;
fy();
init();
wcom(0x80);
wdata(0x37);
}
}
if(K8==0)
{delay(10);
if(K8==0)
{ i=7;
fy();
init();
wcom(0x80);
wdata(0x38);
}
}
if(K9==0)
{delay(10);
if(K9==0)
{ i=8;
wcom(0x80);
wdata('l');
wcom(0x81);
wdata('z');
wcom(0x82);
wdata('l');
wcom(0x83);
wdata('h');
while(1)
{
fy();
i++;
if(i>=25)
break;
}
}
}
if(K10==0)
{delay(10);
if(K10==0)
{ i=40;
wcom(0x80);
wdata('h');
wcom(0x81);
wdata('l');
wcom(0x82);
wdata('w');
while(1)
{
fy();
i++;
if(i>=53)
break;
}
}
}
}
}
void fy()
{ int j=0;
TR0=1;
while(j<Time[i]) //Time[i]music_Time[i]
{ if(TF0==1) //定时/计数器溢出标志位 TF0=1 表示溢出
{ TF0=0;
TH0=music_H[i];
TL0=music_L[i];
bell=!bell;
j++;
}
}
TR0=0;
}
void delay(int k)
{
int b,d;
for (d=0;d<k;d++)
{
for(b=0;b<250;b++);
}
}
void init()
{
wcom(0x01);
wcom(0x38);
wcom(0x06);
wcom(0x0c);
}
void ifnotbusy()
{ P0=0xff;
RS=0;
RW=1;
E=0;
E=1;
while(P0&0x80)
{
E=0;E=1;
}
}
void wcom(unsigned char j)
{ifnotbusy();
E=0;
RS=0;
RW=0;
P0=j;
E=1;
E=0;
}
void wdata(unsigned char j)
{ifnotbusy();
E=0;
RS=1;
RW=0;
P0=j;
E=1;
E=0;
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1