要求:分析代码 代码如下:#include "reg51.h" sbit smg1=P2^0;//数码管 sbit smg2=P2^1; sbit smg3=P2^2; sbit smg4=P2^3; sbit smg5=P2^4; sbit smg6=P2^5; unsigned int a=0,b=0; //输入 unsigned char fuhao=0;//符号 unsigned int c=0;//结果 unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9 void delay(unsigned int i)//延时函数 { while(i--); } unsigned char key_scan()//按键检测 { unsigned char i,j; i=0; j=0; P1=0x0f; if(P1!=0x0f) //被按下 { switch(P1)//检测行 { case 0x0e:i=3;break;//第四行 case 0x0d:i=2;break;//第三行 case 0x0b:i=1;break;//第二行 case 0x07:i=0;//第一行 } P1=0xf0; switch(P1)//检测列 { case 0xe0:j=13;break;//第四列 case 0xd0:j=9;break;//第三列 case 0xb0:j=5;break;//第二列 case 0x70:j=1;//第一列 } while(P1!=0xf0);//等待按键松开 } return i+j; } void main()//主函数 { unsigned char i; while(1) { //显示功能 if(fuhao<5) {//第一个数 P0=smgduan[a%10];smg1=0;delay(100);smg1=1;//第一个数 switch(fuhao)//符号 { case 1:P0=0x01;break;//加 case 2:P0=0x40;break;//减 case 3:P0=0x08;break;//乘 case 4:P0=0x80;break;//除 default:P0=0; } smg2=0;delay(100);smg2=1;//符号 P0=smgduan[b%10];smg3=0;delay(100);smg3=1;//第二个数 } else//计算结果 { P0=0x09;smg1=0;delay(100);smg1=1;//等于 //结果 P0=smgduan[c%100/10];smg2=0;delay(100);smg2=1;//十位 P0=smgduan[c%10];smg3=0;delay(100);smg3=1;//个位 } //计算功能 i=key_scan();//检测 if((i>0)&&(i<11))//输入数值 { if(fuhao==0)//第一个数 { a=i-1; } else //第二个数 { b=i-1; } } if(i==13)//加 { fuhao=1; } if(i==14)//减 { fuhao=2; } if(i==15)//乘 { fuhao=3; } if(i==16)//除 { fuhao=4; } if(i==11)//等于 { switch(fuhao) { case 1:c=a+b;break; case 2:c=a-b;break; case 3:c=a;c=c*b;break; case 4:c=a/b; } fuhao=5; } if(i==12)//归零 { a=0; b=0; c=0; fuhao=0; } } }
时间: 2024-04-07 18:29:21 浏览: 274
这段代码是一个基于单片机的简易计算器,主要包括按键检测、数码管显示和计算功能。其中,按键检测使用了行列式按键检测方法,可以检测到16个按键,包括0~9数字键、加减乘除符号键、等于键和归零键。数码管显示使用了共阳数码管,通过控制各个数码管的开关,实现了数字和符号的显示。计算功能包括加减乘除四则运算和结果的显示,通过判断当前处于输入第一个数、输入符号、输入第二个数还是计算结果的状态,来选择对应的显示和计算方法。整个程序主要通过while循环来实现不断的按键检测和计算显示。
相关问题
要求:对下列代码进行注释 代码如下:#include "reg51.h" sbit smg1=P2^0;//数码管 sbit smg2=P2^1; sbit smg3=P2^2; sbit smg4=P2^3; sbit smg5=P2^4; sbit smg6=P2^5; unsigned int a=0,b=0; //输入 unsigned char fuhao=0;//符号 unsigned int c=0;//结果 unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9 void delay(unsigned int i)//延时函数 { while(i--); } unsigned char key_scan()//按键检测 { unsigned char i,j; i=0; j=0; P1=0x0f; if(P1!=0x0f) //被按下 { switch(P1)//检测行 { case 0x0e:i=3;break;//第四行 case 0x0d:i=2;break;//第三行 case 0x0b:i=1;break;//第二行 case 0x07:i=0;//第一行 } P1=0xf0; switch(P1)//检测列 { case 0xe0:j=13;break;//第四列 case 0xd0:j=9;break;//第三列 case 0xb0:j=5;break;//第二列 case 0x70:j=1;//第一列 } while(P1!=0xf0);//等待按键松开 } return i+j; } void main()//主函数 { unsigned char i; while(1) { //显示功能 if(fuhao<5) {//第一个数 P0=smgduan[a%10];smg1=0;delay(100);smg1=1;//第一个数 switch(fuhao)//符号 { case 1:P0=0x01;break;//加 case 2:P0=0x40;break;//减 case 3:P0=0x08;break;//乘 case 4:P0=0x80;break;//除 default:P0=0; } smg2=0;delay(100);smg2=1;//符号 P0=smgduan[b%10];smg3=0;delay(100);smg3=1;//第二个数 } else//计算结果 { P0=0x09;smg1=0;delay(100);smg1=1;//等于 //结果 P0=smgduan[c%100/10];smg2=0;delay(100);smg2=1;//十位 P0=smgduan[c%10];smg3=0;delay(100);smg3=1;//个位 } //计算功能 i=key_scan();//检测 if((i>0)&&(i<11))//输入数值 { if(fuhao==0)//第一个数 { a=i-1; } else //第二个数 { b=i-1; } } if(i==13)//加 { fuhao=1; } if(i==14)//减 { fuhao=2; } if(i==15)//乘 { fuhao=3; } if(i==16)//除 { fuhao=4; } if(i==11)//等于 { switch(fuhao) { case 1:c=a+b;break; case 2:c=a-b;break; case 3:c=a;c=c*b;break; case 4:c=a/b; } fuhao=5; } if(i==12)//归零 { a=0; b=0; c=0; fuhao=0; } } }
注释如下:
#include "reg51.h" //包含头文件reg51.h,该头文件是51单片机的寄存器定义文件
sbit smg1=P2^0;//数码管1
sbit smg2=P2^1;//数码管2
sbit smg3=P2^2;//数码管3
sbit smg4=P2^3;//数码管4
sbit smg5=P2^4;//数码管5
sbit smg6=P2^5;//数码管6
unsigned int a=0,b=0; //定义两个无符号整型变量a和b并初始化为0
unsigned char fuhao=0;//定义一个无符号字符型变量fuhao并初始化为0,用于记录运算符号
unsigned int c=0;//定义一个无符号整型变量c并初始化为0,用于记录结果
unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义一个只读的字符型数组smgduan,用于存储0~9的七段数码管显示编码
void delay(unsigned int i)//定义一个延时函数,参数为一个无符号整型变量i
{
while(i--); //i自减,当i为0时跳出循环
}
unsigned char key_scan()//定义一个按键检测函数,返回一个无符号字符型变量
{
unsigned char i,j; //定义两个无符号字符型变量i和j,用于记录行和列
i=0; //将i初始化为0
j=0; //将j初始化为0
P1=0x0f; //将P1的低4位设为0,用于检测行
if(P1!=0x0f) //如果P1的低4位不为0x0f,说明有按键被按下
{
switch(P1) //检测行
{
case 0x0e:i=3;break;//第四行
case 0x0d:i=2;break;//第三行
case 0x0b:i=1;break;//第二行
case 0x07:i=0;//第一行
}
P1=0xf0; //将P1的高4位设为0,用于检测列
switch(P1) //检测列
{
case 0xe0:j=13;break;//第四列
case 0xd0:j=9;break;//第三列
case 0xb0:j=5;break;//第二列
case 0x70:j=1;//第一列
}
while(P1!=0xf0);//等待按键松开
}
return i+j; //返回行列之和
}
void main()//主函数
{
unsigned char i; //定义一个无符号字符型变量i
while(1) //无限循环
{
//显示功能
if(fuhao<5) //如果运算符号小于5,说明在输入第一个数或运算符号
{
//显示第一个数
P0=smgduan[a%10];smg1=0;delay(100);smg1=1;//取a的个位数并显示
switch(fuhao) //显示运算符号
{
case 1:P0=0x01;break;//加
case 2:P0=0x40;break;//减
case 3:P0=0x08;break;//乘
case 4:P0=0x80;break;//除
default:P0=0;
}
smg2=0;delay(100);smg2=1;//显示运算符号
P0=smgduan[b%10];smg3=0;delay(100);smg3=1;//取b的个位数并显示
}
else //如果运算符号为5,说明需要计算结果
{
P0=0x09;smg1=0;delay(100);smg1=1;//显示等于号
P0=smgduan[c%100/10];smg2=0;delay(100);smg2=1;//取c的十位数并显示
P0=smgduan[c%10];smg3=0;delay(100);smg3=1;//取c的个位数并显示
}
//计算功能
i=key_scan();//检测按键
if((i>0)&&(i<11))//如果输入的是数字键
{
if(fuhao==0)//如果运算符号为0,说明在输入第一个数
{
a=i-1; //将输入的数字存入a
}
else //如果运算符号不为0,说明在输入第二个数
{
b=i-1; //将输入的数字存入b
}
}
if(i==13)//如果输入的是加号
{
fuhao=1; //设置运算符号为1
}
if(i==14)//如果输入的是减号
{
fuhao=2; //设置运算符号为2
}
if(i==15)//如果输入的是乘号
{
fuhao=3; //设置运算符号为3
}
if(i==16)//如果输入的是除号
{
fuhao=4; //设置运算符号为4
}
if(i==11)//如果输入的是等于号
{
switch(fuhao) //根据运算符号进行计算
{
case 1:c=a+b;break;//加
case 2:c=a-b;break;//减
case 3:c=a*c;break;//乘
case 4:c=a/b;break;//除
}
fuhao=5; //设置运算符号为5,表示已经计算出结果
}
if(i==12)//如果输入的是归零键
{
a=0; b=0; c=0; fuhao=0; //将a、b、c、fuhao全部清零
}
}
}
请标注代码的注释:#include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; #define SMG1 P0 sbit w1 = P2^2; sbit w2 = P2^3; sbit w3 = P2^4; u8 MUN_0_F[8] = {0x06,0x7d,0x00,0x00,0x00,0x00,0x00,0x00}; sbit moto=P1^0; sbit k1=P3^1; sbit k2=P3^0; voi
d main()
{
u8 i=0;
while(1)
{
if(k1==0) // 如果按键1被按下
{
delay(10); // 延时10ms
if(k1==0) // 如果按键1仍被按下
{
i++; // 计数器加1
if(i==10) // 如果计数器等于10
{
i=0; // 计数器清零
}
SMG1=MUN_0_F[i]; // 显示数字
while(!k1); // 等待按键1松开
}
}
if(k2==0) // 如果按键2被按下
{
delay(10); // 延时10ms
if(k2==0) // 如果按键2仍被按下
{
moto=~moto; // 电机反转
while(!k2); // 等待按键2松开
}
}
}
}
// 注释:
// 引入reg52头文件,定义u8和u16类型,定义SMG1为P0口
// 定义w1、w2、w3为P2口的引脚
// 定义MUN_0_F数组,用于显示数字0~9
// 定义moto、k1、k2引脚
// 主函数中,循环检测按键1和按键2的状态,如果被按下,则根据情况进行相应操作
// delay函数为延时函数,未给出具体代码实现
阅读全文