久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1683|回復: 0
打印 上一主題 下一主題
收起左側

電子琴簡單的程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:333870 發(fā)表于 2018-5-19 20:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>
#define   FOSC    12000000
#define T0FENPING  12
unsigned int code JINJIEFREQ[] =
{
  262,294,330,349,392,440,494,
  523,587,659,699,784,880,988,
  1046,1175,1319,1391,1568,1760,1976
};

bit RunFlag = 0;
sbit Beep = P3^0;
unsigned char STH0,STL0,num1,num,temp,m,jishu;
unsigned char keyscan();
void Delay10ms(unsigned int c) ;
void delay(unsigned int c);
void T0_ISR(void) interrupt 1
{
  if(1 == RunFlag)                                  //--- 在音階播放標志為1情況下 ---
    {
      TH0 = STH0;                                   //--- 重新裝初值 ---
      TL0 = STL0;
      Beep = ~Beep;                                   //--- P5.5引腳上的電平翻轉 ---
    }
}
void main(void)
{
  unsigned int i;
  unsigned char j;

//  AUXR |= 0x80;                                     //--- 使能T0的計數器時鐘分頻值為1 ---
  TMOD = 0x01;                                      //--- 配置T0為定時模式,工作于方式2 ---
  ET0 = 1;                                          //--- 使能T0中斷 ---
  TR0 = 1;
  EA = 1;                                           //--- CPU開中斷 ---
  while(1)
    {
       num1 = keyscan();
           Beep = 1;
           while(m)
             {
                          m = 0;
                          STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[num1]) / 256;
                  STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[num1]) % 256;
                  TH0 = STH0;                       //--- 裝入TH0,TL0的計數寄存器 ---
                  TL0 = STL0;
                  RunFlag = 1;           
                                  delay(500);   
                                          
                 }
                
                     
                    TH0 = 0;     
                
    }       
               
                  
}


unsigned char keyscan()         //定義子函數  鍵盤掃描
{
        P0=0xfe;   //第一行按鍵                 1111 1110
        temp=P0;//讀取P2口
        temp=temp&0xf0;        //1111 0000                 即 1111 1110 & 1111 0000 =1111 0000
        while(temp!=0xf0) //  如果不等于  說明有鍵按下
        {                                                                                                                                 
                Delay10ms(1);
                temp=P0;//再次讀一下P2口的值        1110 1110
                temp=temp&0xf0;                        //                1110 1110 &1111 0000= 1110  0000
                while(temp!=0xf0) //確認是否按下
                {
                        temp=P0; //P2口的值讀回來 1110 1110
                        switch(temp)  //可以看出是哪一列    temp和case后的 0xee 相比  如果相等 執(zhí)行 num
                        {
                                case 0xee:num=0,m=1;//按下第一行 第一個鍵 是 1110 1110 即ee
                                        break;//跳出這個語句
                                case 0xde:num=1,m=1;                         //1101 1110   de
                                        break;
                                case 0xbe:num=2,m=1;                         //1011 1110   be
                                        break;
                                case 0x7e:num=3,m=1;                         //0111 1110   7e
                                        break;
                        }
                        while(temp!=0xf0)//松手檢測   按鍵 不松手 不等于0成立
                        {
                                temp=P0;
                                temp=temp&0xf0;                  //1110 1110& 1111 0000= 1110 0000
                        }
                        //        P0=table[num1-1];
                }
        }


        P0=0xfd;         //第二行按鍵        1111 1101
        temp=P0;//讀取P2口
        temp=temp&0xf0;
        while(temp!=0xf0) //看是否有鍵按下
        {
                Delay10ms(1);
                temp=P0;//再次讀一下P2口的值
                temp=temp&0xf0;
                while(temp!=0xf0)
                {
                        temp=P0; //P2口的值讀回來 1111 1101
                        switch(temp)  //temp和case后的 0xed 相比  如果相等 執(zhí)行 num
                        {
                                case 0xed:num=4,m=1;
                                        break;//跳出這個語句
                                case 0xdd:num=5,m=1;                         
                                        break;
                                case 0xbd:num=6,m=1;                       
                                        break;
                                case 0x7d:num=7,m=1;                         
                                        break;
                        }
                        while(temp!=0xf0)//松手檢測   按鍵 不松手 不等于0成立
                        {
                                temp=P0;
                                temp=temp&0xf0;
                        }  //        P0=table[num1-1];
                }
        }       


        P0=0xfb;         //第三行按鍵  1111 1011
        temp=P0;//讀取P2口
        temp=temp&0xf0;
        while(temp!=0xf0) //看是否有鍵按下
        {
                Delay10ms(1);
                temp=P0;//再次讀一下P2口的值
                temp=temp&0xf0;
                while(temp!=0xf0)
                {
                        temp=P0; //P2口的值讀回來 1111 1011
                        switch(temp)  //temp和case后的 0xeb 相比  如果相等 執(zhí)行 num
                        {
                                case 0xeb:num=8,m=1;
                                        break;//跳出這個語句
                                case 0xdb:num=9,m=1;                       
                                        break;
                                case 0xbb:num=10,m=1;               
                                        break;
                                case 0x7b:num=11,m=1;               
                                        break;
                        }
                        while(temp!=0xf0)//松手檢測   按鍵 不松手 不等于0成立
                        {
                                temp=P0;
                                temp=temp&0xf0;
                        }         //        P0=table[num1-1];
                }
        }       
       
        P0=0xf7;         //第四行按鍵          1111 0111
        temp=P0;//讀取P2口
        temp=temp&0xf0;
        while(temp!=0xf0) //看是否有鍵按下
        {
                Delay10ms(1);
                temp=P0;//再次讀一下P2口的值
                temp=temp&0xf0;
                while(temp!=0xf0)
                {
                        temp=P0; //P2口的值讀回來 1111 0111
                        switch(temp)  //temp和case后的 0xe7 相比  如果相等 執(zhí)行 num
                        {
                                case 0xe7:num=12,m=1;
                                        break;
                                case 0xd7:num=13,m=1;                         
                                        break;
                                case 0xb7:num=14,m=1;                         
                                        break;
                                case 0x77:num=15,m=1;                         
                                        break;
                        }
                        while(temp!=0xf0)//松手檢測   按鍵 不松手 不等于0成立
                        {
                                temp=P0;
                                temp=temp&0xf0;
                        } //        P0=table[num1-1];
                }
        }       
        return num;
}


void Delay10ms(unsigned int c)   //延時  定義
{
    unsigned char a,b;

        //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }

        }      
}
void delay (unsigned int c)
{
    unsigned int i,j;
          for(i=c;i>0;i--)
            for (j=110;j>0;j--);

}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一起操网站 | 天天干夜夜拍 | 午夜免费看视频 | 久久网日本| 欧美国产日韩一区二区三区 | 欧美成人综合 | 中文字幕国产在线 | 一区二区三区国产精品 | 在线观看中文字幕dvd播放 | 91久久国产综合久久 | 久久久国产精品视频 | 女女爱爱视频 | 在线日韩精品视频 | 中文字幕亚洲一区二区三区 | 亚洲精品中文字幕 | 国产特级毛片aaaaaa喷潮 | 国产三级一区二区 | 老牛影视av一区二区在线观看 | 午夜精品久久久久久 | 精品国产乱码久久久久久丨区2区 | 亚洲精品久久久久久宅男 | 国产视频一区二区三区四区五区 | 99视频免费 | 自拍偷拍亚洲视频 | 国产一区二区日韩 | 91精品久久久久久久久久入口 | 亚洲综合一区二区三区 | 亚洲精品免费观看 | 天天看天天摸天天操 | 国户精品久久久久久久久久久不卡 | 三级视频久久 | 久久神马 | 久久久久久亚洲 | 白浆在线| 国产成人精品一区二 | 国产欧美日韩综合精品一区二区 | 久久99国产精一区二区三区 | www.99精品 | 一本一道久久a久久精品综合 | 中文字幕在线精品 | 九色在线观看 |