for(j=0;j<1000;j++);
}void clrdat()
{LED1=0;
LED2=0;
LED3=0;
LED4=0;
LED5=0;
LED6=0;
}void dealdat()
{switch(calflag)
{case 0:
d_dat=s_dat1+s_dat2;
break;
case 1:
d_dat=s_dat1-s_dat2;
break;
case 2:
d_dat=s_dat1s_dat2;
break;
case 3:
d_dat=s_dat1/s_dat2;
break;
default:break;
}LED1=(d_dat/100000)%10;
LED2=(d_dat/10000)%10;
LED3=(d_dat/1000)%10;
LED4=(d_dat/100)%10;
LED5=(d_dat/10)%10;
LED6=d_dat%10;
}uchar kbscan(void)
{unsigned char sccode,recode;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f) //有键按下
{delay(20); //延时去抖动
if ((P3&0x0f)!= 0x0f)
{sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{P3=sccode;
if((P3&0x0f)!=0x0f)
{recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}else
sccode=(sccode<<1)|0x01;
}}
}return 0; //无键按下,返回0
}void getkey(void)
{unsigned char key;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}}
void t0isr() interrupt 1
{TH0=0xf4;
TL0=0x48;
switch(number)
{case 0:P2=0x01;P0=distab[LED1];break;
case 1:P2=0x02;P0=distab[LED2];break;
case 2:P2=0x04;P0=distab[LED3];break;
case 3:P2=0x08;P0=distab[LED4];break;
case 4:P2=0x10;P0=distab[LED5];break;
case 5:P2=0x20;P0=distab[LED6];break;
default:break;
}number++;
if(number>5)number=0;
}main()
{TMOD = 0x01;
number = 0;
TH0=0xf4;
TL0=0x48;
TR0=1;
ET0=1;
EA=1;
LED1=0;
LED2=0;
LED3=0;
LED4=0;
while(1)
{getkey();
switch(keyval)
{case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
LED1=LED2;
LED2=LED3;
LED3=LED4;
LED4=LED5;
LED5=LED6;
LED6=keyval;
break;
case 10:
clrdat();
break; //"ON"
case 11: //"="
s_dat2=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;
dealdat();
break;
case 12: //"/"
calflag=3;
s_dat1=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;
clrdat();
break;
case 13: //""
calflag=2;
s_dat1=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;
clrdat();
break;
case 14: //"-"
calflag=1;
s_dat1=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;
clrdat();
break;
case 15: //"+"
calflag=0;
s_dat1=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;
clrdat();
break;
default:break;
}}
}
单片机设计计算器
下面是我以前写的一个简单的计算器的程序,你可以参考参考
#include
#define uchar unsigned char
#define uint unsigned int
it E=P2^7; //1602使能引脚
it RW=P2^6; //1602读写引脚
it 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=shu1shu2;
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);
}}
}}
一、设计题目 基于单片机的简易计算器设计 二、设计任务 1、用单片机设计一简易计算器。 2、采用44键盘,
1. 4X4键盘输入,点阵字符型液晶显示。
2. 由于所采用的浮点程序库的限制(MCU平台只找到这个……),浮点运算采用3字节二进制补码表示,有效数字6位。对于输入输出,采用3字节BCD码浮点数格式,有效数字只有4位,因此终有效数字只有4位。
3. 可进行连续输入,例如:1.23+4.568.23/234.8 ,但是运算结果为从左到右,这也是8位简易计算器的方式。
4. 可进行错误判断,溢出、除零等错误将显示一个字符 E 。
5. 由于键盘只有16个按键,安排如下:
+---------------+
| 7 | 8 | 9 | + |
| 4 | 5 | 6 | - |
| 1 | 2 | 3 | |
| 0 | . | = | / |
+---------------+
6. 按键的缺少导致取消了一些特殊函数,即开根号,三角函数(sin, cos, tan, ctg)的实现,由于这些函数在浮点程序库中均已提供,如果硬件允许,在原来的框架上添加这些附加功能是很容易的(可以看作和+, -, , /等价的按键作,调用不同的子程序进行运算即可)
7. 按两次 = 等于清灵。因为按键实在太少,才采用了这个做法。
8. 相应举例:
按键 结果 说明
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123+= 123 按下等号而没有第二个作数,保留个作数
并认为此次运算结束(等号的功能)
123+321/111 4.0 等价于(123+321) / 111
2.3+5.4=/0.1+ 77 等号后直接按 / ,则将前面的运算结果作为个
作数
1/0= E 错误显示
要源码去这里:
51单片机课程设计要怎么写
次见有人这样问!!-
-自己学单片机都不知道该做什么啊,看样子复杂的你是没指望了,看看书,写个计算器、万年历、变压器啦什么的还可以
追问:
我不会啊
回答:
真干脆!你们老师也没说题目,就是让你自己想题目然后设计啊?要是那样,也不怪乎你会问这种问题
课程设计
的一般要求:
1、
设计任务书
:说明设计的内容,达到什么程度
2、硬件电路图:设计硬件
电路板
(若不要求做实物的话,可用protues仿真,但无论如何硬件电路一定要有)
3、
软件设计
:根据硬件电路开发,去实现要设计的目的。
4、
流程图
:绘制软件流程图(其实,应该是根据先流程图
再设计
程序的,不过一般具体流程图都是要根据软件细化,所以就放在了编程后便..)
5.
设计说明
书:总结是设计的过程
//-----------------------------
一般
单片机
设计的流程就是这样了,可以根据你们要求具体做哪些....
单片机简易计算器的设计要求用28矩阵键盘,程序如下,求大神把下面44键盘程序改成28的,可追加分数
下面这个 Keyscan(void) 程序,是我以前写的。
uchar Keyscan(void)
{uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循环四次
P2 = Buffer[j]; //在P1高四位分别输出一个低电平
temp = 0x01; //先判断P1.0位
for(i = 0; i < 4; i++) { //循环四次
if(!(P2 & temp)) //从P1低四位,截取1位
return (i + j 4); //返回取得的按键值
temp <<= 1; //判断的位,左移一位
} }
return 16; //判断结束,没有键按下,返回16
}程序,用了一个 8 位的并口:P1,或 P2,都行。
改成28的,就要使用两个接口了,用什么?楼主应该指定出来。
单片机简易计算器设计的程序
展开全部
首先会按键扫描,再会数码管或液晶屏显示,基本上可以了
程序
流程:
扫描按键(多5次,65536,简易计算器吗)获得一个数,再扫描按键获得加减乘除符号
扫描按键获得另一个数
扫描按键获得“=”,显示计算结果
由于程序比较长,且与硬件有关,因此只贴出主程序:
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))
//10-13代表加减乘除
4种符号
{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=
b110000+b21000+b3100+b410+b5;//5个按键数值合成一个数
dd=d110000+d11000+d3100+d410+d5;
//另外5个按键数值也合成一个数
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=bbdd;
break;//可能会溢出
case
13:ee=bb/dd;
//除法小数部分会丢失,保留2位
ff=bb%dd;
fd1=ff10/dd;
fd2=ff100/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/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=0;b2=0;b3=0;b4=0;b5=0;
d1=0;d2=0;d3=0;d4=0;d5=0;
bb=0;dd=0;ee=0;
init2();
}}