芯片 内存 集成电路 处理器 主频 总线
主页 正文

51单片机计算器报告

基于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();

}

}

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

/*我写的计算器可以计算255之间的整数,本来是打算加上小数位,做最后的处理。
但时间太长了,所以我把它留在那里。
我看到了你的问题,并没有费心去编辑它。
让我们看看它是否有效。
*/

#include

unsigned char Line,Row,Val;

void delay()

{

无符号字符数;

f or(count=0;count<255;count++)

;

}

}

void delay1()

{

的数量 无符号字符,rt;

for(count= 0;count<40;count++)

for(rt=0;rt<100;rt++)

;

}

void InitialCPU(void)

{

P0=0xFF;

P1= 0x0F ;

P2=0xFF;

P3=0xFF;

无符号字符 leddata[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92, 0x82 ,0xF8,0x80,0x90}; //“0-9”

unsigned char ledbai(unsigned char data)

{

unsigned char bai;

bai= dat/100;

if(bai==0)

返回 0x00;

P2=0x20;

延迟();

P2=0x00;

返回 0 x00;

unsigned char ledshi(char dat unsigned )

{

无符号字符 shi;

shi=(dat%100)/10;

if(shi ==0 )

返回 0x00;

P2=0x40;

P0=leddata[shi];

延迟();

P2=0x00;

返回0x00;

空边缘(无符号字符数据)

{

unsigned ge char;

ge= dat%10;

P2=0x80;

P0=ddata[ge];

延迟();

>

unsigned char bin=1;

void ledplay(无符号 char dat )

{ //LED显示函数

if(bin==1){

ledbai(dat);

bin++;

else if(bin== 2){

ledshi(dat);

bin++;

否则 if(bin==3){

壁架(dat);

bin=1;

}

无符号字符 futemp=0,data1=0, data2 =0;

void InitialTimer0(void)

{

TMOD=0x01;

TH0=(65536-1000)/256;

TR0=1; //开始T0

EA= 1;

ET0=1; //允许中断T0

void Timer0(void)中断1使用3

{

TR0=0 ;

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

ledplay(data1);

}

其他 if( data1 =0&&futemp==0&&data2==0) //data1有值,显示data1,

ledplay(data1);

else if(data1==0&&futemp!= 0&&data2==0) //有两种可能,1、数据data1为零; 2.直接data1并没有给它赋值。
总之显示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;

void denghou()

{

数据2=0;

futemp=0;

unsigned char KeyTemp,CheckValue,Key1=0x00,Key2=0x00;

void Dispose()

{

unsigned char Val;

if(Line ==0x01)

Line=0;

否则 if(Line==0x02)

Line=1;

else if(Line==0x04)

Line=2;

else if(Line==0x08)

Line=3;

if(Row==0x10)

Row=0;

else if(行==0x20)

行=1;

else if(Row==0x40)

Row=2;

else if(Row==0x80)

Row =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;

other

data2=data2*10+Val;

}

9&&Val<16){

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

futemp=Val; //保存符号并处理响应

else if(Val==12){

data1= 0;

data2=0;

富临时=0;

else if(Val==13){

if(futemp==10){

data1=data1* data2;

denghou();

else if(futemp==11){

data1=data1/data2;

denghou();

}

else if(futemp==14){

data1=data1 -data2;

denghou();

}

其他 if(futemp==15){

data1=data1+data2 ;

denghou();

}

其他{

while(1){

P2=0xff;

P0=0x00 ;

}

}

}

其他

while( 1){

P2=0xff;

P0=0x 00;

} //显示错误

无符号字符 GetKey1(void)

{

P1=0x0F;

CheckValue=P1^0x0F;

if(CheckValue==0x00)

返回 0x00;

否则 if(CheckValue==0x01)

Line=CheckValue;

else if(CheckValue==0x02)

Line=CheckValue;

else if(CheckValue ==0x04)

Line=CheckValue;

else if(CheckValue==0x08)

Line=CheckValue;

Key1=0x0F;

返回Key1;

c 未用 GetKey2(void) 签名

{

P1=0xF0;

CheckValue = P1^0xF0;

if(CheckValue==0x00 )

返回 0x00;

否则 if(CheckValue==0x10)

Row=CheckValue;

else if(CheckValue==0x20)

Row=CheckValue;

else if(CheckValue==0x40)

Row=CheckValue;

else if(Check Value==0x80)

Row=CheckValue;

delay1();

KeyTemp = P1^0xF0;

if(KeyTemp ==CheckValue)

返回 0x00;

Key2= 0xF0;

返回Key2;

void main()

{

无符号字符Key1,Key2;

InitialCPU( ) ;

InitialTimer0();

while(1)

{

Key1=GetKey1();

Key2=GetKey2();

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

{

Dispose();

P3=0x00;

}

}

热门资讯
伺服电机品牌盘点:国际实力派与国产精品推荐
深度解析中断类型概念及内涵
数字电路逻辑运算公式汇总攻略
redis集群清除缓存命令
CAN总线通信协议详解
伺服电机为什么叫伺服
如何查看微机的CPU时钟主频
半导体ETF投资指南:优选华交所与中证指数