單片機課程設計計算器
『壹』 廣工單片機課程設計----計算器 明天上午9點前要。求救! Q2625882033
你是3,4班的~~
『貳』 單片機設計計算器
下面是我以前寫的一個簡單的計算器的程序,你可以參考參考
#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);
}
}
}
}
『叄』 課程設計:用51單片機設計一個簡易計算器
『哦啦啦啊呀呀有個子系統好嗎啉了解我在不在』
『肆』 單片機計算器課程設計
poteus模擬軟體上自帶有一個計算器程序,可以模擬的,你可以把那個程序看懂了,再自己寫一個。
『伍』 怎麼用51單片機做簡易計算器
你好!
單片機做計算器的設計,本身就是難點;
你是用模擬還是要做實物呢?
最多計算位數需要幾位?
『陸』 51單片機做簡易計算器
這樣的一個計算器相信應該在一兩天時間都可以做好,這最好自己去做,不是很復雜的系統
『柒』 我要單片機課程設計報告,關於做計算器的
報告已發送到郵箱中,請注意查收,有其他需要再聯系
『捌』 怎麼用51單片機做液晶顯示屏計算器,進行兩位簡單的計算
^#defineLCD1602_FLAG
#defineLCD1602_PORTP0
#include<reg51.h>
#include<stddef.h>
#defineucharunsignedchar
sbitlcd1602_rs=P2^0;
sbitlcd1602_e=P2^2;
sbitlcd1602_rw=P2^1;
sbitlcd1602_busy=P0^7;
ucharstr[]="SimpleCalculator";
ucharkeyval,keystr[16];
voiddelay(uchara)
{
uchari;
while(a--)for(i=0;i<120;i++);
}
/*
************************************
*函數名稱:lcd1602_CheckBusy()
*函數功能:狀態查詢
************************************
*/
voidlcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
*函數名稱:lcd1602_WriteCmd()
*函數功能:寫命令
*入口參數:命令字
*出口參數:無
***************************************
*/
voidlcd1602_WriteCmd(constucharcmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
*函數名稱:lcd1602_WriteData()
*函數功能:寫數據
*入口參數:c--待寫數據
*出口參數:無
*********************************************
*/
voidlcd1602_WriteData(constucharc)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
*函數名稱:lcd1602_Init()
*函數功能:初始化LCD
*入口參數:無
*出口參數:無
***********************************************
*/
voidlcd1602_Init()
{
lcd1602_WriteCmd(0x38); //顯示模式為8位2行5*7點陣
lcd1602_WriteCmd(0x0c);//displayenable,flagenable,flashenable,
lcd1602_WriteCmd(0x06);//flagmovetoright,screendon'tmove
lcd1602_WriteCmd(0x01);//clearscreen
}
/*
************************************************
*函數名稱:lcd1602_Display()
*函數功能:字元顯示
*入口參數:ptr--字元或字元串指針
*出口參數:無
*說明:用戶可通過以下方式來調用:
*1)lcd1602_Display("Hello,world!");
*2)INT8U存儲類型txt[]="要顯示的字元串";
*或者INT8U存儲類型txt[]={'t','x','t',..,'