小计算器,看了好久,对指针还是有点生疏,好多地方反应不过来,不过还好多看几遍差不多能理解,感觉有必要再去看看c语言的课程。写程序的时候有好多错误,很消磨耐心,查了好多东西,加上问大佬才好不容易把它写出来。
程序:
LCD.c
#include<reg52.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P1^2;
void delay()
{
unsigned int i;
i=5;
while(--i);
}
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);
LCD1602_RS = 1;
LCD1602_RW = 1;
}
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}
void LcdSetCursor(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)
{
LcdSetCursor(x,y);
while(*str != '\0')
{
LcdWriteDat(*str++);
}
}
void LcdAreaClear(unsigned char x,unsigned char y,unsigned char len)
{
LcdSetCursor(x,y);
while(len--)
{
LcdWriteDat(' ');
}
}
void LcdFullClear()
{
LcdWriteCmd(0x01);
}
void InitLcd1602()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);
LcdWriteCmd(0x06);
LcdWriteCmd(0x01);
}
keyboard.c
#include<reg52.h>
sbit KEY_OUT_4 = P2^7;
sbit KEY_OUT_3 = P2^6;
sbit KEY_OUT_2 = P2^5;
sbit KEY_OUT_1 = P2^4;
sbit KEY_IN_1 = P2^0;
sbit KEY_IN_2 = P2^1;
sbit KEY_IN_3 = P2^2;
sbit KEY_IN_4 = P2^3;
unsigned char KeySta[4][4] = {
{1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}
};
unsigned char code KeyCodeMap[4][4] = {
{'1','2','3',0x26},{'4','5','6',0x25},{'7','8','9',0x28},{'0',0x1B,0x0D,0x27}
};
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(backup[i][j] != KeySta[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}
};
KEY_IN_2 = 1;
KEY_IN_3 = 1;
KEY_IN_4 = 1;
keybuf[keyout][0] = (keybuf[keyout][0] <<1) | KEY_IN_1;
keybuf[keyout][1] = (keybuf[keyout][1] <<1) | KEY_IN_2;
keybuf[keyout][2] = (keybuf[keyout][2] <<1) | KEY_IN_3;
keybuf[keyout][3] = (keybuf[keyout][3] <<1) | KEY_IN_4;
for(i = 0;i<4;i++)
{
if((keybuf[keyout][i] & 0x0F) == 0x00)
{
KeySta[keyout][i] = 0;
}
else if((keybuf[keyout][i] & 0x0F) == 0x0F)
{
KeySta[keyout][i] = 1;
}
}
keyout++;
keyout = keyout & 0x03;
switch(keyout)
{
case 0:KEY_OUT_4 = 0;KEY_OUT_3 = 1;KEY_OUT_2 = 1;KEY_OUT_1 = 1;break;
case 1:KEY_OUT_4 = 1;KEY_OUT_3 = 0;KEY_OUT_2 = 1;KEY_OUT_1 = 1;break;
case 2:KEY_OUT_4 = 1;KEY_OUT_3 = 1;KEY_OUT_2 = 0;KEY_OUT_1 = 1;break;
case 3:KEY_OUT_4 = 1;KEY_OUT_3 = 1;KEY_OUT_2 = 1;KEY_OUT_1 = 0;break;
default:break;
}
}
nn.c
#include <reg52.h>
unsigned char step = 0;
unsigned char oprt = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
signed long num1 = 0;
signed long num2 = 0;
signed long result = 0;
void ConfigTimer0(unsigned int ms);
extern void KeyScan();
extern void KeyDriver();
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;
ConfigTimer0(1);
InitLcd1602();
LcdShowStr(15,1,"0");
while(1)
{
KeyDriver();
}
}
unsigned char LongToString(unsigned char *str,signed long dat)
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[12];
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 Reset()
{
num1 = 0;
num2 = 0;
step = 0;
LcdFullClear();
}
void NumKeyAction(unsigned char n)
{
unsigned char len;
unsigned char str[12];
if(step>1)
{
Reset();
}
if(step == 0)
{
num1 = num1*10+n;
len = LongToString(str,num1);
LcdShowStr(16-len,1,str);
}
else
{
num2 = num2*10+n;
len = LongToString(str,num2);
LcdShowStr(16-len,1,str);
}
}
void OprtKeyAction(unsigned char type)
{
unsigned char len;
unsigned char str[12];
if(step == 0)
{
len = LongToString(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 = LongToString(str,num2);
ShowOprt(0,oprt);
LcdAreaClear(1,0,16-1-len);
LcdShowStr(16-len,0,str);
len = LongToString(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 = 32768000/12;
tmp = (tmp*ms)/1000;
tmp = 65536 - tmp;
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();
}
|