單片機計算器課程設計
『壹』 單片機設計計算器
下面是我以前寫的一個簡單的計算器的程序,你可以參考參考
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7; //1602使能引腳
sbit RW=P2^6; //1602讀寫引腳
sbit RS=P2^5; //1602數據/命令選擇引腳
uchar temp,num,k,m,flag,flag1,tt,a;
uint table[10];
uint val[8];
uint shu,shu1,shu2;
void init();
void delay(uint z);
void write_com(uchar com);
void write_date(uchar date);
uchar keyscan();
void input();
void output();
void main()
{
init();
while(1)
{
input();
output();
}
}
void delay(uint z)
{
int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
write_com(0x01);
}
void write_com(uchar com)
{
P0=com;
RS=0;
RW=0;
E=0;
delay(5);
E=1;
delay(5);
}
void write_date(uchar date)
{
P0=date;
RS=1;
RW=0;
E=0;
delay(5);
E=1;
delay(5);
}
uchar keyscan()
{
P1=0xfe;//對矩陣鍵盤的第一行全賦0,掃描第一行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)//消抖
{
delay(10);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;//將P1的值讀入temp中,否則temp的值始終為0xf0
//因為當程序運行到鬆手檢測循環時,要退出鬆手
//檢測循環就必須是temp值為0xf0
switch(temp)
{
case 0xee:num=7;break;//break是跳出switch語句,
case 0xde:num=8;break;//而不是跳出while語句
case 0xbe:num=9;break;
case 0x7e:num=13;break;//num=13表示除號
}
while(temp!=0xf0) //鬆手檢測
{ //即當手鬆開時,也即無按鍵被按下
temp=P1; //則temp值就等於0xf0,
temp=temp&0xf0; //退出此循環
}
}
}
P1=0xfd;//對矩陣鍵盤的第二行全賦0,掃描第二行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=4;break;
case 0xdd:num=5;break;
case 0xbd:num=6;break;
case 0x7d:num=12;break;//num=12表示乘號
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;//對矩陣鍵盤的第三行全賦0,掃描第三行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=1;break;
case 0xdb:num=2;break;
case 0xbb:num=3;break;
case 0x7b:num=11;break;//num=11表示減號
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;//對矩陣鍵盤的第四行全賦0,掃描第四行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num=15;break;//num=15表示清零
case 0xd7:num=16;break;//num=16表示0
case 0xb7:num=14;break;//num=14表示等號
case 0x77:num=10;break;//num=10表示加號
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
return num;
}
void digit(uchar number)
{
write_com(0x80+a);
write_date(number+'0');
table[a]=tt;
delay(5);
tt=0;
num=0;
a++;
}
void input()
{
uint i,j;
tt=keyscan();
if(tt==15) //清零
{
write_com(0x01);
tt=0;
num=0;
a=0;
m=0;
flag1=0;
flag=0;
}
if(tt==1) digit(1);
if(tt==2) digit(2);
if(tt==3) digit(3);
if(tt==4) digit(4);
if(tt==5) digit(5);
if(tt==6) digit(6);
if(tt==7) digit(7);
if(tt==8) digit(8);
if(tt==9) digit(9);
if(tt==16)
{
write_com(0x80+a);
write_date(0+'0');
table[a]=0;
delay(5);
tt=0;
num=0;
a++;
}
if(tt==10)//檢測到加號
{
m=1;//表示加法
shu1=0;
j=1;
write_com(0x80+a);
write_date('+');
delay(5);
flag=a;
for(i=flag;i>0;i--)
{
shu1+=(table[i-1]*j);
j*=10;
}
tt=0;
num=0;
a++;
}
if(tt==11)//檢測到減號
{
m=2;//表示減法
shu1=0;
j=1;
write_com(0x80+a);
write_date('-');
delay(5);
flag=a;
for(i=flag;i>0;i--)
{
shu1+=(table[i-1]*j);
j*=10;
}
tt=0;
num=0;
a++;
}
if(tt==12)//檢測到乘號
{
m=3;//表示乘法
shu1=0;
j=1;
write_com(0x80+a);
write_date('*');
delay(5);
flag=a;
for(i=flag;i>0;i--)
{
shu1+=(table[i-1]*j);
j*=10;
}
tt=0;
num=0;
a++;
}
if(tt==13)//檢測到除號
{
m=4;//表示除法
shu1=0;
j=1;
write_com(0x80+a);
write_date('/');
delay(5);
flag=a;
for(i=flag;i>0;i--)
{
shu1+=(table[i-1]*j);
j*=10;
}
tt=0;
num=0;
a++;
}
if(tt==14) //檢測到等號
{
flag1=1;
write_com(0x80+a);
write_date('=');
shu2=0;
j=1;
for(i=a-1;i>flag;i--)
{
shu2+=(table[i]*j);
j*=10;
}
num=0;
tt=0;
}
}
void output()
{
uint value;
uchar n;
if((m==1)&&(flag1==1))//加的時候
{
value=shu1+shu2;
if(value>=0&&value<10)
{
val[0]=value;
write_com(0xc0);
for(n=0;n<1;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10&&value<100)
{
val[0]=value/10;
val[1]=value%10;
write_com(0xc0);
for(n=0;n<2;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=100&&value<1000)
{
val[0]=value/100;
val[1]=value%100/10;
val[2]=value%10;
write_com(0xc0);
for(n=0;n<3;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=1000&&value<10000)
{
val[0]=value/1000;
val[1]=value%1000/100;
val[2]=value%1000%100/10;
val[3]=value%10;
write_com(0xc0);
for(n=0;n<4;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10000&&value<100000)
{
val[0]=value/10000;
val[1]=value%10000/1000;
val[2]=value%10000%1000/100;
val[3]=value%10000%1000%100/10;
val[4]=value%10;
write_com(0xc0);
for(n=0;n<5;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
}
if((m==2)&&(flag1==1))//減的時候
{
value=shu1-shu2;
if(value>=0&&value<10)
{
val[0]=value;
write_com(0xc0);
for(n=0;n<1;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10&&value<100)
{
val[0]=value/10;
val[1]=value%10;
write_com(0xc0);
for(n=0;n<2;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=100&&value<1000)
{
val[0]=value/100;
val[1]=value%100/10;
val[2]=value%10;
write_com(0xc0);
for(n=0;n<3;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=1000&&value<10000)
{
val[0]=value/1000;
val[1]=value%1000/100;
val[2]=value%1000%100/10;
val[3]=value%10;
write_com(0xc0);
for(n=0;n<4;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10000&&value<100000)
{
val[0]=value/10000;
val[1]=value%10000/1000;
val[2]=value%10000%1000/100;
val[3]=value%10000%1000%100/10;
val[4]=value%10;
write_com(0xc0);
for(n=0;n<5;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
}
if((m==3)&&(flag1==1))//乘的時候
{
value=shu1*shu2;
if(value>=0&&value<10)
{
val[0]=value;
write_com(0xc0);
for(n=0;n<1;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10&&value<100)
{
val[0]=value/10;
val[1]=value%10;
write_com(0xc0);
for(n=0;n<2;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=100&&value<1000)
{
val[0]=value/100;
val[1]=value%100/10;
val[2]=value%10;
write_com(0xc0);
for(n=0;n<3;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=1000&&value<10000)
{
val[0]=value/1000;
val[1]=value%1000/100;
val[2]=value%1000%100/10;
val[3]=value%10;
write_com(0xc0);
for(n=0;n<4;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10000&&value<100000)
{
val[0]=value/10000;
val[1]=value%10000/1000;
val[2]=value%10000%1000/100;
val[3]=value%10000%1000%100/10;
val[4]=value%10;
write_com(0xc0);
for(n=0;n<5;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
}
if((m==4)&&(flag1==1))//除的時候
{
value=shu1/shu2;
if(value>=0&&value<10)
{
val[0]=value;
write_com(0xc0);
for(n=0;n<1;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10&&value<100)
{
val[0]=value/10;
val[1]=value%10;
write_com(0xc0);
for(n=0;n<2;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=100&&value<1000)
{
val[0]=value/100;
val[1]=value%100/10;
val[2]=value%10;
write_com(0xc0);
for(n=0;n<3;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=1000&&value<10000)
{
val[0]=value/1000;
val[1]=value%1000/100;
val[2]=value%1000%100/10;
val[3]=value%10;
write_com(0xc0);
for(n=0;n<4;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10000&&value<100000)
{
val[0]=value/10000;
val[1]=value%10000/1000;
val[2]=value%10000%1000/100;
val[3]=value%10000%1000%100/10;
val[4]=value%10;
write_com(0xc0);
for(n=0;n<5;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
}
}
『貳』 急求!用89C51單片機設計4*4矩陣式鍵盤計算器程序
^這是郭天祥老師寫的:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan();
void display(uchar aa);
void main()
{
num=17;
la=1;
P0=0;
la=0;
wela=1;
P0=0xc0;
wela=0;
while(1)
{
display(keyscan());
}
}
void display(uchar aa)
{
la=1;
P0=table[aa-1];
la=0;
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
『叄』 課程設計:用51單片機設計一個簡易計算器
『哦啦啦啊呀呀有個子系統好嗎啉了解我在不在』
『肆』 怎麼用51單片機做簡易計算器
你好!
單片機做計算器的設計,本身就是難點;
你是用模擬還是要做實物呢?
最多計算位數需要幾位?
『伍』 單片機計算器課程設計
poteus模擬軟體上自帶有一個計算器程序,可以模擬的,你可以把那個程序看懂了,再自己寫一個。
『陸』 51單片機做簡易計算器
這樣的一個計算器相信應該在一兩天時間都可以做好,這最好自己去做,不是很復雜的系統
『柒』 簡單單片機計算器程序
unsigned char code 這個是分配到Rom中的數據,一般是用來查表的。
unsigned char code XIANSHI[]用來做數碼管顯示的數據表,不帶小數點。
unsigned char code XIANSHIXIAOSHUDIAN[]也是用來顯示數據的,這個帶小數點。
Proteus里有自帶的計算器實例。
也比較復雜。
/*******************************************************************************
************ LABCENTER ELECTRONICS ************
************ Proteus VSM Sample Design Code ************
************ Integer Calculator ( 2K Code Limit) ************
*******************************************************************************/
#include <intrins.h>
#include <reg51.h>
#include "calc.h"
//Variables
static data LONG lvalue;
static data LONG rvalue;
static data CHAR currtoken;
static data CHAR lasttoken;
static data CHAR lastpress;
static xdata CHAR outputbuffer[MAX_DISPLAY_CHAR];
VOID main (VOID)
//Initialise our variables and call the
//Assembly routine to initialise the LCD display.
{ lvalue = 0;
rvalue = 0;
currtoken = '=';
lasttoken = '0';
initialise(); // Initialize the LCD
calc_output(OK);
calc_evaluate();
}
你可以打開proteus,再打開實例文件夾,再打開VSM for 8051,再打開C51 Calculator
求採納為滿意回答。
『捌』 基於單片機的多功能計算器
不會吧,這么有趣,我前幾天做的課程設計就是這個啊!
剛剛花了內一個星期做完了這個計算容器,硬體,程序,論文都已經完成了。
我裡面沒用到74LS244或74LS240、與非門等器件,就是用到了51單片機和數碼管來實現的
因為51裡面的IO口多,沒必要用這些東西,如果要用也可以,哈哈。
如果你急要,我發你吧!
『玖』 我要單片機課程設計報告,關於做計算器的
報告已發送到郵箱中,請注意查收,有其他需要再聯系
『拾』 求基於單片機的簡易計算器設計 以及開題報告
如果有給的 我也希望看看 我做的小數不能處理 只能處理20位以內的正數