📄 main.c
字号:
#include <reg51.h>
typedef unsigned char BYTE;
BYTE DBUF[5];
BYTE TEMP[5];
BYTE YJ; //结果存放
BYTE YJ1; //中间结果存放
BYTE GONG; //功能键存放
BYTE get_key; //GETKEY()函数是否成功返回
sbit DIN=P3^0;
sbit CLK=P3^1;
BYTE code SEGTAB[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
0x7D,0x07,0x7F,0x6F,0x77,0x7C,
0x39,0x5E,0x79,0x71,0x00,0x40};
BYTE code KEYTABLE[]={0x0DE,0x0ED,0x0DD,0x0BD,
0x0EB,0x0DB,0x0BB,0x0E7,
0x0D7,0x0B7,0x07E,0x07D,
0x07B,0x077,0x0BE,0x0EE};
enum keymode {num_key,fun_key,clear_key}key_mode;
/* 通过 */
void DELAY(BYTE i)
{
BYTE j=80;
do
{
do
{}while(--j);
}while(--i);
}
BYTE GETKEY()
{
BYTE temp;
BYTE temp2;
BYTE r1;
BYTE offset;
get_key=0;
DELAY(10);
P1=0x0F;
temp=P1;
if(temp==0x0F)
return 0;
else
{
temp2=temp;
P1=0xEF;
if(P1==0xEF)
{
P1=0xDF;
if(P1==0xDF)
{
P1=0xBF;
if(P1==0xBF)
{
P1=0x7F;
if(P1==0x7F)
{
return 0;
}
}
}
}
// K13
//检查ACC
temp2=ACC&0xF0|temp2;
r1=16;
offset=0;
do
{
if(temp2==KEYTABLE[offset])
{
P1=0x0F;
while(P1!=0x0F);
DELAY(10);
get_key=1;
return offset;
}
offset++;
}while(--r1);
}
}
/* 通过 */
BYTE TESTKEY()
{
P1=0x0F;
return ( (~P1)&0x0F );
}
/* 通过 */
void DISP()
{
BYTE data *point_1=DBUF;
BYTE data *point_2=TEMP+4;
BYTE num=5;
BYTE num2;
do
{
*point_2=SEGTAB[*point_1];
point_1++;
point_2--;
}while(--num);
point_1=TEMP;
num=5;
do
{
num2=8;
//检查ACC
ACC=*point_1;
do
{
#pragma asm
RLC A
#pragma endasm
DIN=CY;
CLK=0;
CLK=1;
}while(--num2);
point_1++;
}while(--num);
}
main()
{
BYTE num=0;
BYTE key;
BYTE _R0;
BYTE input;
BYTE temp;
GONG=0;
DBUF[0]=0x10;
DBUF[1]=0x10;
DBUF[2]=0x10;
DBUF[3]=0x10;
DBUF[4]=0x10;
while(1)
{
DISP();
while(!TESTKEY());
key=GETKEY();
if(!get_key)
continue;
num++;
switch(key)
{
case 0: key_mode=num_key; break;
case 1: key_mode=num_key; break;
case 2: key_mode=num_key; break;
case 3: key_mode=num_key; break;
case 4: key_mode=num_key; break;
case 5: key_mode=num_key; break;
case 6: key_mode=num_key; break;
case 7: key_mode=num_key; break;
case 8: key_mode=num_key; break;
case 9: key_mode=num_key; break;
case 10: key_mode=fun_key; break;
case 11: key_mode=fun_key; break;
case 12: key_mode=fun_key; break;
case 13: key_mode=fun_key; break;
case 14: key_mode=fun_key; break;
default: key_mode=clear_key;
}
if(key_mode==num_key)
{
if(num==1)
{
input=key;
DBUF[4]=key;
DBUF[3]=0x10;
DBUF[2]=0x10;
continue;
}
else if(num==2)
{
input=input*10+key;
DBUF[2]=0x10;
DBUF[3]=DBUF[4];
DBUF[4]=key;
continue;
}
else if(num==3)
{
OV=0;
ACC=input*10;
if(OV) goto E3;
ACC+=key;
if(CY) goto E3;
input=ACC;
DBUF[2]=DBUF[3];
DBUF[3]=DBUF[4];
DBUF[4]=key;
continue;
}
else
{
goto E3;
}
}
else if(key_mode==fun_key)
{
DBUF[4]=0x10;
DBUF[3]=0x10;
DBUF[2]=0x10;
_R0=GONG;
GONG=key;
/* + */
if(_R0==10)
{
YJ=YJ+input;
if(CY) goto E3;
num=0;
}
/* - */
else if(_R0==11)
{
YJ=YJ-input;
if(CY) goto E3;
num=0;
}
/* * */
else if(_R0==12)
{
YJ=YJ*input;
if(OV) goto E3;
}
/* / */
else if(_R0==13)
{
YJ=YJ/input;
num=0;
}
/* FIRST */
else if(_R0==0)
{
YJ=input;
num=0;
}
/* DEN */
else
{
num=0;
}
}
/* 清除 */
else
{
E3: num=0;
input=0;
YJ=0;
GONG=0;
DBUF[0]=0x10;
DBUF[1]=0x10;
DBUF[2]=0x10;
DBUF[3]=0x10;
DBUF[4]=0x10;
continue;
}
//DISP1:
YJ1=YJ/10;
DBUF[4]=YJ%10;
if(YJ1==0)
continue;
else
{
temp=YJ1;
YJ1=YJ1/10;
DBUF[3]=temp%10;
if(YJ1==0) continue;
else DBUF[2]=YJ1;
}
}//end while
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -