基于51单片机可修改错误功能的计算器工作原理解析

utilities.h
#ifndefutilities_h_included
#defineutilities_h_included
typedefunsignedcharuchar,byte,uint8;
typedefunsignedintuint,word,uint16;
typedefunsignedlongulong,dword,uint32;
typedefcharint8;
typedefintint16;
typedeflongint32;
typedefunsignedchar*uchar_p;
typedefunsignedint*uint_p;
typedefunsignedlong*ulong_p;
typedefchar*char_p;
typedefint*int_p;
typedeflong*long_p;
#endif//utilities_h_included
keyboard.c
#include
#include“utilities.h”
sbitkey_out_3=p2^0;
sbitkey_out_2=p2^1;
sbitkey_out_1=p2^2;
sbitkey_out_0=p2^3;
sbitkey_in_0=p2^4;
sbitkey_in_1=p2^5;
sbitkey_in_2=p2^6;
sbitkey_in_3=p2^7;
ucharcodekeycodemap[4][4]={//矩阵按键编号到标准键盘键码的映射表
{0x31,0x32,0x33,0x26},//数字键1、数字键2、数字键3、向上键
{0x34,0x35,0x36,0x25},//数字键4、数字键5、数字键6、向左键
{0x37,0x38,0x39,0x28},//数字键7、数字键8、数字键9、向下键
{0x30,0x1b,0x0d,0x27}//数字键0、esc键、回车键、向右键
};
ucharpdatakeystate[4][4]={//全部矩阵按键的当前状态
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
externvoidkeyaction(ucharkeycode);
voidkeydriver(){
uchari,j;
staticucharbackup[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(keystate[i][j]!=backup[i][j]){
if(keystate[i][j]==0)
keyaction(keycodemap[i][j]);
backup[i][j]=keystate[i][j];
}
}
voidkeyscan(){
staticuchari=0;
staticucharkeybuf[4][4]={
{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},
{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}
};
ucharj;
keybuf[i][0]=(keybuf[i][0]《《1)|key_in_0;
keybuf[i][1]=(keybuf[i][1]《《1)|key_in_1;
keybuf[i][2]=(keybuf[i][2]《《1)|key_in_2;
keybuf[i][3]=(keybuf[i][3]《《1)|key_in_3;
for(j=0;j《4;j++){
if(keybuf[i][j]==0x00)
keystate[i][j]=0;
elseif(keybuf[i][j]==0xff)
keystate[i][j]=1;
}
switch(i){
case0:key_out_0=1;key_out_1=0;break;
case1:key_out_1=1;key_out_2=0;break;
case2:key_out_2=1;key_out_3=0;break;
case3:key_out_3=1;key_out_0=0;break;
default:break;
}
i=++i&0x03;
}
digitaltube.c
#include
#include“utilities.h”
ucharcodeledchar[]={//数码管显示字符转换表
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
ucharledbuff[6]={//数码管显示缓冲区
0xff,0xff,0xff,0xff,0xff,0xff
};
voidshownumber(ulongnum){
chari;
ucharbuf[6];
for(i=0;i《6;i++){
buf[i]=num%10;
num/=10;
}
for(i=5;i》0;i--){
if(buf[i]==0)
ledbuff[i]=0xff;
else
break;
}
for(;i》=0;i--)
ledbuff[i]=ledchar[buf[i]];
}
voidledscan(){
staticuchari=0;
p0=0xff;
p1=(p1&0xf8)|i;
p0=ledbuff[i];
if(i《5)
i++;
else
i=0;
}
timer.c
#include
#include“utilities.h”
#definetimer0
#definetimer0_mod1
#ifdefined(timer0)
uchart0rh=0;
uchart0rl=0;
#ifdefined(timer0_mod1)
voidsettmr0(uintms){
ulongtmp;
tmp=11059326/12;
tmp=tmp*ms/1000;
tmp=65536-tmp;
tmp+=28;
t0rl=tmp;
t0rh=tmp》》8;
}
#endif//defined
#endif//defined
calculator.c
/**********************************************************
加减乘除计算器,能实现连续的运算,并且提供修改功能:
对于算符来说,以最后输入的算符为准。
测试样例:
12+256*9-53/2
3 + - * 5

工程监测振弦采集仪采集到的数据如何进行分析和处理
Quest视频应用NextVR添加实时PAVE播放功能
Neardi推出基于瑞芯微RK3399Pro的5路AHD高清视觉主机
全面解读Redmi Note9系列手机
智能电网与微电网技术研究
基于51单片机可修改错误功能的计算器工作原理解析
随着USB-C接口的普及 速度越来越快已经达到10Gbps
采用MSP430设计的12位心电(ECG)放大器
中国天眼宣布在2021年向全球科学家开发
硅谷为何钟情于AI?前沿浪潮中AI是大主角
智慧公安建设方案,公安大数据平台开发
首款LXI C 类标准的频率计数器Agilent 53200系列日前被推出
PLC远程监控助力农村生活污水数字化治理
ieee标准是什么 无线局域网wlan使用的标准是什么
AMD锐龙处理器怎么样
浅析伺服驱动器中的常规电流采样电路设计
使用霍尔传感器和LED构建一个磁极性检测器
薄膜表面缺陷在线检测系统的功能都有哪些
浅谈LED灯具寿命的测试标准和方案
开放协作铸就浪潮信息集中式全闪存储平台