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

📄 keyint.lst

📁 利用单片制作信号发生器
💻 LST
字号:
C51 COMPILER V7.50   KEYINT                                                                08/15/2007 19:26:19 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE KEYINT
OBJECT MODULE PLACED IN KeyInt.OBJ
COMPILER INVOKED BY: D:\软件\单片机\keil c51\keil 软件\C51\BIN\C51.EXE KeyInt.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include "hardware.h"
   3          #include "LCD1602.h"
   4          
   5          extern bit      cur_signal;
   6          extern unsigned int data freq;
   7          
   8          /* 方波占空比 */
   9          extern unsigned char data time_high, time_low;
  10          
  11          /* 与方波频率相关 */
  12          extern unsigned char data rect_high_TH0;
  13          extern unsigned char data rect_high_TL0;
  14          extern unsigned char data rect_low_TH0;
  15          extern unsigned char data rect_low_TL0;
  16          
  17          /* 正弦频率相关 */
  18          extern unsigned char data sin_TH0;
  19          extern unsigned char data sin_TL0;
  20          
  21          /* 与幅度相关 */
  22          extern unsigned char data range_low, range_high;
  23          extern float data proportion; /* 幅度与DAC量程之比 */ 
  24          extern unsigned char data range_low_data; /* 幅值下界对应的DAC的数字量 */
  25          
  26          
  27          
  28          
  29          extern void mdelay(unsigned int msec);
  30          void enable_timer1()
  31          {
  32   1              TMOD = 0X10; /* 方式1, 定时器1 */ 
  33   1              ET1 = 1;
  34   1              PT1 = 1;
  35   1              EA = 1;
  36   1              TR1 = 1;
  37   1      }
  38          
  39          
  40          
  41          void key_scan_ISR() interrupt 3 using 0
  42          {
  43   1              unsigned int  count;
  44   1              unsigned char dec_bit;
  45   1              bit update_rect = 0x21;
  46   1              bit update_sin_freq = 0x22;
  47   1      
  48   1              KEYPORT = 0Xff;
  49   1              if (KEYPORT == 0xff) goto out;
  50   1              mdelay(10);
  51   1              if (KEYPORT == 0xff) goto out;
  52   1      
  53   1              if((KEYPORT & 0xf) != 0xf)
  54   1                      update_rect = update_sin_freq = 1;
  55   1              else
C51 COMPILER V7.50   KEYINT                                                                08/15/2007 19:26:19 PAGE 2   

  56   1                      update_rect = update_sin_freq = 0;
  57   1              
  58   1              if((KEYPORT & 0x8) == 0) {      //频率 千位调节
  59   2                      freq += 1000;
  60   2                      if (freq > 4000) freq -= 4000;
  61   2                      dec_bit = (freq / 1000)+0x30;
  62   2                      LCD_write_data(0, 0xa, dec_bit);
  63   2              } else if ((KEYPORT & 0x4) == 0) { //百位
  64   2                      freq += 100;
  65   2                      if ((freq % 1000) < 100) 
  66   2                              freq = freq - 1000;
  67   2                      dec_bit = ((freq / 100) % 10) + 0x30;
  68   2                      LCD_write_data(0, 0xb, dec_bit);
  69   2              } else if ((KEYPORT & 0x2) == 0) { //十位
  70   2                      freq += 10;
  71   2                      if ((freq % 100 )< 10)
  72   2                              freq = freq - 100;
  73   2                      dec_bit = ((freq / 10) % 10) + 0x30;
  74   2                      LCD_write_data(0, 0xc, dec_bit);
  75   2              } else if ( (KEYPORT & 0x1) == 0) { //个位
  76   2                      freq++;
  77   2                      if ((freq % 10) == 0) 
  78   2                              freq -= 10;
  79   2                      dec_bit = freq % 10 + 0x30;
  80   2                      LCD_write_data(0, 0xd, dec_bit);
  81   2              } 
  82   1      
  83   1              else if ( (KEYPORT & 0x20) == 0) { //方波占空比  和正弦幅度设置
  84   2                      if (cur_signal == SIG_RECT) { //若当前为方波,调节占空比
  85   3                              time_high++;
  86   3                              if (time_high > 9) 
  87   3                                      time_high = 1;
  88   3                              LCD_write_data(0, 4, time_high + 0x30);
  89   3                              LCD_write_data(0, 5, 'H');
  90   3                              update_rect = 1;
  91   3                      } else { // 若为正弦, 则调节幅度
  92   3                              range_high += 10;
  93   3                              if (range_high <= range_low )
  94   3                                      range_high = range_low + 10;
  95   3                              proportion = (float)(range_high - range_low) / 0xff;
  96   3                              ///////////////////////////////out put
  97   3                      
  98   3                              dec_bit = range_high / 50 + 0x30;//将256个阶分为25份,每份10, 对于Vref为5V的情况,10近似地代表0.2V 
  99   3                                                                                              //50近似代表1V, 所以这里的dec_bit表示幅度的整数部分
 100   3                              LCD_write_data(0, 6, dec_bit);
 101   3                              dec_bit = (range_high / 5) % 10 + 0x30;// range_low /5 表示0。1V的个数, %10 取个位数
 102   3                              LCD_write_data(0, 8, dec_bit);
 103   3                      }
 104   2              } else if (((KEYPORT & 0x10) == 0)) {
 105   2                      if (cur_signal == SIG_RECT) {
 106   3                              time_low++;
 107   3                              if (time_low > 9)
 108   3                                      time_low = 1;
 109   3                              LCD_write_data(0, 6, time_low + 0x30);
 110   3                              LCD_write_data(0, 7, 'L');
 111   3                              update_rect = 1;
 112   3                      } else {
 113   3                              range_low += 10;
 114   3                              if (range_low >= range_high)
 115   3                                      range_low = 0;
 116   3                              proportion = (float)(range_high - range_low) / 0xff;
 117   3                              //range_low_data = range_low / ((float)Vref / 256);
C51 COMPILER V7.50   KEYINT                                                                08/15/2007 19:26:19 PAGE 3   

 118   3                              dec_bit = range_low / 50 + 0x30;//将256个阶分为25份,每份10, 对于Vref为5V的情况,10近似地代表0.2V 
 119   3                                                                                              //50近似代表1V, 所以这里的dec_bit表示幅度的整数部分
 120   3                              LCD_write_data(0, 2, dec_bit);
 121   3                              dec_bit = (range_low / 5) % 10 + 0x30;// range_low /5 表示0。1V的个数, %10 取个位数
 122   3                              LCD_write_data(0, 4, dec_bit);
 123   3                      }
 124   2              }
 125   1              else if ((KEYPORT & 0x40) == 0) {       
 126   2                      cur_signal = SIG_RECT;
 127   2              } else if ((KEYPORT & 0x80) == 0) {
 128   2                      cur_signal = SIG_SIN;
 129   2                      
 130   2              }
 131   1              if (update_rect) {
 132   2                      count = (HZ * time_high) / (freq * 12 * (time_high + time_low)) * 1000000;
 133   2                      rect_high_TL0 = (unsigned char) count; 
 134   2                      rect_high_TH0 = count >> 8;
 135   2                      
 136   2                      count = (HZ * time_low) / (freq * 12 * (time_high + time_low)) * 1000000;
 137   2                      rect_low_TL0 = (unsigned char) count; 
 138   2                      rect_low_TH0 = count >> 8;
 139   2              }
 140   1              if (update_sin_freq) {
 141   2                      count = (HZ / (12 * 256 * freq)) * 1000000;
 142   2      
 143   2                      sin_TL0 = (unsigned char) count;
 144   2                      sin_TH0 = count >> 8;
 145   2              }
 146   1              while(KEYPORT != 0xff);//等待按键松开
 147   1      out:
 148   1              TH1 = 0x3c;
 149   1              TL1 = 0xb0;
 150   1              return ;
 151   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    911    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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