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

📄 interrupt.lst

📁 电子开发网培训用的51单片机内部培训代码
💻 LST
字号:
C51 COMPILER V7.06   INTERRUPT                                                             05/14/2006 20:23:21 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE INTERRUPT
OBJECT MODULE PLACED IN interrupt.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE interrupt.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //****************************************************
   2          //实现功能:把键盘的输入码型在七段数码管上显示出来
   3          //目标板:
   4          //****************************************************
   5          #include <reg51.h>
   6          //*****************宏定义*****************************
   7          #define p_key P1//宏定义键盘接口是P1
   8          #define extint_num 2//int1
   9          #define reg_group 0//中断使用的是第0组寄存器
  10          #define led_date P0//定义数码管的数据输出是P0
  11          #define choose_p P2//定义数码管的位选信号输出是P2
  12          //*****************全局变量***************************
  13          unsigned int display_num;//数码管要显示的数据,定义为全局变量
  14          unsigned char key_int=0;//中断键盘子程序扫描到的键值
  15          //******************定义子函数************************
  16          unsigned char change(unsigned char i);//数码管显示码转换子程序
  17          void display(unsigned int num);//数码管显示子程序
  18          void delay_time(int i);//时间延时子程序
  19          unsigned char read_key(void);//键盘读键值子程序
  20          void extint_init(unsigned char int_num,unsigned char mode);//外部中断初始化子程序
  21          
  22          //*********************主函数*************************
  23          //描    述:把键盘输入的键盘码,用led显示出来
  24          //入口参数:无
  25          //返回参数:无
  26          //设计人:ycj
  27          //最后修改:时间(2006.5.1)修改人(ycj)
  28          //****************************************************
  29          int main(void)
  30          {
  31   1       extint_init(1,0);//外部中断1,方式0
  32   1       EA=1;                    //开中断
  33   1       while(1)
  34   1      {
  35   2       display((unsigned int)key_int);    //显示
  36   2      }
  37   1      }
  38          //**************************外部中断初始化函数*************************
  39          //描    述:对外部中断初始化
  40          //入口参数:unsigned char int_num(外部中断口,0=外部中断0,1=外部中断1)
  41          //         ,unsigned char mode(中断触发方式,0=低电平触发,1=边沿触发)
  42          //返回参数:无
  43          //设计人:ycj
  44          //最后修改:时间(2006.5.1)修改人(ycj)
  45          //*********************************************************************
  46          void extint_init(unsigned char int_num,unsigned char mode)
  47          {
  48   1       if (int_num==0)
  49   1           {
  50   2            TCON&=~3;//清int0的IE0,IT0
  51   2            TCON|=mode;//设定中断触发的模式
  52   2                EX0=1;
  53   2           }
  54   1       else if (int_num==1)
  55   1           {
C51 COMPILER V7.06   INTERRUPT                                                             05/14/2006 20:23:21 PAGE 2   

  56   2                TCON&=~12;//清int1的IE1,IT1
  57   2            TCON|=(mode<<3);//设定中断触发的模式
  58   2                EX1=1;
  59   2               }
  60   1      }
  61          
  62          
  63          //******************时间延迟函数**********************
  64          //描  述:用指令实现延时一段时间
  65          //入口参数:int i,为时间延迟参数
  66          //出口参数:无
  67          //设计人:ycj
  68          //最后修改:时间(2006.5.1)  修改人(ycj)
  69          //****************************************************
  70          void delay_time(int i)
  71          {
  72   1       while(i)
  73   1        i--;
  74   1      }
  75          
  76          //******************按键扫描函数**********************
  77          //描    述:对4*4键盘进行扫描,程序只适合4*4键盘使用,
  78          //              键盘占用一组完整的i/o口,在使用这个程序前
  79          //              要宏定义p_key为用户实际连接键盘的i/o口 
  80          //              #define p_key Pn;//(n=0、1、2、3)
  81          //入口参数:无
  82          //返回参数:若有检测到按键就返回按键的编号,否则返回0xff
  83          //设计人:ycj
  84          //最后修改:时间(2006.5.1)修改人(ycj)
  85          //****************************************************
  86          unsigned char read_key(void)
  87          {
  88   1       unsigned char j,key,key_buf=0;
  89   1       p_key=0xff;
  90   1       //检测是否有建按下//
  91   1       p_key=0xf0;
  92   1       key=p_key;
  93   1       if(key==0xf0)
  94   1          {
  95   2               return(0xff);//没按键按下,返回0xff
  96   2              }
  97   1       //有按下,延时去抖//
  98   1       delay_time(5000);
  99   1       //确认是否有建按下//
 100   1       p_key=0xf0;
 101   1       key=p_key;
 102   1       if(key==0xf0)
 103   1          {
 104   2               return(0xff);//没按键按下,返回0xff
 105   2              }
 106   1       //真的有按键按下,扫描是哪一行有按键按下//
 107   1       for(j=0;j<4;j++)
 108   1       {key=p_key&(0x10<<j);
 109   2        if (key)
 110   2           {
 111   3                key=p_key;
 112   3               }
 113   2        else
 114   2           {
 115   3                key_buf=j*4;
 116   3                p_key=~(0x10<<j);//第j行的按键按下了,第j行输出0,其他的i/o口输出1
 117   3                //扫描是第j行的哪个按键按下//
C51 COMPILER V7.06   INTERRUPT                                                             05/14/2006 20:23:21 PAGE 3   

 118   3                for(j=0;j<4;j++)
 119   3                      {
 120   4                       key=p_key&(1<<j);
 121   4               if (key)
 122   4                      {
 123   5                               key=p_key;
 124   5                              }
 125   4                       else
 126   4                      {
 127   5                               key_buf+=j;
 128   5                               return(key_buf);//扫描到按键的确定位置,返回按键的编号
 129   5                              }
 130   4                      }
 131   3               }
 132   2       }
 133   1      //没扫描到按键,//
 134   1      return(0xff);
 135   1      }
 136          //***************七段数码管显示函数*******************
 137          //描    述:对四位的扫描型七段数码管进行扫描显示,在使用
 138          //          前要定义一个全局变量display_num
 139          //          unsigned int display_num;
 140          //入口参数:unsigned int num,要显示的数字(0-9999)
 141          //返回参数:无
 142          //设计人:ycj
 143          //最后修改:时间(2006.5.1)修改人(ycj)
 144          //****************************************************
 145          void display(unsigned int num)
 146          {
 147   1       if(num<10000)
 148   1              {
 149   2               display_num=num;
 150   2          }
 151   1               choose_p|=3;//先关显示
 152   1               led_date=change(display_num/1000);//得到千位的数字,并转换成七段码型
 153   1               choose_p&=0xfe;//选通千位
 154   1               delay_time(50);//延时一段时间
 155   1           choose_p|=1;//关显示
 156   1           display_num=display_num%1000;
 157   1           led_date=change(display_num/100);//得到百位的数字,并转换成七段码型
 158   1               choose_p&=0xfd;//选通百位
 159   1               delay_time(50);//延时一段时间
 160   1               choose_p|=2;//关显示
 161   1               display_num=display_num%100;
 162   1           led_date=change(display_num/10);//得到十位的数字,并转换成七段码型
 163   1               choose_p&=0xfb;//选通十位
 164   1               delay_time(50);//延时一段时间
 165   1               choose_p|=4;//关显示
 166   1               led_date=change(display_num%10);//得到个位的数字,并转换成七段码型
 167   1               choose_p&=0xf7;//选通十位
 168   1               delay_time(50);//延时一段时间
 169   1               choose_p|=8;//关显示
 170   1      }
 171          //****************数字-码型转换函数*******************
 172          //描    述:把数字转换成七段码型,此程序仅配合共阳的七
 173          //          段数码管使用
 174          //入口参数:unsigned char i,要转换的数字(0-9),
 175          //返回参数:转换后的七段码型,0xff表示转换失败
 176          //设计人:ycj
 177          //最后修改:时间(2006.5.1)修改人(ycj)
 178          //****************************************************
 179          
C51 COMPILER V7.06   INTERRUPT                                                             05/14/2006 20:23:21 PAGE 4   

 180          unsigned char change(unsigned char i)
 181           {
 182   1        switch(i)
 183   1              {
 184   2               case 0:
 185   2                     return(0xc0);//0的七段码型
 186   2               case 1:
 187   2                     return(0xf9);//1的七段码型
 188   2               case 2:
 189   2                     return(0xa4);//2的七段码型
 190   2               case 3:
 191   2                     return(0xb0);//3的七段码型
 192   2               case 4:
 193   2                     return(0x99);//4的七段码型
 194   2               case 5:
 195   2                     return(0x92);//5的七段码型
 196   2               case 6:
 197   2                     return(0x82);//6的七段码型
 198   2               case 7:
 199   2                     return(0xf8);//7的七段码型
 200   2               case 8:
 201   2                     return(0x80);//8的七段码型
 202   2               case 9:
 203   2                     return(0x90);//9的七段码型
 204   2           default:
 205   2                     return(0xff);//转换失败
 206   2              }
 207   1       }
 208          //****************外部中断1处理函数*******************
 209          //描    述:外部中断1处理子程序
 210          //入口参数:无
 211          //返回参数:无
 212          //注意:无
 213          //设计人:ycj
 214          //最后修改:时间(2006.5.1)修改人(ycj)
 215          //****************************************************
 216          void int1_isr()  interrupt extint_num using reg_group
 217          {unsigned char i;
 218   1      i=read_key();
 219   1      if(i<16)
 220   1      key_int=i;
 221   1      //等待中断0的输入脚恢复到高电平
 222   1      while(1)
 223   1      if (P3&8)
 224   1         break;
 225   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    413    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3    ----
   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 + -