专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
实习生求一个单片机程序。跪谢
2019-07-15 10:00
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
17938
3
1232
具体功能如下:
按键1按下 蜂鸣器频率+1 让数码管显示出来,
按键2按下 蜂鸣器频率-1 让数码管显示出来‘
最好是C语言的。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
183__183
2019-07-15 18:25
#include <reg52.h>
void delay_1ms(unsigned int i);
void key_value(); //按键处理函数
void display(long i); //显示数字函数
unsigned char duanxuan[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //0~9
unsigned char duanxuan2[] = {0xfe,0xbf,0xf7,0xb6}; // +-*/的段码
unsigned char weixuan[] = {0x7f,0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};
long key = 0; //保存正在按的数值
unsigned char mode = 0; //标志着+-*/ =1是+ =2是- =3是* =4是/
long num1 = 0; //保存第一个数
long result = 0; //保存计算的结果
unsigned char end = 0; //=1标志着按了等号
unsigned char display_mode = 0; //显示模式 =0显示目前正在按的数值 =1显示+-*/ =2显示计算结果
int main(void)
{
while(1)
{
key_value(); //按键处理函数
if( display_mode == 0 ) //显示正在按的数值
{
display(key);
}
else
{
if( display_mode == 1 ) //显示+-*/
{
P2 = 0x7f;
P0 = duanxuan2[mode-1];
}
else //显示结果
{
display(result);
}
}
}
return 0;
}
void key_value()
{
P1=0xf0;
if(P1!=0xf0)
{
delay_1ms(20); //消抖
if(P1!=0xf0) //消抖
{
/****** 以下四个switch语句为按键检测程序 *****/
P1=0xfe;
switch(P1)
{
case(0xee):key=key * 10 + 1;display_mode = 0;break; //数字1按键
case(0xde):key=key * 10 + 2;display_mode = 0;break; //数字2按键
case(0xbe):key=key * 10 + 3;display_mode = 0;break; //数字3按键
case(0x7e):mode = 1;display_mode = 1;break; // +(加号)按键
}
P1=0xfd;
switch(P1)
{
case(0xed):key=key * 10 + 4;display_mode = 0;break; //数字4按键
case(0xdd):key=key * 10 + 5;display_mode = 0;break; //数字5按键
case(0xbd):key=key * 10 + 6;display_mode = 0;break; //数字6按键
case(0x7d):mode = 2;display_mode = 1;break; // -(减号)按键
}
P1=0xfb;
switch(P1)
{
case(0xeb):key=key * 10 + 7;display_mode = 0;break; //数字7按键
case(0xdb):key=key * 10 + 8;display_mode = 0;break; //数字8按键
case(0xbb):key=key * 10 + 9;display_mode = 0;break; //数字9按键
case(0x7b):mode = 3;display_mode = 1;break; // *(乘号)按键
}
P1=0xf7;
switch(P1)
{
case(0xe7):break; //此按键本程序未使用
case(0xd7):key=key * 10 + 0;display_mode = 0;break; //数字0按键
case(0xb7):end = 1;break; // =(等号)按键
case(0x77):mode = 4;display_mode = 1;break; // /(除号)按键
}
P1 = 0xf0;
while(P1 != 0xf0); //松手检测
if ( display_mode == 1 ) // 按下 +-*/
{
num1 = key; //将按的数值给num1
key = 0; //清零
}
if ( end == 1 ) //开始计算结果
{
switch(mode) //检测加减乘除
{
case(1):result = num1 + key;break; //mode=1为加号
case(2):result = num1 - key;break; //mode=2为减号
case(3):result = num1 * key;break; //mode=3为乘号
case(4):result = num1 / key;break; //mode=4为除号
}
display_mode = 2; //显示模式为:显示计算结果
/***** 以下为清零操作 *****/
mode = 0;
key = 0;
end = 0;
}
}
}
}
void display(long i)
{
int n=0;
do
{
P0 = 0xff; //消影
P2 = weixuan [n++]; //数码管位选
P0 = duanxuan[i%10]; //控制数码管显示的数值
i /= 10;
}while( i > 0 ); //i>0就循环
}
void delay_1ms(unsigned int i)
{
unsigned char j ;
while(i--)
{
for(j=0;j<125;j++)
{
;
}
}
} //这是计算器程序
加载中...
查看其它3个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
void delay_1ms(unsigned int i);
void key_value(); //按键处理函数
void display(long i); //显示数字函数
unsigned char duanxuan[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //0~9
unsigned char duanxuan2[] = {0xfe,0xbf,0xf7,0xb6}; // +-*/的段码
unsigned char weixuan[] = {0x7f,0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};
long key = 0; //保存正在按的数值
unsigned char mode = 0; //标志着+-*/ =1是+ =2是- =3是* =4是/
long num1 = 0; //保存第一个数
long result = 0; //保存计算的结果
unsigned char end = 0; //=1标志着按了等号
unsigned char display_mode = 0; //显示模式 =0显示目前正在按的数值 =1显示+-*/ =2显示计算结果
int main(void)
{
while(1)
{
key_value(); //按键处理函数
if( display_mode == 0 ) //显示正在按的数值
{
display(key);
}
else
{
if( display_mode == 1 ) //显示+-*/
{
P2 = 0x7f;
P0 = duanxuan2[mode-1];
}
else //显示结果
{
display(result);
}
}
}
return 0;
}
void key_value()
{
P1=0xf0;
if(P1!=0xf0)
{
delay_1ms(20); //消抖
if(P1!=0xf0) //消抖
{
/****** 以下四个switch语句为按键检测程序 *****/
P1=0xfe;
switch(P1)
{
case(0xee):key=key * 10 + 1;display_mode = 0;break; //数字1按键
case(0xde):key=key * 10 + 2;display_mode = 0;break; //数字2按键
case(0xbe):key=key * 10 + 3;display_mode = 0;break; //数字3按键
case(0x7e):mode = 1;display_mode = 1;break; // +(加号)按键
}
P1=0xfd;
switch(P1)
{
case(0xed):key=key * 10 + 4;display_mode = 0;break; //数字4按键
case(0xdd):key=key * 10 + 5;display_mode = 0;break; //数字5按键
case(0xbd):key=key * 10 + 6;display_mode = 0;break; //数字6按键
case(0x7d):mode = 2;display_mode = 1;break; // -(减号)按键
}
P1=0xfb;
switch(P1)
{
case(0xeb):key=key * 10 + 7;display_mode = 0;break; //数字7按键
case(0xdb):key=key * 10 + 8;display_mode = 0;break; //数字8按键
case(0xbb):key=key * 10 + 9;display_mode = 0;break; //数字9按键
case(0x7b):mode = 3;display_mode = 1;break; // *(乘号)按键
}
P1=0xf7;
switch(P1)
{
case(0xe7):break; //此按键本程序未使用
case(0xd7):key=key * 10 + 0;display_mode = 0;break; //数字0按键
case(0xb7):end = 1;break; // =(等号)按键
case(0x77):mode = 4;display_mode = 1;break; // /(除号)按键
}
P1 = 0xf0;
while(P1 != 0xf0); //松手检测
if ( display_mode == 1 ) // 按下 +-*/
{
num1 = key; //将按的数值给num1
key = 0; //清零
}
if ( end == 1 ) //开始计算结果
{
switch(mode) //检测加减乘除
{
case(1):result = num1 + key;break; //mode=1为加号
case(2):result = num1 - key;break; //mode=2为减号
case(3):result = num1 * key;break; //mode=3为乘号
case(4):result = num1 / key;break; //mode=4为除号
}
display_mode = 2; //显示模式为:显示计算结果
/***** 以下为清零操作 *****/
mode = 0;
key = 0;
end = 0;
}
}
}
}
void display(long i)
{
int n=0;
do
{
P0 = 0xff; //消影
P2 = weixuan [n++]; //数码管位选
P0 = duanxuan[i%10]; //控制数码管显示的数值
i /= 10;
}while( i > 0 ); //i>0就循环
}
void delay_1ms(unsigned int i)
{
unsigned char j ;
while(i--)
{
for(j=0;j<125;j++)
{
;
}
}
} //这是计算器程序
一周热门 更多>