单片机简单C语言问题,实现一个个位加法计算器

Python014

单片机简单C语言问题,实现一个个位加法计算器,第1张

你的问题应该出现在键盘处理不完善造成的,稍微修改了一下你试试。

#include <reg52.h>

#define uchar unsigned char

#define unit unsigned int

#define OPdata P0 //十位数据口

#define OPdata1 P1//个位数据口

sbit se0=P3^6//十位选择

sbit se1=P3^7//个位选择

sbit Q=P2^6

sbit W=P2^5

sbit E=P2^4

uchar cis//按下键盘次数

uchar jia1//加数1

uchar jia2//加数2

uchar z//中转数

uchar shi//十位数

uchar ge//个位数

uchar s//译码结果

uchar j//译码结果

uchar sum//加法结果

uchar keytemp

void judge(uchar m) //数码显像管译码

{

switch (m)

{

case 0: s=0x3Fbreak

case 1: s=0x06break

case 2: s=0x5Bbreak

case 3: s=0x4Fbreak

case 4: s=0x66break

case 5: s=0x6Dbreak

case 6: s=0x7Dbreak

case 7: s=0x07break

case 8: s=0x7Fbreak

case 9: s=0x6Fbreak

}

}

void judge1(uchar h) //十位数码显像管译码

{

switch (h)

{

case 0: j=0x3Fbreak

case 1: j=0x06break

}

}

void judgecis()

{

if (cis==1)

{

jia1=z

ge=z

shi=0

}

else if (cis==2)

{

jia2=z

ge=z

shi=0

cis=0

}

}

void jiafa(uchar m,uchar n) //加法

{

sum=m+n

if (sum>=10)

{

ge=sum-10

shi=1

}

else

{

ge=sum

shi=0

}

}

void main()

{

cis=0

jia1=0

jia2=0

shi=0

ge=0

s=0

j=0

P2=0XFF

se0=0//开启十位

se1=0//开启个位

OPdata=0x3f//十位

OPdata1=0x3f//个位

while (1)

{

Q=0

keytemp=P2

switch (keytemp)

{

case 0xbb: z=3 cis++while(P2==0xbb) break

case 0xbd: z=6 cis++while(P2==0xbd) break

case 0xbe: z=9 cis++while(P2==0xbe) break

case 0xb7: //等于号

jiafa (jia1,jia2) cis=0 break

}

Q=1

W=0

keytemp=P2

switch (keytemp)

{

case 0xde: z=8 cis++while(P2==0xde) break

case 0xdd: z=5 cis++while(P2==0xdd) break

case 0xdb: z=2 cis++while(P2==0xdb) break

case 0xd7: z=0 cis++while(P2==0xd7) break

}

W=1

E=0

keytemp=P2

switch (keytemp)

{

case 0xee: z=7 cis++while(P2==0xee) break

case 0xed: z=4 cis++while(P2==0xed) break

case 0xeb: z=1 cis++while(P2==0xeb) break

}

judgecis()

judge(ge)

OPdata1=s

judge1(shi)

OPdata=j

E=1

}

}

以下是我编的简易计算器程序,基本成功

//4*4键盘检测程序,按下键后相应的代码显示在液晶屏上

//显示5位后,第6次显示操作符号

//再显示下一个数

// 键值与功能对应表

//键值 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零

#include<reg52.h>

sbit beep=P2^3

sbit lcden=P3^4

sbit rs=P3^5

sbit rw=P3^6

#define uint unsigned int

#define ulint unsigned long int

#define uchar unsigned char

#define lcddata P0

ulint bb,dd,ee,ff

uchar d,flag1

uchar fd1,fd2

uchar b1=16,b2=16,b3=16,b4=16,b5=16

uchar d1=16,d2=16,d3=16,d4=16,d5=16

uchar f1=16,f2=16,f3=16,f4=16,f5=16,f6=16,f7=16,f8=16,f9=16,f10=16

uchar key,keyval,c,temp

void Delay1ms(uint i) //1ms延时程序

{

uint j

for(i>0i--)

{

for(j=0j<125j++)

{}

}

}

void write_com(uchar com)

{

lcddata=com

rs=0

rw = 0

lcden=0

Delay1ms(10)

lcden=1

Delay1ms(10)

lcden=0

}

void write_date(uchar date)

{

lcddata=date

rs=1

rw=0

lcden=0

Delay1ms(10)

lcden=1

Delay1ms(10)

lcden=0

}

void init2()

{

rw=0

write_com(0x38)

Delay1ms(10)

write_com(0x0f)

Delay1ms(10)

write_com(0x06)

Delay1ms(10)

write_com(0x01)

Delay1ms(10)

}

void display1(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第1个数显示程序

{

init2()

write_com(0x80)//第1行,第1字

Delay1ms(10)

write_date(0x30+A1)

Delay1ms(10)

write_date(0x30+A2)

Delay1ms(10)

write_date(0x30+A3)

Delay1ms(10)

write_date(0x30+A4)

Delay1ms(10)

write_date(0x30+A5)

Delay1ms(10)

}

void display2(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第2个数显示程序

{

write_com(0x88)//第1行,第1字

Delay1ms(10)

write_date(0x30+A1)

Delay1ms(10)

write_date(0x30+A2)

Delay1ms(10)

write_date(0x30+A3)

Delay1ms(10)

write_date(0x30+A4)

Delay1ms(10)

write_date(0x30+A5)

Delay1ms(10)

}

void display3(uchar a) //操作符号显示程序

{

write_com(0x86)//第1行,第1字

Delay1ms(10)

switch(a)

{

case 10:

write_date('+')

Delay1ms(10)

case 11:

write_date('-')

Delay1ms(10)

case 12:

write_date('x')

Delay1ms(10)

case 13:

write_date('/')

Delay1ms(10)

}

}

void display4(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5,uchar A6,uchar A7,uchar A8,uchar A9,uchar A10,uchar A11,uchar A12) //结果显示程序

{

write_com(0x80+0x40)//第2行,第1字

Delay1ms(10)

if (flag1==0)

{

write_date('-')

}

else write_date('+')

Delay1ms(10)

write_date(0x30+A1)

Delay1ms(10)

write_date(0x30+A2)

Delay1ms(10)

write_date(0x30+A3)

Delay1ms(10)

write_date(0x30+A4)

Delay1ms(10)

write_date(0x30+A5)

Delay1ms(10)

write_date(0x30+A6)

Delay1ms(10)

write_date(0x30+A7)

Delay1ms(10)

write_date(0x30+A8)

Delay1ms(10)

write_date(0x30+A9)

Delay1ms(10)

write_date(0x30+A10)

Delay1ms(10)

write_date('.')

Delay1ms(10)

write_date(0x30+A11)

Delay1ms(10)

write_date(0x30+A12)

Delay1ms(10)

}

uchar keyscan()

{

key=16

P3=0xef//P3.7输出1个低电平

temp=P3//读取

temp=temp&0x0f//屏蔽高4位

if(temp!=0x0f)

{

Delay1ms(10)

if(temp!=0x0f)

{

temp=P3

switch(temp)

{

case 0xee:

key=0

break

case 0xed:

key=4

break

case 0xeb:

key=8

break

case 0xe7:

key=12

break

}

while(temp!=0x0f)

{

temp=P3

temp=temp&0x0f

beep=0

}

beep=1

}

}

P3=0xdf

temp=P3

temp=temp&0x0f

if(temp!=0x0f)

{

Delay1ms(10)

if(temp!=0x0f)

{

temp=P3

switch(temp)

{

case 0xde:

key=1

break

case 0xdd:

key=5

break

case 0xdb:

key=9

break

case 0xd7:

key=13

break

}

while(temp!=0x0f)

{

temp=P3

temp=temp&0x0f

beep=0

}

beep=1

}

}

P3=0xbf

temp=P3

temp=temp&0x0f

if(temp!=0x0f)

{

Delay1ms(10)

if(temp!=0x0f)

{

temp=P3

switch(temp)

{

case 0xbe:

key=2

break

case 0xbd:

key=6

break

case 0xbb:

key=10

break

case 0xb7:

key=14

break

}

while(temp!=0x0f)

{

temp=P3

temp=temp&0x0f

beep=0

}

beep=1

}

}

P3=0x7f

temp=P3

temp=temp&0x0f

if(temp!=0x0f)

{

Delay1ms(10)

if(temp!=0x0f)

{

temp=P3

switch(temp)

{

case 0x7e:

key=3

break

case 0x7d:

key=7

break

case 0x7b:

key=11

break

case 0x77:

key=15

break

}

while(temp!=0x0f)

{

temp=P3

temp=temp&0x0f

beep=0

}

beep=1

}

}

return(key)

}

void main()

{ while(1)

{

c=1

while(c<6)//输入第1个5 位数

{

keyval=keyscan()

if(keyval<10)

{

switch(c)

{

case 1:b1=keyval break

case 2:b2=keyval break

case 3:b3=keyval break

case 4:b4=keyval break

case 5:b5=keyval break

}

c++

}

display1(b1,b2,b3,b4,b5)

}

while(c==6) //输入计算符号

{

keyval=keyscan()

if((keyval>=10)&&(keyval<14)) //可去一层括号,因逻辑运算优先级较低

{

d=keyval

}

c=1

display3(d)

}

while(c<6) //输入第2个5 位数

{

keyval=keyscan()

if(keyval<10)

{

switch(c)

{

case 1:d1=keyval break

case 2:d2=keyval break

case 3:d3=keyval break

case 4:d4=keyval break// 除

case 5:d5=keyval break

}

c++

}

display2(d1,d2,d3,d4,d5)

}

bb= b1*10000+b2*1000+b3*100+b4*10+b5

dd=d1*10000+d1*1000+d3*100+d4*10+d5

while(keyval!=14) //等待按下"="

{

keyval=keyscan()

}

Delay1ms(10)

switch(d)

{

case 10:ee=bb+dd break//+

case 11:

flag1=1

if(bb>=dd)

{

ee=bb-dd //-

flag1=0

}

else ee=dd-bb

break

case 12:ee=bb*dd break//*可能会溢出

case 13:ee=bb/dd //除法小数部分会丢失,保留2位

ff=bb%dd

fd1=ff*10/dd

fd2=ff*100/dd%10

break

}

f10=ee/1000000000%10

f9=ee/100000000%10

f8=ee/10000000%10

f7=ee/1000000%10

f6=ee/100000%10

f5=ee/10000%10

f4=ee/1000%10

f3=ee/100%10

f2=ee/10%10

f1=ee%10

display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2)

while(keyval!=15)

{

keyval=keyscan()

}

b1=0b2=0b3=0b4=0b5=0

d1=0d2=0d3=0d4=0d5=0

bb=0dd=0ee=0

init2()

}

}