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

📄 pwm.lst

📁 利用VHDL语言实现FPGA的PWM输出波形
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   PWM                                                                   11/20/2007 10:10:04 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE PWM
OBJECT MODULE PLACED IN pwm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE pwm.c BROWSE DEBUG OBJECTEXTEND TABS(8)

stmt level    source

   1          #include <reg52.h>
   2          #include <intrins.h>//包含_nop()函数
   3          
   4          
   5          
   6          #define uchar unsigned char
   7          #define uint  unsigned int
   8          
   9          sbit Dat=P1^0;  //595数据输入端
  10          sbit Sclk=P1^2; //595上升沿输出端
  11          sbit Lclk=P1^1;//595存储寄存器输入
  12          
  13          sbit output=P3^5;
  14          sfr P3M0=0xb1;//STC单片机强上拉推挽模式,在此模式下,系统自动设置为强上拉
  15          sfr P3M1=0Xb2;
  16          /*SFR0xb0为特殊功能寄存器的P3口地址,0xb1,0xb2为功能设置位*/
  17          
  18          uchar code BitTab[4]={0x0e,0x0d,0x0b,0x07};//数码管位选择(00001110,00001101,00001011,00000111)
  19          uchar code DispTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  20                                0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};  //数码管字符显示
  21          
  22          uchar temp1=0;
  23          uchar temp2=0;
  24          uchar keyvalue;
  25          uchar scanf=0;
  26          uchar chuli=0;
  27          uchar keyci=0;
  28          uchar DispT1=0;
  29          uchar DispT2=0;
  30          uchar DispT3=0;
  31          uchar scanT=0x88;
  32          uchar ydc=0;
  33          uchar yfc=0;
  34          uchar yec=0;
  35          uchar shezhi=0;
  36          uchar shezhif;
  37          uchar timeflag;
  38          uchar time;
  39          uchar Aba=0;
  40          uchar Abb=0;
  41          uchar Bbb=8;
  42          uchar Cbb=1;
  43          uchar aim1=0;
  44          uchar aim2=0;
  45          uchar aim3=0;
  46          uchar ain1=0;
  47          uchar ain2=0;
  48          uchar ain3=0;
  49          uchar Hpl=0;
  50          uchar Lpl=0;
  51          uchar Hf=0;
  52          uchar Lf=0;
  53          uchar Hcishu=0;
  54          uchar Lcishu=0;
  55          uchar yhc=0;yic=0;yjc=0;ykc=0;ylc=0;ymc=0; //变量定义
C51 COMPILER V7.06   PWM                                                                   11/20/2007 10:10:04 PAGE 2   

  56          
  57          void SendData(uchar SendDat1,uchar SendDat2) //595发送数据
  58          {
  59   1        uchar i;
  60   1        uchar j;
  61   1        Lclk=0;//低电平时,数据更新
  62   1        for(i=0;i<8;i++)
  63   1        {
  64   2          Sclk=0;//低电平时,读数据
  65   2           for(j=8;j>0;j--);//短延时
  66   2         if((SendDat1&0x80)==0)
  67   2           Dat=0;
  68   2         else Dat=1;
  69   2         Sclk=1;//数据更新完成
  70   2          for(j=8;j>0;j--);
  71   2         SendDat1=SendDat1<<1;
  72   2        }
  73   1       
  74   1        for(i=0;i<8;i++)
  75   1        {
  76   2          Sclk=0;
  77   2          for(j=8;j>0;j--);
  78   2         if((SendDat2&0x80)==0)
  79   2           Dat=0;
  80   2         else Dat=1;
  81   2         Sclk=1;
  82   2          for(j=8;j>0;j--);
  83   2         SendDat2=SendDat2<<1;
  84   2         
  85   2         }
  86   1       Lclk=1;//上升沿数据发送
  87   1        
  88   1          for(j=8;j>0;j--);
  89   1           Lclk=0;
  90   1      }
  91          
  92          void Disp1()
  93          {
  94   1              if(temp1<50)
  95   1              {
  96   2                SendData(BitTab[keyci-1],DispT1);
  97   2              }
  98   1              if(temp1>=50)
  99   1              {
 100   2                SendData(0xff,0xc0);
 101   2              }
 102   1              if(temp1==100)
 103   1              {
 104   2                temp1=0;
 105   2              }//字符闪烁
 106   1              SendData(BitTab[keyci],DispT2);
 107   1              SendData(BitTab[keyci+1],DispT3);//修改后不闪烁位字符不变
 108   1      }
 109          void Disp2()
 110          {
 111   1              if(temp1<50)
 112   1              {
 113   2                SendData(BitTab[keyci-1],DispT2);
 114   2              }
 115   1              if(temp1>=50)
 116   1              {
 117   2                SendData(0xff,0xc0);
C51 COMPILER V7.06   PWM                                                                   11/20/2007 10:10:04 PAGE 3   

 118   2              }
 119   1              if(temp1==100)
 120   1              {
 121   2                temp1=0;
 122   2              }
 123   1              SendData(BitTab[keyci-2],DispT1);
 124   1              SendData(BitTab[keyci],DispT3);
 125   1      }
 126          void Disp3()
 127          {
 128   1              if(temp1<50)
 129   1              {
 130   2                SendData(BitTab[keyci-1],DispT3);
 131   2              }
 132   1              if(temp1>=50)
 133   1              {
 134   2                SendData(0xff,0xc0);
 135   2              }
 136   1              if(temp1==100)
 137   1              {
 138   2                temp1=0;
 139   2              }
 140   1              SendData(BitTab[keyci-3],DispT1);
 141   1              SendData(BitTab[keyci-2],DispT2);
 142   1      }
 143          void Disp4()
 144          {  
 145   1         if(timeflag==0)
 146   1         {
 147   2            SendData(BitTab[0],DispTab[Abb]);
 148   2            SendData(BitTab[1],DispTab[Bbb]);
 149   2            SendData(BitTab[2],DispTab[Cbb]);
 150   2         }//倒计时结束或者停止键按下后数码管显示当前值。
 151   1         if(timeflag==1)
 152   1         {
 153   2            SendData(BitTab[Aba],DispTab[Abb]);
 154   2            SendData(BitTab[Aba+1],DispTab[Bbb]);
 155   2            SendData(BitTab[Aba+2],DispTab[Cbb]);
 156   2            SendData(BitTab[Aba+3],0x88);
 157   2            if(time==200)//倒计时,5ms扫描一次,200次为一秒
 158   2            {
 159   3              time=0;//每1秒更新数据
 160   3              if(Abb==0)
 161   3              {
 162   4                  Abb=10;
 163   4                  if(Bbb==0)
 164   4                  {
 165   5                     Bbb=10;
 166   5                     Cbb=0;
 167   5                  }
 168   4                  Bbb--;
 169   4              }
 170   3              Abb--;
 171   3              if((Abb==0)&&(Bbb==0)&&(Cbb==0)) //数码管全为0后置停止标志位
 172   3              {
 173   4                  timeflag=0;
 174   4              }
 175   3           }
 176   2        }
 177   1      }
 178          void scan()
 179          {
C51 COMPILER V7.06   PWM                                                                   11/20/2007 10:10:04 PAGE 4   

 180   1          uchar key;
 181   1          if(shezhi!=0)//设置键按下后才可以扫描光标和+,-键
 182   1          {
 183   2          SendData(0x67,scanT); //矩阵键盘扫描方法,发第一行01100111,重要的是第四个0
 184   2          P1=P1|0x18;
 185   2          key=P1;
 186   2          key=key&0x18;//保护现场,读键值
 187   2          if(key!=0x18)
 188   2          {
 189   3              temp2++;
 190   3              if((temp2==50)&&(key!=0x18))//去键盘抖动
 191   3              {
 192   4                 temp2=0;
 193   4                 if(key==0x08)
 194   4                 {
 195   5                    chuli=1;
 196   5                    keyvalue=1;//光标键
 197   5                 }
 198   4                 if(key==0x10)
 199   4                 {
 200   5                    chuli=1;
 201   5                    keyvalue=2;//+键
 202   5                 }
 203   4              }
 204   3          }
 205   2          }
 206   1          SendData(0x57,scanT);//扫描第二行01010111,重要的是第三个0
 207   1          key=P1|0xe7;
 208   1          key=key&0x18;
 209   1          if(key!=0x18)
 210   1          {
 211   2              temp2++;
 212   2              if((temp2==50)&&(key!=0x18))
 213   2              {
 214   3                 temp2=0;
 215   3                 if(shezhi!=0)
 216   3                 {if(key==0x08)
 217   4                 {
 218   5                    chuli=1;
 219   5                    keyvalue=3;//-键
 220   5                 }
 221   4                 }
 222   3                 if(timeflag==0)
 223   3                 {
 224   4                    if(key==0x10)
 225   4                    {
 226   5                       chuli=1;
 227   5                       keyvalue=4;//设置键
 228   5                    }
 229   4                 }
 230   3             }
 231   2          }
 232   1          SendData(0x37,scanT);//扫描第三行00110111,重要的是第二个0
 233   1          key=P1|0xe7;
 234   1          key=key&0x18;
 235   1          if(key!=0x18)
 236   1          {
 237   2              temp2++;
 238   2              if((temp2==50)&&(key!=0x18))
 239   2              {
 240   3                 temp2=0;
 241   3                 if(key==0x08)
C51 COMPILER V7.06   PWM                                                                   11/20/2007 10:10:04 PAGE 5   

 242   3                 {
 243   4                    chuli=1;
 244   4                    keyvalue=5;//启动键
 245   4                 }
 246   3                 if(key==0x10)
 247   3                 {
 248   4                    chuli=1;
 249   4                    keyvalue=6;//停止键
 250   4                 }
 251   3              }
 252   2          }
 253   1      }
 254          
 255          void deal()//按键处理程序
 256          {
 257   1       if(keyvalue==1)//光标键处理
 258   1       { 
 259   2          keyci++;
 260   2          if(keyci==1)//第一位
 261   2          {
 262   3              if(shezhi==1)//高电平时间
 263   3              {
 264   4                  DispT1=DispTab[aim1];
 265   4                  DispT2=DispTab[aim2];
 266   4                  DispT3=DispTab[aim3];
 267   4                  Disp1();
 268   4              }
 269   3              if(shezhi==2)//低电平时间
 270   3              {
 271   4                  DispT1=DispTab[ain1];
 272   4                  DispT2=DispTab[ain2];
 273   4                  DispT3=DispTab[ain3];
 274   4                  Disp1();
 275   4              }
 276   3              if(shezhi==3)//倒计时时间
 277   3              {
 278   4                  DispT1=DispTab[Abb];
 279   4                  DispT2=DispTab[Bbb];
 280   4                  DispT3=DispTab[Cbb];
 281   4                  Disp1();
 282   4              }
 283   3          }
 284   2          if(keyci==2)//第二位
 285   2          {
 286   3             if(shezhi==1)
 287   3             {   
 288   4                DispT2=DispTab[aim2];
 289   4             }
 290   3             if(shezhi==2)
 291   3             {   
 292   4                DispT2=DispTab[ain2];
 293   4             } 
 294   3             if(shezhi==3)
 295   3             {   
 296   4                DispT2=DispTab[Bbb];
 297   4             }
 298   3             Disp2();
 299   3          }
 300   2          if(keyci==3)//第三位
 301   2          {
 302   3             if(shezhi==1)
 303   3             {   
C51 COMPILER V7.06   PWM                                                                   11/20/2007 10:10:04 PAGE 6   

 304   4                DispT3=DispTab[aim3];
 305   4             }
 306   3             if(shezhi==2)
 307   3             {   
 308   4                DispT3=DispTab[ain3];
 309   4             } 
 310   3             if(shezhi==3)
 311   3             {   
 312   4                DispT3=DispTab[Cbb];
 313   4             }
 314   3             Disp3();
 315   3          }
 316   2          if(keyci==4)
 317   2          {keyci=1;}
 318   2       }
 319   1       if(keyvalue==2)//+键处理程序
 320   1       {
 321   2          if(keyci==1)
 322   2          {  
 323   3             if(shezhi==1)
 324   3             {
 325   4                 yhc++;//按一次字符值+1
 326   4                 if(yhc==10)
 327   4                 {
 328   5                    yhc=0;
 329   5                 }
 330   4                 aim1=yhc;
 331   4                 DispT1=DispTab[yhc];
 332   4                 Disp1();
 333   4             }
 334   3             if(shezhi==2)
 335   3             {
 336   4                 yic++;

⌨️ 快捷键说明

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