|
51單片機(jī)制作的簡易計算器
可實(shí)現(xiàn)4位數(shù)內(nèi)的加減乘除,可顯示負(fù)數(shù)。
操作要用到數(shù)碼管和矩陣鍵盤
用的是清祥的板子
#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0;
sbit key2=P3^1;
sbit d=P2^6;
sbit w=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char a,b,c;
void delayms(uint xms)//延時函數(shù)
{
uint j;
for(;xms>0;xms--)
for(j=125;j>0;j--);
}
int keyboard;
void fun(){//此函數(shù)用來檢測按鍵
P3=0xf0;//1111 0000
if(P3!=0xf0){
delayms(5);
if(P3!=0xf0)
{
switch(P3){
case 0xe0:keyboard=0;break;//1110 0000 //列檢測
case 0xd0:keyboard=1;break;//1101 0000
case 0xb0:keyboard=2;break;//1011 0000
case 0x70:keyboard=3;break;//0111 0000
}
P3=0x0f;//0000 1111
if(P3!=0x0f)
delayms(5);
if(P3!=0x0f){
switch(P3){
case 0x0e:keyboard=keyboard;break;//0000 1110 //行檢測
case 0x0d:keyboard=keyboard+4;break;//0000 1101
case 0x0b:keyboard=keyboard+8;break;//0000 1011
case 0x07:keyboard=keyboard+12;break;//0000 0111
}
}
while(P3!=0x0f);
}
}
P3=0xff;
if(P3!=0xff){
delayms(5);
if(P3!=0xff){
switch(P3){
case 0xfe:a='+';break;//1111 1110 //獨(dú)立按鍵檢測
case 0xfd:a='-';break;//1111 1101
case 0xfb:b='=';break;//1111 1011
case 0xf7:b='=';break;//1111 0111
}
}
}
}
void display(int numdis)
{
uchar qian,bai,shi,ge;
if(numdis>0)
{
qian=numdis/1000;
bai=numdis/100%10;
shi=numdis/10%10;
ge=numdis%10;
d=1;
P0=table[qian];
d=0;
P0=0xff;//位選打開前常規(guī)消抖
w=1;
P0=0xef;
w=0;
delayms(5);
d=1;
P0=table[bai];
d=0;
P0=0xff;//位選打開前常規(guī)消抖
w=1;
P0=0xdf;
w=0;
delayms(5);
d=1;
P0=table[shi];
d=0;
P0=0xff;//位選打開前常規(guī)消抖
w=1;
P0=0xbf;
w=0;
delayms(5);
d=1;
P0=table[ge];
d=0;
P0=0xff;//位選打開前常規(guī)消抖
w=1;
P0=0x7f;
w=0;
delayms(5);
}
else{
numdis=numdis*-1;
//qian=numdis/1000;
bai=numdis/100;
shi=numdis/10%10;
ge=numdis%10;
d=1;
P0=0x40;
d=0;
P0=0xff;//位選打開前常規(guī)消抖
w=1;
P0=0xef;
w=0;
delayms(5);
d=1;
P0=table[bai];
d=0;
P0=0xff;//位選打開前常規(guī)消抖
w=1;
P0=0xdf;
w=0;
delayms(5);
d=1;
P0=table[shi];
d=0;
P0=0xff;//位選打開前常規(guī)消抖
w=1;
P0=0xbf;
w=0;
delayms(5);
d=1;
P0=table[ge];
d=0;
P0=0xff;//位選打開前常規(guī)消抖
w=1;
P0=0x7f;
w=0;
delayms(5);
}
}
/*
void main(){
while(1){
fun();//檢測按鍵
display(keyboard);//檢測數(shù)碼
}
*/
void main(){
while(1){
int t,s;
for(;;){
fun();
if(keyboard!=0)break;//檢測按鍵
}
for(;;){//檢測數(shù)碼
display(keyboard);
P3=0xf0;
if(P3!=0xf0){
delayms(5);
if(P3!=0xf0){
if(P3!=0xfe||P3!=0xfd||P3!=0xfb||P3!=0xf7)//如果按下數(shù)碼鍵
{
t=10*keyboard;
keyboard=0;
fun();
keyboard=t+keyboard;break;
}
}
}
P3=0xff;
if(P3==0xfe){//如果按下+號s2
s=keyboard;
keyboard=0;
display(keyboard);//顯示000
while(P3!=0xfe);//等到+號松開
fun();//重新檢測按鍵
for(;;){
display(keyboard);//顯示第二次按下的第一個鍵
P3=0xf0;
if(P3!=0xf0){
delayms(5);
if(P3!=0xf0){
if(P3!=0xfe||P3!=0xfd||P3!=0xfb||P3!=0xf7)
{
t=10*keyboard;
keyboard=0;
fun();
keyboard=t+keyboard;
}
}
}
P3=0xff;
if(P3!=0xff){//判斷=號
delayms(5);
if(P3!=0xff){
if(P3==0xf7||P3==0xfb)//s4到s5均為等號
{
keyboard=s+keyboard;
while(P3!=0xff);
}
}
}
}
}
if(P3==0xfd){//如果按下-號s3
s=keyboard;
keyboard=0;
display(keyboard);//顯示000
while(P3!=0xfd);//等到-號松開
fun();//重新檢測按鍵
for(;;){
display(keyboard);//顯示第二次按下的第一個鍵
P3=0xf0;
if(P3!=0xf0){
delayms(5);
if(P3!=0xf0){
if(P3!=0xfe||P3!=0xfd||P3!=0xfb||P3!=0xf7)
{
t=10*keyboard;
keyboard=0;
fun();
keyboard=t+keyboard;
}
}
}
P3=0xff;
if(P3!=0xff){//判斷=號
delayms(5);
if(P3!=0xff){
if(P3==0xf7||P3==0xfb)//s2到s5均為等號
{
keyboard=s-keyboard;
while(P3!=0xff);
}
}
}
}
}
if(P3==0xfb){//如果按下* /號s4
s=keyboard;
keyboard=0;
display(keyboard);//顯示000
while(P3!=0xfb);//等到* /號松開
fun();//重新檢測按鍵
for(;;){
display(keyboard);//顯示第二次按下的第一個鍵
P3=0xf0;
if(P3!=0xf0){
delayms(5);
if(P3!=0xf0){
if(P3!=0xfe||P3!=0xfd||P3!=0xfb||P3!=0xf7)
{
t=10*keyboard;
keyboard=0;
fun();
keyboard=t+keyboard;
}
}
}
P3=0xff;
if(P3!=0xff){//判斷=號
delayms(5);
if(P3!=0xff){
if(P3==0xfb){//如果按下的是原按鍵s4為*,如果按下的是靠右旁邊按鍵s5為/
keyboard=s*keyboard;
while(P3!=0xff);
}
if(P3==0xf7){
keyboard=s/keyboard;
while(P3!=0xff);
}
}
}
}
}
}
}
}
|
|