微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 实习生求一个单片机程序。跪谢

实习生求一个单片机程序。跪谢

时间:10-02 整理:3721RD 点击:
具体功能如下:
                  按键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波吧

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top