?? shumaguan4.c
字號:
/**********************************************************************
**文件名:shumaguan4.c **
**功能:實現鍵盤(或串口輸入)、數碼管顯示,實現計算器功能 **
**創建人:xingyuegu **
**創建日期:2006-9-10 **
**版本:1.0 **
**修改日期:2006-10-17 **
**版本:2.0 **
**修改日期:2006-10-20 **
**版本:3.0 **
**修改日期:2006-10-27 **
**版本:4.0 **
**********************************************************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
/**********************************************************************
** 函數申明 **
**********************************************************************/
void delay(unsigned int);
void display(int );
unsigned char key_scan(void);
unsigned char transition(unsigned char);
void time_set();
void time0_int();
bit isdigit(unsigned char );
unsigned int process(unsigned char );
void init(void);
void Int_UART(void);
/**********************************************************************
** 變量定義 **
**********************************************************************/
unsigned int result=0;
unsigned int currentvalue=0,lastvalue;
unsigned char lastop;
volatile bit flag=0;
unsigned char keyvalue;
uchar *TX232,*RX232;
int code num_tab1[4]=
{0x88,0x84,0x82,0x81}
;
int code num_tab2[11]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}
;
unsigned char code keypadvalue[][4]={
{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'o','0','=','+'}
};
/**********************************************************************
**函數功能:主函數 **
**參數:無 **
**返回:無 **
**********************************************************************/
void main()
{
uchar *str="Please collect operation mode :1 (pc) ,2 (not for pc)\n";
init();
Int_UART();
TX232=str;
SBUF=*TX232;
while(1)
{
if(keyvalue=='1')
{
while(1)
{
if(flag)
{
keyvalue=key_scan();
init();
flag=0;
//if(keyvalue!=0)
result=process(keyvalue);
}
if(result<=9999)
{
display(result);
}
else
{
display(0);
}
}
}
else if(keyvalue=='2')
{
keyvalue=0;
while(1)
{
if(flag)
{
init();
flag=0;
//if(keyvalue!=0)
result=process(keyvalue);
}
if(result<=9999)
{
display(result);
}
else
{
display(0);
}
}
}
}
}
/**********************************************************************
**函數功能:初始化函數(包括中斷初始化) **
**參數:無 **
**返回:無 **
**********************************************************************/
void init(void)
{
EA=1;
EX0=1;
IT0=1;
P1=0xf0;
}
/**********************************************************************
**函數功能:初始化串口函數(包括波特率設置) **
**參數:無 **
**返回:無 **
**********************************************************************/
void Int_UART(void)
//功能: 串口初始化
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFA ; //Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
}
/**********************************************************************
**函數功能:中斷服務子程序 **
**參數:無 **
**返回:無 **
**********************************************************************/
void int0_isr(void) interrupt 0 using 1
{
if(!flag)
{
EX0=0;
flag=1;
}
}
/**********************************************************************
**函數功能:鍵值處理函數(處理+.-.*./.=) **
**參數:字符型 **
**返回:整型 **
**********************************************************************/
unsigned int process(unsigned char kvalue)
{
if(isdigit(kvalue))//&&!flag) //如果是數字,求值
{
currentvalue=transition(kvalue)+currentvalue*10;
result=currentvalue;
}
else //如果是功能鍵
if(kvalue=='o') //如果是ON/C,清0
{
result=0;
currentvalue=0;
lastvalue=0;
}
else if(kvalue=='+') //如果是“+”
{
lastop=kvalue; //lastop保存操作碼
lastvalue=result;//當前值成為上次值
currentvalue=0; //當前值清0
}
else if(kvalue=='-')
{
lastop=kvalue;
lastvalue=result;
currentvalue=0;
}
else if(kvalue=='*')
{
lastop=kvalue;
lastvalue=result;
currentvalue=0;
}
else if(kvalue=='/')
{
lastop=kvalue;
lastvalue=result;
currentvalue=0;
}
else if(kvalue=='=') //如果是“=”
{
switch(lastop) //判斷操作碼是什么
{
case '+':
{
result=currentvalue+lastvalue;
lastvalue=result;
break;
}
case '-':
{
result=lastvalue-currentvalue;
lastvalue=result;
break;
}
case '*':
{
result=currentvalue*lastvalue;
lastvalue=result;
break;
}
case '/':
{
result=lastvalue/currentvalue;
lastvalue=result;
break;
}
}
}
if(result>9999)
{
result=0;
currentvalue=0;
}
return result;
}
/**********************************************************************
**函數功能:判斷按鍵的鍵值是功能鍵還是數字鍵 **
**參數:整型數 **
**返回:BOOL型 **
**********************************************************************/
bit isdigit(unsigned char kvalue)
{
if(kvalue>='0'&&kvalue<='9')
return 1;
else
return 0;
}
/**********************************************************************
**函數功能:把數字的ASCII轉換成整型 **
**參數:整型數 **
**返回:整型 **
**********************************************************************/
unsigned char transition(unsigned char kvalue)
{
if(kvalue>='0'&&kvalue<='9')
return (kvalue-'0');
else
return 0;
}
/**********************************************************************
**函數功能:鍵盤掃描功能 **
**參數:無 **
**返回:返回鍵值 **
**********************************************************************/
unsigned char key_scan(void)
{
unsigned char line,row,temp,a,b,kvalue1;
temp=0xfe;
//flag=0;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
delay(10);
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
delay(10);
for(line=0;line<4;line++) //進行行掃描
{
a=temp<<line;
b=temp>>(8-line);
P1=a|b;
P1=P1&0x0f;
P1=P1|0xf0;
kvalue1=P1&0xf0;
if(kvalue1!=0xf0)
break;
}
P1=P1&0x0f;
P1=P1|0xf0;
P1=0xf0;
while((P1&0xf0)!=0xf0) //判斷鍵彈起
{
}
if(kvalue1==0xe0) //確定是第幾列
row=0;
else if(kvalue1==0xd0)
row=1;
else if(kvalue1==0xb0)
row=2;
else if(kvalue1==0x70)
row=3;
else
return 0;
P1=0xf0;
return keypadvalue[line][row];
}
}
P1=0xf0;
return 0;
}
/**********************************************************************
**函數功能:在數碼管上顯示數據 **
**參數:整型數 **
**返回:無 **
**********************************************************************/
void display(int disnum)
{
int ge,shi,bai,qian,i,j;
int num[5]={0,0,0,0,10};
if(disnum<=9999)
{
ge=disnum%10;
shi=(disnum%100)/10;
bai=(disnum/100)%10;
qian=disnum/1000;
num[0]=ge;
num[1]=shi;
num[2]=bai;
num[3]=qian;
if(qian!=0)
{
for(i=0;i<4;i++)
{
P2=num_tab1[i]; //先送位碼
P0=num_tab2[num[i]]; //再送段碼
delay(1);
}
}
else
{
if(bai!=0)
{
for(i=0;i<3;i++)
{
P2=num_tab1[i];
P0=num_tab2[num[i]];
delay(1);
}
}
else
{
if(shi!=0)
{
for(i=0;i<2;i++)
{
P2=num_tab1[i];
P0=num_tab2[num[i]];
delay(1);
}
}
else
{
for(i=0;i<1;i++)
{
for(j=0;j<4;j++)
{
if(j==0)
{
P2=num_tab1[j];
P0=num_tab2[num[i]];
delay(1);
}
else
{
P2=num_tab1[j];
P0=num_tab2[num[4]];
delay(1);
}
}
}
}
}
}
}
else
;
}
/**********************************************************************
**函數功能:延時時間 **
**參數:整型數 **
**返回:無 **
**********************************************************************/
void delay(unsigned int time)
{
int i;
int k;
for(i=0;i<time;i++)
for(k=0;k<100;k++);
}
/**********************************************************************
**函數功能:串口接收中斷中斷函數,接收數據 **
**參數:無 **
**返回:無 **
**********************************************************************/
void Int_Rx(void) interrupt 4 using 2
{
if(RI)
{
RI=0;
flag=1;
keyvalue=SBUF;
}
if(TI)
{
TI=0;
if(*TX232!='\0')
{
TX232++;
SBUF=*TX232;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -