标题:
单片机开发板实现电子琴和数码管计算器程序(超简单)
[打印本页]
作者:
Farr_summer
时间:
2023-3-26 15:56
标题:
单片机开发板实现电子琴和数码管计算器程序(超简单)
程序实现内容为:
1、通过矩阵键盘输入和数码管显示可以实现简易计算器的功能。
2、计算器功能有基本的加减乘除外,还实现了累加累乘的功能。
3、矩阵键盘从第一排往右的案件功能分别为1、2、3、+、4、5、6、-、7、8、9、*、0、清零、等于、除
4、在第一二独立按键按下切换还可以实现电子琴和计算器切换的功能5、程序包含数码管显示函数。
51hei图片_20230326155432.jpg
(700.53 KB, 下载次数: 39)
下载附件
普中A2开发板
2023-3-26 15:54 上传
普中A2单片机源程序如下:
#include <reg52.h>
#include <string.h>
//strcmp(tempName, names[i]) == 0
#define KEYS P1
typedef signed long u16; //对数据类型进行声明定义
typedef unsigned int u12;
typedef unsigned char u8;
unsigned char chice = 0;
int find;
long view = 0; //计算器最终数字定义
int s = 0; //按键次数
int num = 1;
long temp,temp1; //计算器用到的数值
long sum = 0;
long totalsum = 0;
int tect = 0; //测试是否按下等号
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
int ZE; //选择模式
int sound;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P2^5;
void delay(int t)
{
while(t--); //大概等于十微秒
}
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X40};// 显 示 0~F 的值
void Display(int i)
{
switch(i) //位选,选择点亮的数码管,
{
case(0): LSA=1;LSB=1;LSC=1; break;//显示第 0 位
case(1): LSA=0;LSB=1;LSC=1; break;//显示第 1 位
case(2): LSA=1;LSB=0;LSC=1; break;//显示第 2 位
case(3): LSA=0;LSB=0;LSC=1; break;//显示第 3 位
case(4): LSA=1;LSB=1;LSC=0; break;//显示第 4 位
case(5): LSA=0;LSB=1;LSC=0; break;//显示第 5 位
case(6): LSA=1;LSB=0;LSC=0; break;//显示第 6 位
case(7): LSA=0;LSB=0;LSC=0; break;//显示第 7 位
}
}
void Displaynum(long num)
{
long temp ;
int nums[8];
long i,j;
u16 sum;
int m = 0;
for(sum = 1,j = 0;j < 8;j++)
{
if ( num >= 0 )
{
if(sum <= num && num >= 0 )
{
temp = num / sum;
temp = temp % 10;
nums[j] = temp;
m++;
}
else if(num == 0)
{
nums[j] = 0;
m++;
break;
}
sum *= 10;
}
else if(num < 0)
{
if(num < 0 && sum <= (-num))
{
temp = (-num) / sum;
temp = temp % 10;
nums[j] = temp;
m++;
}
else
{
nums[j] = 16;
m++;
break;
}
sum *= 10;
}
}
for(i = 7;i >= 0;i--)
{
j = nums[i];
if(i < m)
{
Display(7 - i);
P0=smgduan[j];
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
else
{
P0 = 0X00;
}
}
}
void Mkey()
{
int a = 0;
KEYS = 0X0f;
if(KEYS != 0X0f)
{
delay(1000);
if(KEYS != 0Xff)
{
KEYS=0X0F;
switch(KEYS) //判断列
{
case(0X07): chice=0;break;
case(0X0b): chice=1;break;
case(0X0d): chice=2;break;
case(0X0e): chice=3;break;
}
KEYS=0XF0;
switch(KEYS)
{
case(0X70): chice=chice;break;
case(0Xb0): chice=chice+4;break;
case(0Xd0): chice=chice+8;break;
case(0Xe0): chice=chice+12;break;
}
switch(chice) //对每个按键进行功能定义
{
case(0):find = 1;break; case(1):find = 2;break; case(2):find = 3;break; case(3):find = 10;break; //加
case(4):find = 4;break; case(5):find = 5;break; case(6):find = 6;break; case(7):find = 11;break; //减
case(8):find = 7;break; case(9):find = 8;break; case(10):find = 9;break; case(11):find = 12;break;//乘
case(12):find = 0;break; case(13):find = 14;break; case(14):find = 15;break; case(15):find = 13;break;//除
}
switch(find) //音频频率
{
case(1):sound = 70;break;
case(2):sound = 65;break;
case(3):sound = 60;break;
case(4):sound = 55;break;
case(5):sound = 50;break;
case(6):sound = 45;break;
case(7):sound = 40;break;
case(8):sound = 35;break;
}
}
while(KEYS!=0xf0)
{
if(ZE == 2 && sound > 35)
{
beep = ~beep;delay(sound);
}
} //检测按键松手检测
sound = 0;
if(sum == 0)
{
view = 0;
}
view = (view *= 10) + find; //累加
if(find < 10 && s == 0) //第一次加
{
sum = 1;
temp = view;
}
else if(find >= 10)
{
if(tect == 0 && s > 0) //累算
{
switch(find)
{
case(10):temp = temp + temp1;break;
case(11):temp = temp - temp1;break;
case(12):temp = temp * temp1;break;
case(13):temp = temp / temp1;break;
}
}
view = 0;
switch(find)
{
case(10):s=1;break;
case(11):s=2;break;
case(12):s=3;break;
case(13):s=4;break;
}
}
if(find < 10 && s != 0) //第二次加
{
sum = 1;
temp1 = view;
}
}
}
void Comp()
{
if(find == 15)
{
switch(s)
{
case(1):view = temp + temp1;break;
case(2):view = temp - temp1;break;
case(3):view = temp * temp1;break;
case(4):view = temp / temp1;break;
}
temp = view;
find = 0;
sum = 0;
s = 0;
tect = 1;
}
else if(find == 14)
{
view=0;
temp = 0;
temp1 = 0;
s = 0;
find = 0;
sum = 0;
totalsum = 0;
tect = 0;
}
}
void XUAN()
{
if(KEY1 == 0 || KEY2 == 0)
{
delay(100);
if(KEY1 == 0)
{
ZE = 1;
}
if(KEY2 == 0)
{
ZE = 2;
}
while(!KEY1 || !KEY2);
}
}
void main()
{
while(1)
{
XUAN();
Mkey();
if(ZE != 2)
{
Comp();
Displaynum(view);
}
if(ZE == 2)
{
view = 0;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1