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

📄 14-1.lst

📁 《单片机C语言编程与实例的代码.rar
💻 LST
字号:
C51 COMPILER V6.20c  14_1                                                                  09/02/2001 15:12:55 PAGE 1   


C51 COMPILER V6.20c, COMPILATION OF MODULE 14_1
OBJECT MODULE PLACED IN 14-1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 14-1.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg51.H>
   2          #include <absacc.H>
   3          #include <stdio.h>
   4          
   5          #define LCD_COMMAND 0x9000
   6          #define LCD_DATA_R  0x9C00
   7          #define LCD_DATA_W  0x9400
   8          #define DA_ADDRESS  0xC000
   9          #define AD_ADDRESS  0xA000
  10          /*-------------------------LCD  驱动部分函数声明----------------------------*/
  11          void DelayL();
  12          void DelayS();
  13          void WriteCommand(unsigned char c);
  14          void WriteData(unsigned char c);
  15          unsigned char ReadData();
  16          void ShowChar(unsigned char pos,unsigned char c);
  17          void ShowString(unsigned char line,char *ptr);
  18          void InitLcd();
  19          void InitInterupt();
  20          /*----------------------------全局变量--------------------------------------*/
  21          static unsigned char flag1;        			//启动功能标志
  22          static unsigned char flag2;        			//功能号标志
  23          static unsigned int  address;      			//RAM地址
  24          static unsigned char chip;         			//RAM片选
  25          static unsigned char intflag;      				//中断标志
  26          static unsigned int  count;        			//串行数据计数
  27          
  28          void main (void) {
  29   1      char code str1[] =" Designed by HGR                ";
  30   1      char code str2[] ="   2002-8-26                    ";      
  31   1      char code Menu[] ="    Menu Item   ";
  32   1      char code Item[] ="1 Sample voice  2  Play sound   3 Download data 4  Upload data  ";    
  33   1      char data str3[] ="                ";
  34   1        unsigned char i,j;
  35   1           
  36   1           SP=0x50;							//堆栈指针
  37   1           DelayL();
  38   1      	 InitLcd();            				//初始化LCD
  39   1      	 DelayL();
  40   1           ShowString(0,str1);   				//显示启动屏幕
  41   1      	 ShowString(1,str2);
  42   1      	 DelayL();
  43   1           DelayL();
  44   1      	 DelayL();
  45   1      	 DelayL();
  46   1           for(i=0;i<17;i++)     				//字幕滚动
  47   1      	 {
  48   2      	   ShowString(0,str1+i);
  49   2      	   ShowString(1,str2+i);
  50   2      	   for(j=0;j<120;j++)
  51   2       	     DelayS();
  52   2      	 }
  53   1           InitInterupt();        				//初始化中断设置
  54   1      
  55   1      	 flag1=0;               				//功能启动标志置0
C51 COMPILER V6.20c  14_1                                                                  09/02/2001 15:12:55 PAGE 2   

  56   1      	 flag2=0;               				//功能号置0
  57   1      	 chip=0;                				//RAM片选置0
  58   1      	 address=0;             				//RAM地址置0
  59   1      	 intflag=0;             				//中断标志置0
  60   1           count  =0;             				//下载计数置0
  61   1      	 P1=chip;               				//写RAM片选
  62   1      enter:
  63   1           if(flag1==0)           				//未启动任何功能
  64   1           {
  65   2      	   ShowString(0,Menu);          		//第一行显示Menu头
  66   2      	   ShowString(1,Item+flag2*16); 		//第二行显示功能项
  67   2      	 }
  68   1           else                   				//已经启动功能
  69   1      	 {
  70   2      	   ShowString(0,Item+flag2*16); 		//第一行显示功能项
  71   2             switch(flag2)                		//第二行显示对应操作界面
  72   2             {
  73   3              case 0:							//功能0,显示正在采样
  74   3                sprintf(str3,"Now sampling..  ");
  75   3      		  break;
  76   3      	    case 1:
  77   3      		  sprintf(str3,"Now playing..   ");	//功能1,显示正在播放
  78   3      		  break; 
  79   3              case 2:							//功能2,显示下载计数
  80   3                sprintf(str3,"down %d bytes   ",count);
  81   3                break;
  82   3              case 3:							//功能3,上传RAM数据
  83   3                while(1)
  84   3                {
  85   4                SBUF=XBYTE[address++];			//读取RAM数据发送,地址自加
  86   4                while(!TI);
  87   4                TI=0;
  88   4                count++;
  89   4        		  if(address==0x8000)				//到了RAM片内最大地址
  90   4      		  {
  91   5            		address=0;					//片内地址复0
  92   5                  chip=chip+1;					//片选加1
  93   5      		    P1=chip;					//选通RAM
  94   5      		    if(chip==32)				//到达RAM最大容量
  95   5                  {
  96   6                    chip=0;					//片选复0
  97   6                    flag1=0;     				//功能关闭
  98   6                    goto enter;					//返回显示上级菜单
  99   6                  }
 100   5      		  }  
 101   4                sprintf(str3,"up %d bytes     ",count);
 102   4                }
 103   3                break;
 104   3              default:
 105   3                break;
 106   3      	   }
 107   2      	   ShowString(1,str3);
 108   2      	 }
 109   1      	 while(!intflag);						//等待中断触发
 110   1      	 intflag=0;							//中断标志复0
 111   1      	 goto enter;						//返回修改菜单显示
 112   1      }
 113          
 114          /*-----------------------------中断处理-------------------------------------*/
 115          Int0_process() interrupt 0 using 0				//外部中断0,对应1键
 116          {
 117   1        EA=0;
C51 COMPILER V6.20c  14_1                                                                  09/02/2001 15:12:55 PAGE 3   

 118   1        DelayL();
 119   1      
 120   1        if(flag1==0)           					//若功能未启动,则功能号加1
 121   1        {
 122   2           flag2++;
 123   2      	 flag2=flag2%4;						//达到最大,则功能号复0
 124   2        }
 125   1        else                   				//功能已启动则该键为关闭功能
 126   1        {
 127   2           flag1=0;
 128   2           TR0=0;							//关闭定时、复位RAM地址
 129   2      	 chip=0;
 130   2      	 address=0;
 131   2      	 count=0;     
 132   2        }
 133   1        
 134   1        EA=1;
 135   1        intflag=1;
 136   1      }
 137          
 138          Int1_process() interrupt 2 using 0				//外部中断1,对应2键
 139          {
 140   1        char code blank[]="                ";
 141   1        EA=0;
 142   1        DelayL();
 143   1      
 144   1        if(flag1==0)							//若功能未启动,则2键启动该功能
 145   1        {
 146   2          flag1=1;
 147   2          ShowString(1,blank);
 148   2          if(flag2==0||flag2==1)					//功能号为0、1,则开启定时
 149   2            TR0=1;
 150   2        }
 151   1      
 152   1        EA=1;
 153   1        intflag=1;
 154   1      }
 155          
 156          Timer0_process() interrupt 1 using 0			//定时中断,开启功能0、1时启动
 157          {
 158   1        unsigned char c;
 159   1        EA=0;
 160   1        TR0=0;								//先关闭定时
 161   1        TL0=0x80;							//重新设置定时参数
 162   1        TH0=0xFB;  
 163   1      
 164   1        if(flag2==0)							//如果为功能0,则采样存入RAM
 165   1        {
 166   2          XBYTE[AD_ADDRESS]=0;				//启动AD转换
 167   2          while(P1&0x80);						//等待转换完成
 168   2          c=XBYTE[AD_ADDRESS];				//读取采样数据
 169   2          XBYTE[address++]=c;					//存入RAM
 170   2        }
 171   1        else								//否则为播放声音
 172   1        {
 173   2          c=XBYTE[address++];					//读取RAM数据
 174   2          XBYTE[DA_ADDRESS]=c;				//写DA
 175   2        }
 176   1      
 177   1        if(address==0x8000)						//RAM地址处理
 178   1        {
 179   2          address=0;
C51 COMPILER V6.20c  14_1                                                                  09/02/2001 15:12:55 PAGE 4   

 180   2          chip=chip+1;
 181   2          P1=chip;
 182   2        }  
 183   1        if(chip==32)							//若到达RAM最大地址,则结束功能
 184   1        {
 185   2           chip=0;
 186   2           flag1=0;
 187   2        }
 188   1        else 								//否则,重新开始定时
 189   1           TR0=1;
 190   1      
 191   1        EA=1;
 192   1        intflag=1;
 193   1      }
 194          
 195          Rs232() interrupt 4 using 0					//串行接受中断
 196          {
 197   1       unsigned char c;  
 198   1       EA=0;
 199   1       c=SBUF;
 200   1       RI=0;
 201   1      
 202   1       if(flag1==1)           					//若功能已经开启
 203   1       {
 204   2         if(flag2==2)							//若功能号为2(下载)
 205   2         {
 206   3           XBYTE[address++]=c;				//写入RAM
 207   3           count++;							//计数加1
 208   3         }    
 209   2         if(address==0x8000)					//RAM地址处理
 210   2         {
 211   3           chip=chip+1;
 212   3           address=0;
 213   3           P1=chip;
 214   3           if(chip==32)
 215   3           {
 216   4             chip=0;
 217   4             flag1=0;
 218   4           }
 219   3         }  
 220   2       }
 221   1       EA=1;
 222   1       intflag=1;
 223   1      }
 224          
 225          void InitInterupt()
 226          {
 227   1        TMOD=0x21;       					//初始化串口和定时器设置
 228   1        TL1=0xFD;							
 229   1        TH1=0xFD;
 230   1        EA=1;    
 231   1        ES=1;
 232   1        PCON=0;    
 233   1        TR1=1;
 234   1        SCON=0x50;
 235   1      
 236   1        EX0=1;           					//外部中断0初始化
 237   1        IT0=1;
 238   1        EX1=1;           					//外部中断0初始化
 239   1        IT1=1;
 240   1      
 241   1        TL0=0x80;        					//定时125us
C51 COMPILER V6.20c  14_1                                                                  09/02/2001 15:12:55 PAGE 5   

 242   1        TH0=0xFB;  
 243   1      
 244   1        ET0=1;
 245   1      }
 246          
 247          /*--------------------------------LCD驱动部分----------------------------*/
 248          void DelayL()          			        
 249          {unsigned char i,j;
 250   1       i=0xA0;
 251   1       j=0xFF;
 252   1       while(i--)
 253   1        while(j--);
 254   1      }
 255          
 256          void DelayS()         					
 257          {unsigned char i;
 258   1       i=0x1F;
 259   1       while(i--);
 260   1      }
 261          
 262          void WriteCommand(unsigned char c)      
 263          {
 264   1       DelayS();
 265   1       XBYTE[LCD_COMMAND]=c;  
 266   1      }
 267          
 268          void WriteData(unsigned char c)         
 269          {
 270   1        DelayS();
 271   1        XBYTE[LCD_DATA_W]=c;  
 272   1      }
 273          
 274          void ShowChar(unsigned char pos,unsigned char c)
 275          {
 276   1       unsigned char p;
 277   1       if(pos>=0x10)
 278   1          p=pos+0xB0;
 279   1       else
 280   1          p=pos+0x80;
 281   1       WriteCommand(p);
 282   1       WriteData(c);
 283   1      }
 284          
 285          void ShowString(unsigned char line,char *ptr)
 286          {
 287   1       unsigned char l,i;
 288   1       l=line<<4;
 289   1       for(i=0;i<16;i++)
 290   1         ShowChar(l++,*(ptr+i));
 291   1      }     
 292          
 293          void InitLcd()
 294          {
 295   1       DelayL();
 296   1       WriteCommand(0x38);
 297   1       WriteCommand(0x38);
 298   1       WriteCommand(0x06);
 299   1       WriteCommand(0x0C);
 300   1       WriteCommand(0x01);
 301   1       WriteCommand(0x80);
 302   1      }     
 303          
C51 COMPILER V6.20c  14_1                                                                  09/02/2001 15:12:55 PAGE 6   

 304          unsigned char ReadData()				 
 305          {
 306   1       unsigned char i;
 307   1       DelayS();     
 308   1       P0=0xFF;
 309   1       i=XBYTE[LCD_DATA_R];
 310   1       return i;
 311   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    938    ----
   CONSTANT SIZE    =    250    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8      24
   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 + -