單片機(jī)設(shè)計(jì)的帶余數(shù)的簡易計(jì)算器
原理圖:
本文引用地址:http://www.ex-cimer.com/article/201609/310574.htm
程序設(shè)計(jì):
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^6; //蜂鳴器驅(qū)動(dòng)線
unsigned char code disp_code[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//數(shù)碼管顯示
uchar key; //鍵盤值
uchar num; //掃描位數(shù)
int temp1=0; //結(jié)果整數(shù)部分
uint temp2=0; //結(jié)果余數(shù)部分
int m=0; //
uchar ss[8]; //
uchar flag; //運(yùn)算標(biāo)志位
bit c_flag=0; //輔助標(biāo)志位
unsigned char code key_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 }; //鍵盤編碼
unsigned char code num_code[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //顯示位數(shù)
/**********************************************************
延時(shí)子函數(shù)
**********************************************************/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t = 0; t < 120; t++);
}
}
/**********************************************************
x*0.14MS 延時(shí)子函數(shù)
**********************************************************/
void delay0(uchar x)
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++);
}
}
/**********************************************************
蜂鳴器驅(qū)動(dòng)子函數(shù)
**********************************************************/
void beep()
{
uchar i;
for (i=0;i<180;i++)
{
delay0(5);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關(guān)閉蜂鳴器
delayms(250); //延時(shí)
}
/**********************************************************
鍵盤掃描子函數(shù)
**********************************************************/
uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0) //判鍵是否按下
{
delayms(10); //延時(shí)30ms
scan1=P1;
if((scan1&0xf0)!=0xf0) //二次判鍵是否按下
{
P1=0x0f;
scan2=P1;
keycode=scan1|scan2; //組合成鍵編碼
for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得鍵值
{
key=j;
return(key);
}
}
}
}
else P1=0xff;
return (16);
}
/*****************************************************
顯示數(shù)據(jù)子程序
********************************************************/
void display(int xx,uint yy)
{ uchar tt=0;
uint x1;
uint y1=yy;
while(yy!=0) //顯示余數(shù)
{ss[tt]=yy%10;
yy=yy/10;
tt++ ;
num=tt;
}
if(y1!=0) //顯示——
{ss[tt]=16;
tt++;
ss[tt]=16;
tt++;
}
x1=abs(xx); //顯示整數(shù)
while(x1!=0)
{ss[tt]=x1%10;
x1=x1/10;
tt++ ;
num=tt;
}
if(xx<0) //顯示符號(hào)
{ ss[tt]=16;
tt++;
num=tt;}
for(tt=0;tt
{
P0=disp_code[ss[tt]];
delayms(5);
if(P2==num_code[num-1])
P2= 0x7f;
else P2=_cror_(P2,1);
}
}
/**********************************************************
判鍵是否按下子函數(shù)
**********************************************************/
void keydown()
{
uchar tt=0;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
keyscan();
beep();
if(key>9&&c_flag==0)
{switch(key)
{case 10:flag=1;temp1=m;c_flag=1;m=0;break;
case 11:flag=2;temp1=m;c_flag=1;m=0;break;
case 12:flag=3;temp1=m;c_flag=1;m=0;break;
case 13:flag=4;temp1=m;c_flag=1;m=0;break;
case 14:m=-m;break;
case 15:break;
}
}
if(key==14&&c_flag==1)
m=-m;
if(key<=9)
{if(m>=0) m=m*10+key;
if(m<0) m=m*10-key; }
if(key<=9&&flag==5)
{
flag=0;
c_flag=0;
temp1=temp2=0;
}
}
if(key==15)
{switch(flag)
{case 1:temp1=temp1+m;break;
case 2:temp1=temp1-m;break;
case 3:temp1=temp1*m;break;
case 4:temp2=abs(temp1)%m;temp1=temp1/m;break;
default:;
}
flag=5;
m=0;
}
}
void main()
{
P0 = 0xc0;
P2 = 0x7f; //數(shù)碼管顯示"0"
P1 = 0xff;
while(1)
{
keydown();
if(flag==5)
display(temp1,temp2);
else display(m,0);
}
}
實(shí)物照片:
評(píng)論