实习生求一个单片机程序。跪谢
按键1按下 蜂鸣器频率+1 让数码管显示出来,
按键2按下 蜂鸣器频率-1 让数码管显示出来‘
最好是C语言的。
我用的51
void beep() //产生1KHZ频率声音的函数
{
fmq=0;
delay500us(i);
fmq=1;
delay500us(i); //i就是频率从1千赫兹加一 ,,2千赫兹
}
让数字从一位变到多位
while(1)//y记录x的原始值
{
P0=0xff;
P2=weixuan[n++];
P0=duanxuan[x%10];
x=x/10;
if(x==0)
{
n=0;x=y;
}
} //这是显示函数,其实就是计算器的(整数)
我是一个不怎么懂的菜鸟。 但我看这里面没有按键程序呀?我想让它按一下加一下,,希望还能说详细点。谢谢
#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++)
{
;
}
}
} //这是计算器程序
你自己可以去开发呼吸灯,电梯和小数计算器,加油
你自己去网上看一看PWm波吧