#include<reg52.h>
unsigned char step = 0;
unsigned char oprt = 0;
signed long result = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
signed long num1 = 0;
signed long num2 = 0;
void ConfigTimer0(unsigned int ms);
extern void KeyDriver();
extern void keyscan();
extern void InitLCD1602();
extern void LCDShowstr(unsigned char x,unsigned char y,unsigned char*str);
extern void LCDareaclear(unsigned char x,unsigned char y,unsigned char len);
extern void LCDfullclear();
void main()
{
EA = 1;
InitLCD1602();
ConfigTimer0(1);
LCDShowstr(15,1,"0");
while(1)
{
KeyDriver();
}
}
void Reset()
{
num1 = 0;
num2 = 0;
step = 0;
LCDfullclear();
}
unsigned char LongTostr(unsigned char *str,signed long dat)
{
unsigned char len = 0;
unsigned char buf[12];
signed char i = 0;
if(dat<0)
{
dat = -dat;
*str++ = '-';
len++;
}
do
{
buf[i++] = dat%10;
dat/=10;
}while(dat>0);
len+=i;
while(i-->0)
{
*str++ = buf[i] + '0';
}
*str = '\0';
return len;
}
void ShowOprt(unsigned char y,unsigned char type)
{
switch(type)
{
case 0CDShowstr(0,y,"+");break;
case 1CDShowstr(0,y,"-");break;
case 2CDShowstr(0,y,"*");break;
case 3CDShowstr(0,y,"/");break;
default:break;
}
}
void NumKeyAction(unsigned char n)
{
unsigned char str[12];
unsigned char len;
if(step>1)
{
Reset();
}
if(step==0)
{
num1 = num1*10+n;
len = LongTostr(str,num1);
LCDShowstr(16-len,1,str);
}
else
{
num2 = num2*10+n;
len = LongTostr(str,num2);
LCDShowstr(16-len,1,str);
}
}
void OprtKeyAction(unsigned char type)
{
unsigned char str[12];
unsigned char len;
if(step==0)
{
len = LongTostr(str,num1);
LCDareaclear(0,0,16-len);
LCDShowstr(16-len,0,str);
ShowOprt(1,type);
LCDareaclear(1,1,14);
LCDShowstr(15,1,"0");
oprt = type;
step = 1;
}
}
void Getresult()
{
unsigned char len;
unsigned char str[12];
if(step==1)
{
step = 2;
switch(oprt)
{
case 0:result = num1+num2;break;
case 1:result = num1-num2;break;
case 2:result = num1*num2;break;
case 3:result = num1/num2;break;
default:break;
}
len = LongTostr(str,num2);
ShowOprt(0,oprt);
LCDareaclear(1,0,16-1-len);
LCDShowstr(16-len,0,str);
len = LongTostr(str,result);
LCDShowstr(0,1,"=");
LCDareaclear(1,1,16-1-len);
LCDShowstr(16-len,1,str);
}
}
void KeyAction(unsigned char keycode)
{
if((keycode>='0')&(keycode<='9'))
{
NumKeyAction(keycode - '0');
}
else if(keycode == 0x26)
{
OprtKeyAction(0);
}
else if(keycode == 0x28)
{
OprtKeyAction(1);
}
else if(keycode == 0x25)
{
OprtKeyAction(2);
}
else if(keycode == 0x27)
{
OprtKeyAction(3);
}
else if(keycode == 0x0D)
{
Getresult();
}
else if(keycode == 0x1B)
{
Reset();
LCDShowstr(15,1,"0");
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 11059200/12;
tmp = (tmp*ms)/1000;
tmp = 65536 - tmp;
tmp+=28;
T0RH=(unsigned char)(tmp>>8);
T0RL=(unsigned char)tmp;
TMOD&=0XF0;
TMOD|=0X01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
void InterruptTimer0() interrupt 1
{
TH0 = T0RH;
TL0 = T0RL;
keyscan();
}
#include<reg52.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;
void LCDwaitReady()
{
unsigned char sta;
LCD1602_DB = 0XFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do{
LCD1602_E = 1;
sta = LCD1602_DB;
LCD1602_E = 0;
}while(sta&0x80);
}
void LCDwriteCmd(unsigned char cmd)
{
LCDwaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
void LCDwriteDat(unsigned char dat)
{
LCDwaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB =dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
void LCDwritezhi(unsigned char x,unsigned char y)
{
unsigned char addr;
if(y == 0)
addr = 0x00+ x;
else
addr = 0x40+ x;
LCDwriteCmd(addr|0x80);
}
void LCDShowstr(unsigned char x,unsigned char y,unsigned char *str)
{
LCDwritezhi(x,y);
while(*str!= '\0')
{
LCDwriteDat(*str++);
}
}
void LCDareaclear(unsigned char x,unsigned char y,unsigned char len)
{
LCDwritezhi(x,y);
while(len--)
{
LCDwriteDat(' ');
}
}
void LCDfullclear()
{
LCDwriteCmd(0x01);
}
void InitLCD1602()
{
LCDwriteCmd(0x38);
LCDwriteCmd(0x0C);
LCDwriteCmd(0x06);
LCDwriteCmd(0x01);
}
#include<reg52.h>
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;
sbit KEY_OUT1 = P2^3;
sbit KEY_OUT2 = P2^2;
sbit KEY_OUT3 = P2^1;
sbit KEY_OUT4 = P2^0;
unsigned char code KeyCodeMap[4][4] ={
{'1','2','3',0x26},
{'4','5','6',0x25},
{'7','8','9',0x28},
{'0',0X1B,0x0D,0X27}
};
unsigned char pdata keysta[4][4] ={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
extern void KeyAction(unsigned char keycode);
void KeyDriver()
{
unsigned char i,j;
static unsigned char pdata backup[4][4] = {
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(keysta[i][j]!=backup[i][j])
{
if(backup[i][j]!=0)
{
KeyAction(KeyCodeMap[i][j]);
}
backup[i][j] = keysta[i][j];
}
}
}
}
void keyscan()
{
unsigned char i;
static unsigned char keyout = 0;
static unsigned char keybuf[4][4] ={
{0xFF,0XFF,0XFF,0XFF},{0XFF,0XFF,0XFF,0XFF},
{0XFF,0XFF,0XFF,0XFF},{0XFF,0XFF,0XFF,0XFF}
};
keybuf[keyout][0] = (keybuf[keyout][0]<<1)|KEY1;
keybuf[keyout][1] = (keybuf[keyout][1]<<1)|KEY2;
keybuf[keyout][2] = (keybuf[keyout][2]<<1)|KEY3;
keybuf[keyout][3] = (keybuf[keyout][3]<<1)|KEY4;
for(i=0;i<4;i++)
{
if((keybuf[keyout][i]&0xFF)==0XF0)
{
keysta[keyout][i] = 0;
}
else if((keybuf[keyout][i]&0xFF)==0XFF)
{
keysta[keyout][i] = 1;
}
}
keyout++;
keyout&=0x03;
switch(keyout)
{
case 0:KEY_OUT4 = 1;KEY_OUT1 = 0;break;
case 1:KEY_OUT1 = 1;KEY_OUT2 = 0;break;
case 2:KEY_OUT2 = 1;KEY_OUT3 = 0;break;
case 3:KEY_OUT3 = 1;KEY_OUT4 = 0;break;
default:break;
}
}
|