⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 musinstru.lst

📁 利用单片机实现简单音乐发生器
💻 LST
字号:
C51 COMPILER V7.02b   MUSINSTRU                                                            09/18/2005 14:22:19 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE MUSINSTRU
OBJECT MODULE PLACED IN MusInstru.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE MusInstru.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*****************************************/
   2          /* Copyright (c) 2005, 通信工程学院      */
   3          /* All rights reserved.                  */
   4          /* 作    者:戴 佳                                               */
   5          /*****************************************/
   6          
   7          #include "MusInstru.h"
   8          
   9          /* 键消抖延时函数 */
  10          void delay(void)
  11          {
  12   1              uchar i;
  13   1              for (i=300;i>0;i--);
  14   1      }
  15          
  16          /* 键扫描函数 */
  17          uchar getkey(void)
  18          {
  19   1              uchar scancode,tmpcode;
  20   1      
  21   1              if ((P1&0xf0)==0xf0)                    
  22   1                      return(0);
  23   1      
  24   1              scancode = 0xfe;
  25   1              while((scancode&0x10)!=0)               // 逐行扫描
  26   1              {
  27   2                      P1 = scancode;                          // 输出行扫描码
  28   2                      if ((P1&0xf0)!=0xf0)            // 本行有键按下
  29   2                      {
  30   3                              tmpcode = (P1&0xf0)|0x0f;
  31   3      
  32   3                              /* 返回特征字节码,为1的位即对应于行和列 */
  33   3                              return((~scancode)+(~tmpcode));
  34   3                      }
  35   2                      else scancode = (scancode<<1)|0x01;             // 行扫描码左移一位
  36   2              }
  37   1      }
  38          
  39          /* 定时器0中断服务子程序 */
  40          void time0_int(void) interrupt 1 using 0
  41          {
  42   1              /* 设置计数初值 */
  43   1              TH0 = STH0;
  44   1              TL0 = STL0; 
  45   1              P20=~P20;                                                       // 反相,产生输出脉冲
  46   1      }
  47          
  48          /* 主程序 */
  49          void main()
  50          {
  51   1              uchar key,k;
  52   1      
  53   1              TMOD = 0x01;                                                    // T0,工作方式1
  54   1      
  55   1              ET0 = 1;
C51 COMPILER V7.02b   MUSINSTRU                                                            09/18/2005 14:22:19 PAGE 2   

  56   1              EA = 1;
  57   1      
  58   1              while(1)
  59   1          {
  60   2                      P1 = 0xf0;                                                              // 发全0行扫描码
  61   2                      if ((P1&0xf0)!=0xf0)                                    // 若有键按下
  62   2                      {
  63   3                              delay();                                                        // 延时去抖动
  64   3                              if ((P1&0xf0)!=0xf0)                            // 延时后再判断一次,去除抖动影响
  65   3                              {
  66   4                                      key = getkey();                                 // 调用键盘扫描函数
  67   4      
  68   4                                      // 根据获取的按键位置得到k值
  69   4                                      switch(key)
  70   4                                      {
  71   5                                      case 0x11:                                              // 1行1列
  72   5                                                      k = 0;
  73   5                                                      break;
  74   5                                              case 0x21:                                              // 1行2列
  75   5                                                      k = 1;
  76   5                                                      break;                  
  77   5                                              case 0x41:                                              // 1行3列
  78   5                                                      k = 2;
  79   5                                                      break;
  80   5                                      case 0x81:                                              // 1行4列
  81   5                                                      k = 3;
  82   5                                                      break;
  83   5                                              case 0x12:                                              // 2行1列
  84   5                                                      k = 4;
  85   5                                                      break;
  86   5                                              case 0x22:                                              // 2行2列
  87   5                                                      k = 5;
  88   5                                                      break;
  89   5                                              case 0x42:                                              // 2行3列
  90   5                                                      k = 6;
  91   5                                                      break;
  92   5                                              case 0x82:                                              // 2行4列
  93   5                                                      k = 7;
  94   5                                                      break;
  95   5                                              case 0x14:                                              // 3行1列
  96   5                                                      k = 8;
  97   5                                                      break;
  98   5                                              case 0x24:                                              // 3行2列
  99   5                                                      k = 9;
 100   5                                                      break;
 101   5                                              case 0x44:                                              // 3行3列
 102   5                                                      k = 10;
 103   5                                                      break;
 104   5                                              case 0x84:                                              // 3行4列
 105   5                                                      k = 11;
 106   5                                                      break;
 107   5                                              case 0x18:                                              // 3行4列
 108   5                                                      k = 12;
 109   5                                                      break;
 110   5                                              case 0x28:                                              // 3行4列
 111   5                                                      k = 13;
 112   5                                                      break;
 113   5                                              case 0x48:                                              // 3行4列
 114   5                                                      k = 14;
 115   5                                                      break;
 116   5                                              case 0x88:                                              // 3行4列
 117   5                                                      k = 15;
C51 COMPILER V7.02b   MUSINSTRU                                                            09/18/2005 14:22:19 PAGE 3   

 118   5                                                      break;
 119   5                                              default:        
 120   5                                                      break;
 121   5                                      }       
 122   4      
 123   4                                      P20 = ~P20;                                             // 反相
 124   4                      
 125   4                                      /* 根据所得的k值设定计数器1的计数初值 */
 126   4                          STH0 = tab[k]/256;
 127   4                          STL0 = tab[k]%256; 
 128   4      
 129   4                              TR0 = 1;                                                        // 开始计数 
 130   4      
 131   4                                      P1 = 0xf0;                                                      // 发全0行扫描码
 132   4                                      while ((P1&0xf0)!=0xf0)                         // 若没有松开按键
 133   4                                      {
 134   5                                              P1 = 0xf0;      
 135   5                                      }
 136   4      
 137   4                                      TR1 = 0;                                                        // 若按键松开,则停止计数,不产生脉冲输出
 138   4                              }
 139   3                      }
 140   2              }    
 141   1      }
 142          
 143            
 144          
 145          
 146            
 147          
 148          
 149          
 150          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    280    ----
   CONSTANT SIZE    =     32    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -