任务描述单片机连接8位共阳极数码管和4*4矩阵键盘利用矩阵键盘定义0~9数字键并定义、-、*、/、等五个功能键。编程实现两个一位十进制数的四则运算并显示结果。注意与运算--两个条件并列位于运算--按位完成与完成指定位置清零。最低位清零^1111 1110最高位清零^0111 1111/************************* 项目名称项目三简易计算器 任务名称任务3-4四则运算计算器 任务描述单片机连接8位共阳极数码管和4*4矩阵键盘 利用矩阵键盘定义0~9数字键并定义、-、*、/、等五个功能键。 编程实现两个一位十进制数的四则运算并显示结果。 *************************/ #includereg51.h #includeintrins.h //51单片机寄存器定义头文件 sbit row0P1^0; sbit row1P1^1; sbit row2P1^2; sbit row3P1^3; sbit col0P1^4; sbit col1P1^5; sbit col2P1^6; sbit col3P1^7; int n;//存放按键编号 int t;//存放运算类型编号1~ 2~- 3~X 4~/ int m1,m2;//存放两个加数 int dis[2];//存放结果的十位和个位 int seg[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//定义0~9共阳极七段码,0xbf是-负号 void key1();//等待按键按下无限查询 void key2();//扫描按键位置行列扫描 void key3();//处理按键请求显示编号 void display();//显示两位结果子函数 /**********************************************/ void delay(int i) { int k,j; for(k0;ki;k) for(j0;j100;j); } /**********************************************/ void main() { while(1) { key1(); key2(); key3(); } } /**********************************************/ void key1() { while(1) { P10x0f; if(P1!0x0f)//有变化一定是有按键按下导致某行某列短路 break;//退出查询 } } /**********************************************/ void key2() { P10xff;//行列都写1 col00;//清零0列 if(row00) n0; if(row10) n1; if(row20) n2; if(row30) n3; P10xff;//行列都写1 col10;//清零1列 if(row00) n4; if(row10) n5; if(row20) n6; if(row30) n7; P10xff;//行列都写1 col20;//清零2列 if(row00) n8; if(row10) n9; if(row20){m1n;t1;}//键保存数字1,运算类型编号1 if(row30){m1n;t2;}//-键保存数字1,运算类型编号2 P10xff;//行列都写1 col30;//清零3列 if(row00){m1n;t3;}//*键保存数字1,运算类型编号3 if(row10){m1n;t4;}//\键保存数字1,运算类型编号4 if(row30) {m2n;n10;}//保存数字2并且按键编号10 } /**********************************************/ void key3() { if(n10)//按下数字键显示数字 { P20xfe;//1111 1110 P0seg[n]; } else//按下等号键 display();//显示两位结果 } /**********************************************/ void display() { int i,j; switch(t) { case 1://求和 dis[0](m1m2)/10;//求和并拆字得到十位显示值 dis[1](m1m2)%10;//求和并拆字得到个位显示值 break; case 2://求差 if(m1m2)//差为正 { dis[0]0; dis[1]m1-m2; } else { dis[0]10;//负号的查表值 dis[1]m2-m1; } break; case 3://求积 dis[0](m1*m2)/10;//求积并拆字得到十位显示值 dis[1](m1*m2)%10;//求积并拆字得到个位显示值 break; case 4://求商 dis[0]m1/m2;//个位的值 dis[1]m1%m2*10/m2;//十分位的值 } while(1) { for(i0,j0xfd;i2;i)//1111 1101 { P2j; P0seg[dis[i]]; if(t4 i0)//除法运算显示高位时 P0P0 0x7f;//利用位于运算清零七段码最高位dp字段点亮小数点 delay(2); j_cror_(j,1); } } }
项目三简易计算器 任务3-4四则运算计算器
发布时间:2026/6/10 21:04:08
任务描述单片机连接8位共阳极数码管和4*4矩阵键盘利用矩阵键盘定义0~9数字键并定义、-、*、/、等五个功能键。编程实现两个一位十进制数的四则运算并显示结果。注意与运算--两个条件并列位于运算--按位完成与完成指定位置清零。最低位清零^1111 1110最高位清零^0111 1111/************************* 项目名称项目三简易计算器 任务名称任务3-4四则运算计算器 任务描述单片机连接8位共阳极数码管和4*4矩阵键盘 利用矩阵键盘定义0~9数字键并定义、-、*、/、等五个功能键。 编程实现两个一位十进制数的四则运算并显示结果。 *************************/ #includereg51.h #includeintrins.h //51单片机寄存器定义头文件 sbit row0P1^0; sbit row1P1^1; sbit row2P1^2; sbit row3P1^3; sbit col0P1^4; sbit col1P1^5; sbit col2P1^6; sbit col3P1^7; int n;//存放按键编号 int t;//存放运算类型编号1~ 2~- 3~X 4~/ int m1,m2;//存放两个加数 int dis[2];//存放结果的十位和个位 int seg[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//定义0~9共阳极七段码,0xbf是-负号 void key1();//等待按键按下无限查询 void key2();//扫描按键位置行列扫描 void key3();//处理按键请求显示编号 void display();//显示两位结果子函数 /**********************************************/ void delay(int i) { int k,j; for(k0;ki;k) for(j0;j100;j); } /**********************************************/ void main() { while(1) { key1(); key2(); key3(); } } /**********************************************/ void key1() { while(1) { P10x0f; if(P1!0x0f)//有变化一定是有按键按下导致某行某列短路 break;//退出查询 } } /**********************************************/ void key2() { P10xff;//行列都写1 col00;//清零0列 if(row00) n0; if(row10) n1; if(row20) n2; if(row30) n3; P10xff;//行列都写1 col10;//清零1列 if(row00) n4; if(row10) n5; if(row20) n6; if(row30) n7; P10xff;//行列都写1 col20;//清零2列 if(row00) n8; if(row10) n9; if(row20){m1n;t1;}//键保存数字1,运算类型编号1 if(row30){m1n;t2;}//-键保存数字1,运算类型编号2 P10xff;//行列都写1 col30;//清零3列 if(row00){m1n;t3;}//*键保存数字1,运算类型编号3 if(row10){m1n;t4;}//\键保存数字1,运算类型编号4 if(row30) {m2n;n10;}//保存数字2并且按键编号10 } /**********************************************/ void key3() { if(n10)//按下数字键显示数字 { P20xfe;//1111 1110 P0seg[n]; } else//按下等号键 display();//显示两位结果 } /**********************************************/ void display() { int i,j; switch(t) { case 1://求和 dis[0](m1m2)/10;//求和并拆字得到十位显示值 dis[1](m1m2)%10;//求和并拆字得到个位显示值 break; case 2://求差 if(m1m2)//差为正 { dis[0]0; dis[1]m1-m2; } else { dis[0]10;//负号的查表值 dis[1]m2-m1; } break; case 3://求积 dis[0](m1*m2)/10;//求积并拆字得到十位显示值 dis[1](m1*m2)%10;//求积并拆字得到个位显示值 break; case 4://求商 dis[0]m1/m2;//个位的值 dis[1]m1%m2*10/m2;//十分位的值 } while(1) { for(i0,j0xfd;i2;i)//1111 1101 { P2j; P0seg[dis[i]]; if(t4 i0)//除法运算显示高位时 P0P0 0x7f;//利用位于运算清零七段码最高位dp字段点亮小数点 delay(2); j_cror_(j,1); } } }