找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2625|回复: 0
收起左侧

STM32F103ZET6 ADC和DAC的DMA传输 LCD12864显示

[复制链接]
ID:293438 发表于 2019-7-20 08:28 | 显示全部楼层 |阅读模式
老铁们可以下载文件,这里不是很清楚
  1. #include "lcd12864.h"



  2. void LCD_12864_Init(void)
  3. {             
  4. GPIO_InitTypeDef  GPIO_InitStructure;
  5.        
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PB,PE端口时钟
  7.        
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;                                 //LED0-->PB.5 端口配置
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  11. GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB.5
  12.        
  13.        
  14. GPIO_SetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);                                                 //PB.5 输出高

  15.         LCD_PSB_Clr();
  16.         lcd_write_cmd(0x30);      //基本指令模式
  17.         lcd_delay(1);
  18.         lcd_write_cmd(0x0c);      //开显示,关游标,关反白
  19.         lcd_delay(1);
  20.         lcd_write_cmd(0x01);          //清屏
  21.         lcd_delay(1);
  22. }



  23. /************lcd12864延时函数*********/
  24. void lcd_delay (unsigned int xms)
  25. {
  26.      unsigned int i,j;
  27.      for(i=xms;i>0;i--)
  28.      for(j=110;j>0;j--);
  29.    
  30. }
  31. /**********************************************************/
  32.      /*****---------发送一个字节*----------*******/
  33. /**********************************************************/
  34. void lcd_sent_beyt(unsigned char date)
  35. {
  36.           unsigned char i=0;
  37.           for(i=0;i<8;i++)
  38.           {
  39.                   if((date<<i)&0x80) LCD_SID_Set();   //   SID=1
  40.        else          LCD_SID_Clr();     //SID=0
  41.                   LCD_SCLK_Clr();//SCLK=0
  42.                   LCD_SCLK_Set();//SCLK=1
  43.                 }
  44.                 lcd_delay(1);       
  45. }




  46. /**************************************************/
  47.        /*****-----写数据------*******/
  48. /**************************************************/
  49. void lcd_write_data(unsigned char date)
  50. {       
  51.          LCD_CS_Set();//CS=1;
  52.          lcd_sent_beyt(0xfa);
  53.          lcd_sent_beyt((date&0xf0));//高4位取出,低四位补0
  54.          lcd_sent_beyt((date<<4)&0xf0);//将所发送字节的低四位移到高四位,低四位自动补0,然后将高四位取出
  55.          lcd_delay(1);//延时1ms  接收处理数据
  56.        
  57.          LCD_CS_Clr();//CS=0
  58. }

  59. /**************************************************/
  60.       /****--------写命令---------****/
  61. /**************************************************/
  62. void lcd_write_cmd(unsigned char date)
  63. {
  64.          LCD_CS_Set();
  65.          lcd_sent_beyt(0xf8);
  66.          lcd_sent_beyt(date&0xf0);
  67.          lcd_sent_beyt((date<<4)&0xf0);
  68.          lcd_delay(1);
  69.          LCD_CS_Clr();
  70. }


  71. /**************************************************/
  72. /*******-----------坐标函数-------------**********/
  73. /**************************************************/
  74. void LCD_XY(unsigned char X,unsigned char Y)
  75. {
  76.         unsigned char pos;
  77.         if(X==0)
  78.         {X=0x80;}
  79.         else if(X==1)
  80.         {X=0x90;}
  81.         else if(X==2)                                     
  82.         {X=0x88;}
  83.         else if(X==3)
  84.         {X=0x98;}
  85.         pos=X+Y;
  86.   lcd_write_cmd(pos);
  87. }


  88. void lcd_clr()
  89. {      
  90.         lcd_write_cmd(0x01);          //清除LCD的显示内容     
  91.         lcd_delay(1);
  92. }

  93. /*************************************************/
  94.       /*-------lcd12864初始化--------*/
  95. /************************************************/
  96. void init_12864(void)
  97. {
  98.         LCD_PSB_Clr();
  99.         lcd_write_cmd(0x30);      //基本指令模式
  100.         lcd_delay(1);
  101.         lcd_write_cmd(0x0c);      //开显示,关游标,关反白
  102.         lcd_delay(1);
  103.         lcd_write_cmd(0x01);          //清屏
  104.         lcd_delay(1);
  105. }

  106. /************************************************/
  107.       /*---中英文字符串显示函数----*/
  108. /************************************************/
  109. void writestring(unsigned char X,unsigned char Y,unsigned char *p)               
  110.      {          
  111.       
  112.               LCD_XY(X,Y);
  113.        while(*p!='\0')
  114.        {
  115.                
  116.         lcd_write_data(*p);
  117.         p++;
  118.                     if(*p==';')
  119.                     break;
  120.        }
  121. }
  122. /************************************************/
  123.      /*------字符串显示函数------*/
  124. /***********************************************/
  125. void testring(unsigned char *p)
  126.      {          
  127.        while(*p!='\0')
  128.        {
  129.                
  130.         lcd_write_data(*p);
  131.         p++;
  132.        }
  133. }

  134. /*********************************************/
  135.        /*-------显示函数---------*/
  136. /***********************************************/
  137. void  xianshi(char X,char Y, unsigned int shu)
  138. {
  139.       unsigned int i,j,k,l,n;
  140.       i=shu/10000;
  141.       j=(shu-10000*i)/1000;
  142.       k=(shu-10000*i-1000*j)/100;
  143.       l=(shu-10000*i-1000*j-100*k)/10;
  144.       n=shu%10;
  145.       LCD_XY(X,Y);
  146.       if(i!=0)lcd_write_data(i+0x30);
  147.       if((i!=0)||(j!=0))lcd_write_data(j+0x30);
  148.       if((i!=0)||(j!=0)||(k!=0))lcd_write_data(k+0x30);
  149.       if((i!=0)||(j!=0)||(k!=0)||(l!=0))lcd_write_data(l+0x30);
  150.       lcd_write_data(n+0x30);
  151.       testring("  ");
  152.              
  153. }


  154. void xiaoshu(char x,char y,float num)
  155. {
  156.                 char aa[10];
  157.                  sprintf(aa,"%1.2f",num);
  158.                 writestring(x,y,aa);
  159. }


  160. //void xianshi_jiao(char X, char Y, int shu)
  161. //{
  162. //      unsigned int i,j,k,l,n;
  163. //      if(shu>=0)
  164. //      {
  165. //      i=shu/10000;
  166. //      j=(shu-10000*i)/1000;
  167. //      k=(shu-10000*i-1000*j)/100;
  168. //      l=(shu-10000*i-1000*j-100*k)/10;
  169. //      n=shu%10;
  170. //      LCD_XY(X,Y);
  171. //      if(i!=0)lcd_write_data(i+0x30);
  172. //      if((i!=0)||(j!=0))lcd_write_data(j+0x30);
  173. //      if((i!=0)||(j!=0)||(k!=0))lcd_write_data(k+0x30);
  174. //      if((i!=0)||(j!=0)||(k!=0)||(l!=0))lcd_write_data(l+0x30);
  175. //      lcd_write_data(n+0x30);
  176. //      testring(" ");
  177. //      }
  178. //      
  179. //      else
  180. //      {
  181. //      shu=-shu;  
  182. //      i=shu/10000;
  183. //      j=(shu-10000*i)/1000;
  184. //      k=(shu-10000*i-1000*j)/100;
  185. //      l=(shu-10000*i-1000*j-100*k)/10;
  186. //      n=shu%10;
  187. //      LCD_XY(X,Y);
  188. //      testring("-");
  189. //      if(i!=0)lcd_write_data(i+0x30);
  190. //      if((i!=0)||(j!=0))lcd_write_data(j+0x30);
  191. //      if((i!=0)||(j!=0)||(k!=0))lcd_write_data(k+0x30);
  192. //      if((i!=0)||(j!=0)||(k!=0)||(l!=0))lcd_write_data(l+0x30);
  193. //      lcd_write_data(n+0x30);
  194. //      testring(" ");
  195. //      }
  196. //}
复制代码
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "lcd12864.h"
  5. #include "delay.h"
  6. #include "led.h"
  7. #include "dac.h"
  8. #include "adc.h"
  9. #include "timer.h"
  10. #include "dma.h"

  11. //#include "stdio.h"

  12. extern __IO uint16_t ADC_ConvertedValue[102];
  13. __IO   uint16_t ADC_Value[3];
  14. float  ADC_ConvertedValueLocal[102];
  15. float  get_mV[3];  

  16. u16 DAC_Value[32]={2500,2500,2500,2500,2500,2500,2500,2500,1500,2500,
  17.                    2600,2600,2600,2600,2600,2600,2600,2600,1600,2600,
  18.                    2400,2400,2400,2400,2400,2400,2400,2400,2400,2440,
  19.                    2500,2500};

  20. void angler_mV()
  21. {
  22.    int j;
  23.    static double sum=0;
  24.        
  25.    for(j=0;j<100;j++)
  26.          {
  27.            sum+=ADC_ConvertedValue[j];       
  28.          }
  29.    ADC_Value[0]=sum/100;
  30.          sum=0;
  31.    ADC_ConvertedValueLocal[0] = (float)ADC_Value[0]*(3.3/4096);//通道1数据采集
  32.          
  33.          xiaoshu(0,0,ADC_ConvertedValueLocal[0]);             //显示采集的电压          
  34. }       

  35. int main(void)
  36. {       
  37.    u16 c;
  38.    float d;         
  39.   
  40.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组2  delay_init();
  41.          
  42.          
  43.          LCD_12864_Init();         //液晶初始化
  44.          LED_Init();         //LED灯初始化
  45.          TIM3_Int_Init(9,71);
  46.    GPIO_DAC1_Init();  //DAC初始化
  47.          ADC_INIT();        //ADC初始化
  48.          DAC_DMA_Config(DMA1_Channel3,(u32)&DAC->DHR12R1,(u32)DAC_Value,32);//DMA1通道3,
  49.          TIM3->DIER|=1<<8;
  50.          MYDMA_Enable(DMA1_Channel3);
  51.          
  52.          while(1)
  53.          {
  54. //                  Dac1_Set_Vol(2500);      //设置2.5V
  55. //
  56. //                DAC_SetChannel1Data(DAC_Align_12b_R, 2000);//设置DAC值         
  57.                  
  58.                 c=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
  59.                 xianshi(1,4,c);
  60.                 d=(float)c*(3.3/4096);       //得到DAC电压值
  61.                 xiaoshu(1,0, d);             //显示采集的电压

  62.                 angler_mV();
  63.                  
  64. //          LED0=0;
  65. //    delay_ms(200);
  66. //    LED0=1;
  67. //    delay_ms(200);
  68.          }         
  69. }
复制代码

全部资料51hei下载地址:
STM32 12864.7z (222.77 KB, 下载次数: 104)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表