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

📄 main.lst

📁 ADC Demo Source for LPC214X. 这是214X的ADC的应用例程
💻 LST
📖 第 1 页 / 共 5 页
字号:
ARM COMPILER V2.42,  main                                                                  19/01/06  08:10:09  PAGE 1   


ARM COMPILER V2.42, COMPILATION OF MODULE main
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe main.c THUMB OPTIMIZE(7,SPEED) BROWSE DEBUG TABS(4) 

stmt  level    source

    1          /*--------------------------------------------------------
    2                      ARTX水鸟LPC2131板实验笔记
    3          HotPower@126.com       2006.1.15  03:18 于西安大雁塔村队部
    4          ---------------------------------------------------------*/
    5          #include <ARTX.h>
    6          #include <LPC213x.H>    // Philips Peripheral Registers
    7          #include <LPC213xDEF.H> //ARM菜鸟HotPower创建定义文件(新版)
    8          #include <main.h>
    9          #include <string.h>
   10          #include <stdio.h>
   11          
   12          #pragma NOINIT
   13          
   14          #define LcdSSP //LCD硬件用SSP接口
   15          
   16          
   17          volatile unsigned int SystemRamTest;
   18          
   19          LcdData LcdBuffers;
   20          
   21          OS_TID Main_Task, Key_Task, Led_Task, Lednum_Task, Beep_Task, Lcd_Task, Adc_Task;
   22          
   23          void MainTask (void) __task;
   24          void KeyTask (void) __task;
   25          void LedTask (void) __task;
   26          void LednumTask (void) __task;
   27          void BeepTask (void) __task;
   28          void LcdTask (void) __task;
   29          void AdcTask (void) __task;
   30          
   31          void SystemInit(void);
   32          void KeyInit(void);
   33          void LcdInit(void);
   34          void LedInit(void);
   35          void LednumInit(void);
   36          void BeepInit(void);
   37          void AdcInit(void);
   38          
   39          
   40          
   41          void MSPI_Init(void);
   42          unsigned char MSPI_SendData(unsigned char);
   43          void LedDisplay(unsigned char);
   44          void  SSP_Init(void);
   45          uint8  SSP_SendData(uint8);
   46          void  MSSP_Init(void);
   47          uint8  MSSP_SendData(uint8);
   48          void LcdSendCommand(unsigned char);
   49          void LcdSendData(unsigned char);
   50          void _delay_loop_(unsigned int);
   51          void LcdClearBuffer(void);
   52          void LcdDisplayBuffers(void);
   53          void SetLcdDisplayPos(unsigned char, unsigned char);
   54          void LcdDisplayString(unsigned char []);
   55          uint32 GetAdcVal(unsigned char);
   56          
   57          
   58          void _delay_loop_(unsigned int val)
   59          {
ARM COMPILER V2.42,  main                                                                  19/01/06  08:10:09  PAGE 2   

   60   1      unsigned int i;
   61   1        for(i = 0; i < val; i ++);
   62   1      }
   63          
   64          void AdcInit(void)
   65          {
   66   1        PINSEL1 |= (P0_28_AD0_1 << P0_28_PINSEL);// P0.28连接到AD0.1
   67   1        PINSEL1 |= (P0_30_AD0_3 << P0_30_PINSEL);// P0.30连接到AD0.3
   68   1      }
   69          
   70          uint32 GetAdcVal(unsigned char Chnum)
   71          {
   72   1      uint32 ADC_Data;
   73   1        Chnum &= 0x07;//Adc0~Adc7
   74   1      /* 进行ADC模块设置 */
   75   1        AD0CR = (1 << Chnum)                  |   // SEL=8,选择通道3                              不加电容       加电容
   76   1      //          ((Fpclk / 1000000 - 1) << 8)    |   // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
   77   1      //          ((Fpclk /   2000000 - 1) << 8)  |   // CLKDIV=Fpclk/2000000-1,转换时钟为500KHz(1.511V~1.395V)
   78   1      //          ((Fpclk /   2500000 - 1) << 8)  |   // CLKDIV=Fpclk/2500000-1,转换时钟为400KHz(1.508V~1.240V)
   79   1      //          ((Fpclk /   3333333 - 1) << 8)  |   // CLKDIV=Fpclk/3333333-1,转换时钟为300KHz(1.506V~1.503V)
   80   1                  ((Fpclk /   4000000 - 1) << 8)  |   // CLKDIV=Fpclk/4000000-1,转换时钟为250KHz(1.501V~1.499V)(1.
             -503V~1.508V)
   81   1      //          ((Fpclk /   5000000 - 1) << 8)  |   // CLKDIV=Fpclk/5000000-1,转换时钟为200KHz(1.508V~1.503V)
   82   1      //          ((Fpclk / 10000000 - 1) << 8)   |   // CLKDIV=Fpclk/10000000-1,转换时钟为100KHz(1.487V~1.484V)(1.
             -511V~1.513V)
   83   1      //          ((Fpclk /   100000000 - 1) << 8)    |   // CLKDIV=Fpclk/100000000-1,转换时钟为10KHz(低频不行)
   84   1                (0 << 16)                     |   // BURST=0,软件控制转换操作
   85   1                (0 << 17)                     |   // CLKS=0, 使用11clock转换
   86   1                (1 << 21)                     |   // PDN=1,正常工作模式
   87   1                (0 << 22)                     |   // TEST1:0=00,正常工作模式
   88   1                (1 << 24)                     |   // START=1,直接启动ADC转换
   89   1                (0 << 27);                            // 直接启动ADC转换时,此位无效
   90   1        _delay_loop_(20);
   91   1        ADC_Data = AD0DR;     // 读取ADC结果,并清除DONE标志位
   92   1        AD0CR |= 1 << 24;                 // 进行第一次转换
   93   1        while ((AD0DR & 0x80000000) == 0);    // 等待转换结束
   94   1        AD0CR |= 1 << 24;                 // 再次启动转换
   95   1      //必须2次转换,否则差0.1V~0.2V
   96   1        while ((AD0DR & 0x80000000) == 0);    // 等待转换结束
   97   1        ADC_Data = AD0DR;                 // 读取ADC结果
   98   1        ADC_Data = (ADC_Data >> 6) & 0x3ff;
   99   1        ADC_Data = ADC_Data * 2480;           // 参考电压经过3/4分压
  100   1        ADC_Data = ADC_Data / 1024;
  101   1        return ADC_Data;
  102   1      }
  103          
  104          void LcdClearBuffer(void)//清除屏幕
  105          {
  106   1      unsigned char i, j;
  107   1        for (i = 0;i < 4;i ++) {
  108   2          for (j = 0;j < 16; j ++) {
  109   3            LcdBuffers.LcdBuff[i][j] = ' ';
  110   3          }
  111   2          LcdBuffers.LcdBuffWrFlag[i] = 0;
  112   2        }
  113   1      }
  114          
  115          
  116          
  117          void LcdInit(void) {
  118   1      #ifdef LcdSSP
  119   1        SSP_Init();
  120   1      #else
                 MSSP_Init();
               #endif
  123   1      /*---------------------------------------------------
ARM COMPILER V2.42,  main                                                                  19/01/06  08:10:09  PAGE 3   

  124   1          LCD模块上电等待延时
  125   1      ----------------------------------------------------*/
  126   1      //  DelayMs(1000);//上电等待延时1000Ms
  127   1        os_dly_wait (5);//延时100mS
  128   1      
  129   1        LcdClearBuffer();
  130   1        LcdSendCommand(0x20);//发送4位控制命令
  131   1        LcdSendCommand(0x02);//发送位址归位命令,设定DDRAM位址计数器为0
  132   1        LcdSendCommand(0x0c);//发送开显示关光标命令
  133   1        LcdSendCommand(0x04);//发送进入点命令
  134   1        LcdSendCommand(0x01);//发送清除显示命令
  135   1        LcdSendCommand(0x80);//发送设定DDRAM地址0x00命令
  136   1      //  DelayMs(1000);//上电等待延时1000Ms//晕~~~
  137   1      //  SetLcdDisplayPos(0, 0);//汉字定位到上行左端
  138   1      //  LcdDisplayString("汉字显示演示12");
  139   1      //  SetLcdDisplayPos(1, 0);//汉字定位到上行左端
  140   1      //  LcdDisplayString("汉字显示演示34");
  141   1        SetLcdDisplayPos(2, 0);//汉字定位到上行左端
  142   1        LcdDisplayString("汉字显示演示56");
  143   1        SetLcdDisplayPos(3, 0);//汉字定位到上行左端
  144   1        LcdDisplayString("汉字显示演示78");
  145   1        os_dly_wait (5);//延时100mS
  146   1      }
  147          
  148          /*--------------------------------------------------------
  149              发送8位LCD控制命令
  150          --------------------------------------------------------*/
  151          void LcdSendCommand(unsigned char cCommand)
  152          {
  153   1      /*--------------------------------------------------------
  154   1          发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)
  155   1      --------------------------------------------------------*/
  156   1      #ifdef LcdSSP
  157   1        SSP_SendData(0xf8);//发送LCD控制命令
  158   1        SSP_SendData(cCommand & 0xf0);//发送高4位LCD控制命令
  159   1        SSP_SendData(cCommand << 4);//发送低4位LCD控制命令
  160   1      #else
                 MSSP_SendData(0xf8);//发送LCD控制命令
                 MSSP_SendData(cCommand & 0xf0);//发送高4位LCD控制命令
                 MSSP_SendData(cCommand << 4);//发送低4位LCD控制命令
               #endif
  165   1        if (cCommand == 0x01) _delay_loop_(1600);//1.6mS
  166   1        else _delay_loop_(72);//st7920要求等待72uS
  167   1      }
  168          
  169          
  170          /*--------------------------------------------------------
  171              发送8位LCD显示数据
  172          --------------------------------------------------------*/
  173          void LcdSendData(unsigned char cData)
  174          {
  175   1      /*--------------------------------------------------------
  176   1          发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)
  177   1      --------------------------------------------------------*/
  178   1      #ifdef LcdSSP
  179   1        SSP_SendData(0xfa);//发送LCD显示数据
  180   1        SSP_SendData(cData & 0xf0);//发送高4位LCD显示数据
  181   1        SSP_SendData(cData << 4);//发送低4位LCD显示数据
  182   1      #else
                 MSSP_SendData(0xfa);//发送LCD显示数据
                 MSSP_SendData(cData & 0xf0);//发送高4位LCD显示数据
                 MSSP_SendData(cData << 4);//发送低4位LCD显示数据
               #endif
  187   1        _delay_loop_(72);//st7920要求等待延时72uS
  188   1      }
  189          
ARM COMPILER V2.42,  main                                                                  19/01/06  08:10:09  PAGE 4   

  190          
  191          void LcdDisplayBuffers(void)
  192          {
  193   1      unsigned char i, j;
  194   1        for (i = 0;i < 4;i ++) {
  195   2          if (LcdBuffers.LcdBuffWrFlag[i]) {//此行已被改写
  196   3            LcdSendCommand(0x80 + (i & 1) * 16 + (i >> 1) * 8);
  197   3            for (j = 0;j < 16; j ++) {
  198   4              LcdSendData(LcdBuffers.LcdBuff[i][j]);//显示刷新
  199   4            }
  200   3            LcdBuffers.LcdBuffWrFlag[i] = 0;
  201   3          }
  202   2        }
  203   1      }
  204          
  205          
  206          void SetLcdDisplayPos(unsigned char row, unsigned char col)
  207          {
  208   1        LcdBuffers.Row = row & 0x03;//4行
  209   1        LcdBuffers.Col = col & 0x0f;//16列
  210   1      }
  211          
  212          void LcdDisplayString(unsigned char string[])
  213          {
  214   1      char len, i;
  215   1        len = strlen(string);
  216   1        if ((LcdBuffers.Row < 4) && ((LcdBuffers.Col + len) <= 16)) {
  217   2          if (len == 0) {
  218   3            while(LcdBuffers.Col < 16) LcdBuffers.LcdBuff[LcdBuffers.Row][LcdBuffers.Col ++] = ' ';
  219   3          }
  220   2          else
  221   2            for (i = 0; i < len; i ++) LcdBuffers.LcdBuff[LcdBuffers.Row][LcdBuffers.Col ++] = string[i];
  222   2          LcdBuffers.LcdBuffWrFlag[LcdBuffers.Row] = 1;//需要显示刷新
  223   2        }
  224   1      }
  225          
  226          
  227          
  228          void  MSSP_Init(void)
  229          {
  230   1        IODIR0 |= (1 << SCK1);        // 设置SCK0控制口为输出 
  231   1        IODIR0 |= (1 << MOSI1);       // 设置MOSI0控制口为输出    
  232   1      }
  233          
  234          /*
  235          *********************************************************************************************************
  236          ** 函数名称:SSP_Init()
  237          ** 函数功能:将SSP控制器设置为主机SPI。
  238          ** 入口参数:无
  239          ** 出口参数:无
  240          *********************************************************************************************************
  241          */
  242          void SSP_Init(void)
  243          {
  244   1        PCONP |= 1<<10;
  245   1        PINSEL1 |= ((P0_17_SCK1 << P0_17_PINSEL) | (P0_19_MOSI1 << P0_19_PINSEL));
  246   1      
  247   1      
  248   1        SSPCR0 = (0x01 << 8) |              // SCR  设置SPI时钟分频
  249   1      //             (0x01 << 7) |              // CPHA 时钟输出相位,仅SPI模式有效 
  250   1                   (0x00 << 7) |              // CPHA 时钟输出相位,仅SPI模式有效 
  251   1      //             (0x01 << 6) |              // CPOL 时钟输出极性,仅SPI模式有效
  252   1                 (0x00 << 6) |              // CPOL 时钟输出极性,仅SPI模式有效
  253   1                   (0x00 << 4) |              // FRF  帧格式 00=SPI,01=SSI,10=Microwire,11=保留
  254   1                   (0x07 << 0);               // DSS  数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位
  255   1      
ARM COMPILER V2.42,  main                                                                  19/01/06  08:10:09  PAGE 5   

  256   1        SSPCR1 = (0x00 << 3) |              // SOD  从机输出禁能,1=禁止,0=允许
  257   1                   (0x00 << 2) |              // MS   主从选择,0=主机,1=从机
  258   1                   (0x01 << 1) |              // SSE  SSP使能,1=允许SSP与其它设备通信
  259   1                   (0x00 << 0);               // LBM  回写模式
  260   1                   
  261   1        SSPCPSR = 0x52;                     // PCLK分频值
  262   1         // SSPIMSC = 0x07;                     // 中断屏蔽寄存器
  263   1        SSPICR  = 0x03;                     // 中断清除寄存器

⌨️ 快捷键说明

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