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

📄 main.lst

📁 使用芯片AT89S52,6位七段数码管显示以及串口通讯
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.07   MAIN                                                                  09/26/2008 11:05:59 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //*******************************************************************
   2          #include"at89x52.h"
   3          #include<intrins.h>
   4          #include<math.h>  
   5          bit FLAG0=0;    /*设定位标号FLAG0=1键盘扫描回应*/
   6          bit FLAG1=1;    /*设定位标号20H.1比较密码回应旗号*/
   7          char m,ptr=0,ptr1=0;   /*PTR键盘扫描指标,ptr1显示器扫描指标*/
   8          char a1=0,b1=100,stand=0,m=0; /*宣告变数a1为TIMER0的中断次数,ptr为TIMER1扫描数码管指标*/
   9          char disple[10];    /*显示值存放阵列*/ 
  10          unsigned char bufuart[8];                /*串口接收值存放阵列*/
  11          unsigned char tem[8];
  12          unsigned char bufdata[9];
  13          unsigned char num=0;
  14          unsigned char key_sym;
  15          unsigned char i=0;
  16          unsigned char crc;
  17          unsigned char sym;
  18          unsigned char tim;
  19          static const char tab[16]={0x01,0x02,0x03,0x0c, /*键盘码00,01,02,03,*/
  20                                     0x04,0x05,0x06,0x0d, /*键盘码04,05,06,07,*/
  21                                     0x07,0x08,0x09,0x0e, /*键盘码08,09,0a,0b,*/
  22                                     0x0a,0x00,0x0b,0x0f};/*键盘码0c,0d,0e,0f*/
  23          void delay (unsigned int value)  /*延时副程式*/
  24           {
  25   1            while (value!=0) value--;  /*10US延时*/
  26   1       }
  27          void scan(void);   /*键盘扫描副程式*/
  28          void clear(void);
  29          void angle(void);
  30          void speed(void);
  31          void tserial(void);
  32          void xch(void);
  33          /*********************************************************************/
  34          main()     /*主程式*/
  35          {
  36   1       TMOD=0x01;   
  37   1       TH0=(65536-3000)/256;  
  38   1       TL0=(65536-3000)%256;  
  39   1       TR0=1;    
  40   1       T2CON=0x38;   
  41   1       TL2=0xfd;   
  42   1       TH2=0xff;   /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
  43   1       RCAP2L=0xdc;   /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
  44   1       RCAP2H=0xff;   /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
  45   1       TH2=256-(28800/9600);  /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
  46   1           /*|波特率9600时|SMOD=0|C/T=0|模式=2|自动载入TH1=FD|*/  
  47   1           /*|波特率4800时|SMOD=0|C/T=0|模式=2|自动载入TH1=FA|*/
  48   1           /*|波特率2400时|SMOD=0|C/T=0|模式=2|自动载入TH1=F4|*/
  49   1           /*|波特率1200时|SMOD=0|C/T=0|模式=2|自动载入TH1=E8|*/
  50   1              TR2=1;    /*启动TEMER2*/
  51   1       SCON=0x50;   /*设定UART工作在MODE3模式,可传送和接收数据 REN=1*/
  52   1           /*串列控制寄存器SCON_______________________*/
  53   1                  /*|  7    6    5    4 |  3    2    1    0 |*/
  54   1                  /*| SM0| SM1| SM2| REN| TB8| RB8| TI | RI |*/
  55   1                  /*|___________________|___________________|*/
C51 COMPILER V7.07   MAIN                                                                  09/26/2008 11:05:59 PAGE 2   

  56   1              IE=0x9f;   /*8是允许中断,a是TIMER0,TIMER1中断致能位*/
  57   1           /*|  7    6    5    4 |  3    2    1    0 |*/
  58   1                  /*| EA |    | ET2| ES | ET1| EX1| ET0| EX0|*/
  59   1                  /*|___________________|___________________|*/
  60   1              IP=0x10;   /*中断优先级寄存器IP_______________________*/
  61   1                  /*|    |    | PT2| PS | PT1| PX1| PT0| PX0|*/
  62   1                  /*|___________________|___________________|*/
  63   1      
  64   1             P2_0=1;    /*关喇叭灭指示灯*/
  65   1             key_sym=3;
  66   1        while(1)
  67   1       {
  68   2          scan();  
  69   2          if(tim>160)// 480ms
  70   2          {
  71   3                  tim=0;
  72   3              if(key_sym==1) angle();
  73   3              else if(key_sym==2) angle();
  74   3              else if(key_sym==3) speed();
  75   3          }
  76   2      
  77   2        if(FLAG0==1) /*判断有按键输入否?111111111111*/
  78   2       {
  79   3          switch(tab[ptr])  
  80   3        {
  81   4           case 0x00:
  82   4               case 0x01:
  83   4           case 0x02:
  84   4               case 0x03:
  85   4               case 0x04:
  86   4           case 0x05:
  87   4               case 0x06:
  88   4               case 0x07:
  89   4           case 0x08:
  90   4               case 0x09:
  91   4                    if(sym==1)
  92   4               {
  93   5                        xch();
  94   5                num++;
  95   5                       }
  96   4               break;
  97   4           case 0x0d: 
  98   4               key_sym=1;
  99   4               //angle();
 100   4               break;  
 101   4           case 0x0e:  
 102   4               key_sym=2;
 103   4               //angle();
 104   4                       break;  
 105   4           case 0x0f: 
 106   4               key_sym=3;   
 107   4               //speed();
 108   4                       break; 
 109   4           case 0x0a: 
 110   4               sym=1;
 111   4               num=0;
 112   4               clear();
 113   4               break;        
 114   4           case 0x0b: 
 115   4               if(sym==1)         
 116   4               {
 117   5                       sym=0; 
C51 COMPILER V7.07   MAIN                                                                  09/26/2008 11:05:59 PAGE 3   

 118   5                       tserial();     
 119   5                       }                                        
 120   4                       break; 
 121   4               default: 
 122   4               break;
 123   4         }    
 124   3        delay(100);   
 125   3        while(m==P1);  
 126   3        delay(100);
 127   3       }/*判断有按键输入否?111111111111*/
 128   2       
 129   2       delay(300);
 130   2      }//while(1)
 131   1      
 132   1      }
 133          
 134          
 135          /*--------------------------------------*/
 136          void scan(void)    /*扫描键盘副程式*/
 137           {
 138   1       char a1=0xf7,i;   /*A1=0XF7列扫描初值,I行*/
 139   1              FLAG0=0;   /*设按键回应旗号为0,键盘扫描计数指标为0*/
 140   1              ptr=0;
 141   1              for(i=0;i<4;i++)  /*键盘4个扫描列*/
 142   1            {
 143   2                     P1=a1;   /*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
 144   2                      m=P1;
 145   2                      switch(m&0xf0)  /*取行的高4位元,侦测那一行被按*/
 146   2                  {
 147   3                   case 0x70: ptr=i*4; /*第一行被按否?是则扫描指标=列X4*/
 148   3                                 FLAG0=1; /*是则设FLAG0=1表有按键输入*/
 149   3                                 break; /*跳出此循环*/
 150   3                      case 0xb0: ptr=i*4+1; /*第二行被按否?是则扫描指标=列X4+1*/
 151   3                                 FLAG0=1; /*是则设FLAG0=1表有按键输入*/
 152   3                                 break; /*跳出此循环*/ 
 153   3                      case 0xd0: ptr=i*4+2; /*第三行被按否?是则扫描指标=列X4+2*/
 154   3                                 FLAG0=1; /*是则设FLAG0=1表有按键输入*/
 155   3                                 break; /*跳出此循环*/
 156   3                      case 0xe0: ptr=i*4+3; /*第四行被按否?是则扫描指标=列X4+3*/
 157   3                                 FLAG0=1; /*是则设FLAG0=1表有按键输入*/
 158   3                       default:  break; /*跳出此循环*/
 159   3                  }
 160   2               if(FLAG0==1)break;  /*不为1,则扫描列右移,扫描下一列*/
 161   2               a1=a1>>1|0x80;   /*高位补1,由于P1.7~P1.4未接+5V,而是由指令加载高电平*/
 162   2             }
 163   1       }     /*返回主程式*/
 164          
 165          /****************************************************/
 166          void clear(void)                
 167           {
 168   1           char c;            
 169   1           for(c=0;c<6;c++)           
 170   1           {
 171   2              disple[c]=0x00;
 172   2           }                          
 173   1       }
 174          
 175          
 176          void xch(void)                          /*显示向右移动副程式*/
 177           {
 178   1           char c;                            /*宣告变数*/
 179   1           for(c=5;c>0;c--)
C51 COMPILER V7.07   MAIN                                                                  09/26/2008 11:05:59 PAGE 4   

 180   1           {
 181   2              disple[c]=disple[c-1];          /*将显示器disple[]移位交换,disple[3]->disple[4]->disple[5]...*/
 182   2           }
 183   1           disple[0]=tab[ptr];                /*新的按键值存入disple[0]*/
 184   1       }                                      /*返回主程式*/
 185          /****************************************************/
 186          
 187          void angle(void)
 188          {

⌨️ 快捷键说明

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