微架构 集成电路 寄存器 主频 缓存 晶体管
主页 正文

51单片机计算器代码如何编写

求。 用89C51单片机设计4*4矩阵式键盘计算器程序

/* 我写的计算器是为了计算255范围内的整数。
一开始我决定添加小数并进行最后的处理。
但实在是太费时间了,所以我就离开了。
我看到你的问题,我毫不犹豫地改变它。
*/

#include

信号行,行,Val;

无效延迟(

{

无符号计数;

f 或 (count=0, count<255; count++

无符号, rt;

for (count= .> ; void InitialCPU ( 空

{

P0=0xFF;

P1=0x0F;

P2=0xFF;

P3=0xFF;

}

不是chari leddata[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0 x80,0x90};

bai=dat/100;

if(bai==0

return 0x00;

P2=0x20;

P0=leddata [bai];

暂停();

P2=0x00;

返回0x00;

}

char ledshi (无符号数据

{

无符号shi;

sh=(dat%100)/10;

if (shi==0

return 0x00;

P2=0x40;

P0=leddata[shi];

延迟();

P2=0x00;

}

空裂缝 (无符号数据

{

无电荷;

ge= dat%10;

P2=0x80;

P0=le ddata[ge];

delay();

}

char bin=1;

空ledplay(unsigned dat.

{ // LED显示函数

if(bin==1){

ledbai(dat);

bin++;

}

; 2){

ledshi(dat);

bin++;

}

if(==3){

破解(dat);

bin=1;

}

}

char futemp=0,data1=0 ,数据2=0;

无效 (

{

TMOD=0x01;

TH0=(65356-1000)/256

TR0=1;

ET0=1;

if(data1==0&&futemp==0&&data2== 0){ // 显示 LED data1,为初始值

ledplay(data1);

}

else if( data1!/ data1 value, data1 display,

ledplay (data1);

else if(data1==0&&futemp!=0&&data2==0) // 有两种可能, 1、data1为null 综上,显示data1;

ledplay(data1);

else if(data1!=0&&futemp!=0&&data2==0) // 输入为符号,然后显示data1

ledplay(data1) ;

else if(data1!=0&&fu temp!=0&&data2!=0) //显示data2

ledplay(data2);

TH0=(65536-100)/256;

TR0=1;

}

空灯后(

{

data2=0;

futemp=0;

}

无符号 KeyTemp,CheckValue,Key1=0x00,Key2=0x00;

处理空心(

{

char Val;

if(Line .) ==0x01

Line=0;

if (行==0x10

行=0;

if (行== 0x20

行=;

else if (Row==0x40

Row=2;

else if (Row==0x80

Row.w= 3;

Val=Line*4+Row;

if(Val<10){ // 保存数字

if(futemp== 0 ) { //存在于data1中

if(data1==0

data1=Val;

else

data1=data1*10+Val;

}

else{ //存在于data2中

if(data2==0

data2=Val;

else

data2=data2*10+Val;

}

}

9&&Val<16){

if(Val!=13&&Val!=12)

futemp=Val; data2=0;

if(futemp==10){

data1=data1*data2;

denghou( );

}

else if(futemp==111){

data1=data1/data2;

denghou();

}

else if(futemp==14){

data1=data1 -data2;

denghou();

}

别的东西 if(futemp==155){

data1=data1+data2 ;

denghou(); while(1){

P2=0xff;

P0=0x00;

}

}

}

}

else

while(1){

P2=0xff;

<

P0=0x 00;

} //显示错误

}

chari GetKey1 (void

{ P1=0x0F;

CheckValue=P1^0x0F; 0x00,

else if (CheckValue==0x01

Line=CheckValue;

else if (CheckValue ==0x04

Line=CheckValue;

if (CheckValue==0x08

Line=CheckValue;

> 0x0F;

Key1; har GetKey2 (无效

{

P1=0xF0;

CheckValue=P1^0xF0;

if(CheckValue==0x00

Row= CheckValue,

if (CheckValue==0x20

Row=CheckValue;

else if (CheckValue==0x40

Row=CheckValue;

Value==0x80

Row=CheckValue;

delay1();

按键温度 = P1^0xF0;

if(KeyTemp ==CheckValue

return 0x00;

Key2=0xF0;

Return Key2;

InitialCPU ();

InitialTimer0();

while (1

{

Key1=GetKey1();

Key2=GetKey2();

if(Key1!=0x00&&Key2!= 0x00

{

排列();

P3=0x00;

}

}

}

基于51单片机的简易计算器设计,急

//函数0123456789+-×÷=空表3-1 3.2计算器软件设计

#include //头文件

#defineu intunsignedint//

#defineucharunsignedchar

sbitlcden=P2^3;//定义引脚

sbitrs=P2 ^4;

sbitrw=P2^0;

sbitbusy=P0^7;

chari,j,temp,num,num_1;

龙加,b,c; ,第一个数字b,第二个数字c,获取数字

floata_c,b_c;

ucharflag, fuhao;//flag表示是否有符号键按下,fuhao表示是哪个Symbol按下

ucharcodetable[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};

ucharcodetable1[] ={

7,8,9,0x2 f-0x30,

4,5,6,0x2a-0x30,

1,2,3, 0x2d-0x30,

voiddelay(ucharz)//延迟函数

{

uchary;

0;z--)

for(y=0;y<110;y++);

} voidcheck()//判断忙还是闲

{

make{

P0=0xFF;

rs=0; //说明

rw=1; //读取

lcden=0; //禁用读写

delay(1);//等待液晶显示器处理数据

lcden= 1; //允许读写

}current(bus sy==1);//判断是否空闲,1忙,0空闲

}

voidwrite_com(ucharcom)//写命令函数

{

P0=com; //com命令支付给P0端口

rs=0;

rw=0;

lcden=0;

check( );

lcden=1;

}

voidwrite_date(uchardate)//写入数据函数

{

P0=日期;

rs=1;

rw=0;

lcden =0;

check();

lcden=1;

}

voidinit()//初始化

{

num=-1;

lcden=1;//使能信号为高电平

write_com(0x38);//8位,2 line

write_com(0x0c);//显示开启,光标关闭,不闪烁*/

write_com(0x06);//递增模式不移动显示?

write_com(0x80);//忙信号的作用

write_com(0x01);//显示亮,光标灭,不闪烁

num_1=0;

i=0;

j=0;

a=0; //第一个加入Number来处理

b=0; //第二个参与运算的数字

c=0;

flag=0;//flag表示符号键是否按下,

fuhao=0;//fuhao表示按下哪个符号

}< /

voidkeyscan()//扫描键盘

{

P3=0xfe;

if(P3!=0xfe)

{

delay(20);//延迟 20ms

if(P3!=0x ​fe)

{

temp=P3&0xf0;

开关(temp)

{

case0xe0:num =0;

break;

case0xd0:num=1;

中断;

case0xb0:num=2;

中断

case0x70:num=3;

break;

}

}

当前(P3!=0xfe);

if(num==0 ||num==1||num==2)//如果按 “7”、“8”或“9”

{

if(j!=0)

{

if(j!=0)

{

}

if(fl ag==0)//符号键尚未按下

{

a=a*10 +table[ num]

}

else//如果符号键已被按下

{

b= b*10 +表[数字] ;

}

}

else//如果按'/'

{

flags=1 ;

fuhao=4;// 4表示除号被按下

}

i=table1[num]

write_date (0x30 +i);

}

P3=0xfd;

i f(P3!=0xfd)

{

延迟(5);

if(P3!=0xfd)

{

temp=P3&0xf0;

开关(临时)

{

case0xe0:num=4;

break;

case0xd0:num=5;

break;

ca se0xb0:num=6;

break;

case0x70:num=7;

break;

}

}

同时(P3!=0x fd);

if(num==4||num==5||num==6&&num!=7)//如果按'4'、'5'或'6'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//未按下按键符号

{

a=a*10+table[num];

}

else//如果符号键已被按下

{< /p >

b=b*10 +表[数字];

}

}

else//如果您按“/”

{

flag=1;

fuhao=3;//3表示已按下乘号

}

i=table1[num];

write_date( 0x30+i);

}

P3=0xfb;if(P3!=0xfb)

{

延迟( 5) ;

如果 (P3!=0xfb)

{

temp=P3&0xf0;

开关(temp)

{

case0xe0:num=8; /p>

break;

case0xd0:num=9;

打破; 中断;

case0x70:num=11;

中断;

}

}

if(number==8||n um==9||num==10)//如果按'1'、'2'或'3'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//符号键还没有 Pressed

{

a=a*10+table[number];

}

else//如果符号键有被按下

{

b=b*10+table[num];

}

}

elseif(num=11)//如果按 '-'

{

flag=1;

fuhao=2;//2表示减号被按下

}

i=table1[num];

write_date(0x30+i);

}

P3=0xf7;

if(P3!=0xf7)

{

延迟(5);

if(P3!=0xf7)

{

temp=P3&0xf0;

开关(临时)

{

case0xe0:num=12 ;

break;

case0xd0:num=13;

>break;

case0x70:num=15;

break;

}

}

同时(P3!=0xf7) ;

开关(数字)

{

case12:{write_com(0x01);a=0;b=0;flag =0;fuhao=0;}//什么是 按下的是“清除”

休息

Case13: {;

write_date(0x30);

P1=0;

}

elseif(flag==1)//如果符号键已被按下

{

b=b*1 0;

write_date(0x30);

}

}

break;

case14:{j =1;

if(fuhao= =1){write_com(0x80+0x4f); //按等号键,光标到第二行最后一个显示位置

write_com(0x04); 从最后到第一个,每次写完数据,光标都会回到一个空格

c=a+b;

while(c!=0)

{

write_date (0x30+c%10);

c=c/10 ;

}

write_date(0x3d ); //再写一次"="

a=0;b=0;flag=0;fuhao=0 ;

}

els eif(fuhao= =2){write_com(0x80+0x4f); //光标前进到第二行最后显示位置

write_com(0x04); 向前,每写入一条数据,光标就向后移动一格

//(这逻辑上说顺序不对,可以像上一段一样显示)

0)

c=a-b;

else

c=b-a;

当前(c!=0)

{

write_date(0x30+c%10);

c =c/10;

}

i f(a-b<0)

write_date(0x2d);

write_date(0x3d); //再写一次"=

a=0;b=0;flag=0;fu hao=0;

}

elseif(fuhao==3){write_com(0x80+0x4f);

write_com(0x04);

c=a*b;

while(c!=0)

{

c=c/10;

}

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0 ;

}

elseif( fuhao==4){write_ com(0x80+0x4f);

write_com(0x04);

i=0;

c=(long)(((float)a/b )*1000);

当前(c!=0)

{

write_date(0x30+c%10);

c=c/10;

i++;

if(i==3)

write_date(0x2e);

}

if(a/b<=0)

write_date(0x30);

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

}

损坏;

case15:{write _date(0x30+table1[num]);flag=1;fuhao=1;}

break;

}

}

}

<

main()

{

init();

while(1)

{

keyscan();

}

}

热门资讯
惠普暗夜精灵2专用内存条型号
CPU参数解析与超频潜力速查指南
半导体基金排行精选优质基金推荐
单片机总线
探索时间秒表的精准记录之旅
深入解析中断类型码的多样应用
实用社区工作经验分享:心得与感悟
交流伺服电机选型