计算器

#include
#include

#define uchar unsigned char
#define uint unsigned int
char code SST516[3] _at_ 0x003b;


uchar data dis_digit;
uchar code dis_code[17]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1,0xFF};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表
uchar data dis_buf[8];// 显示缓冲区
uchar data dis_index,key,i,j,flag;


uchar data numbefore,numafter;
unsigned int data answer;
uchar data contfg, numfg,flag;

//--------------------------------------------------
/* 延时子程序*/

void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}

//--------------------------------------------------
/*键扫描子程序*/
void keyscan(void)
{
uchar temp;

P1=0x0F; //低四位输入
delay(1);
temp=P1; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
key=3;
else
key=16;

P1=0xF0; //高四位输入
delay(1);
temp=P1; //读P1口
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1)
key=key+0;
else if(temp==2)
key=key+4;
else if(temp==4)
key=key+8;
else if(temp==8)
key=key+12;
else
key=16;
}
//--------------------------------------------------

/*判断键是否按下*/
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0)
{
keyscan();
while(P1!=0xF0); //等待键释放
if(key<16)
{
if(key<10)
{
numbefore=key;
dis_buf[0]=dis_code[numbefore];

}else if(key==12)
{
answer=numbefore ;

}else if (key==15)
{

answer += numbefore;
dis_buf[0]= dis_code[answer];
answer=0;

}



// dis_buf[1]= dis_code[key/10];
// dis_buf[0]= dis_code[key%10];
// dis_buf[i]= dis_code[key] ;
// i++;
// if(i==8) i=0;
}
}
}

void main()
{
P0 = 0xff;
P2 = 0xff;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x17;
IE = 0x82;

dis_buf[0] = dis_code[16];
dis_buf[1] = dis_code[16];
dis_buf[2] = dis_code[16];
dis_buf[3] = dis_code[16];
dis_buf[4] = dis_code[16];
dis_buf[5] = dis_code[16];
dis_buf[6] = dis_code[16];
dis_buf[7] = dis_code[16];

dis_digit = 0xfe;
dis_index = 0;
TR0 = 1;
key=11;
while(1)
{
keydown();
}
}

void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码管
// dis_buf --- 显于缓冲区基地址
{
TH0 = 0xFC;
TL0 = 0x17;
P2 = 0xff; // 先关闭所有数码管
P0 = dis_buf[dis_inde

x]; // 显示代码传送到P0口
P2 = dis_digit; //
dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++; //
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}


相关文档
最新文档