[创新制造展示] 【21ic第三届设计大赛】+超强!数字函数发生器(STM8L 主控)

[复制链接]
3441|15
 楼主 | 2019-5-21 14:57 | 显示全部楼层 |阅读模式
本帖最后由 小小电子爱好者 于 2019-7-2 12:54 编辑

先发帖抢第一  不然最后一评   啥都没有第一
终于终于! 我看到活动快结束了,真是不到最后不紧张,其实之前做了STM8L051的因为没有内置DAC,所以画了块板接了DAC芯片加上运放电路,最后测了一下波形效果很差不知道啥原因也没管,应为工作太忙,忙起来就丢一边了。(看一下丑照)
112.jpg


这不是这几天刚好闲了一点,抽了几天闲余时间拉出来之前收集的开发板 STM8L152C6的官方板,带DAC的画了块底座拓展,简单做一下,不想发个帖子啥都没做就结束了,那真太怂了,做的再烂也比偷偷删帖好多了,毕竟二姨家必须要支持得嘛!哈哈 那绝对是当然的!!!
113.jpg

使用特权

评论回复

评论

黄大队长 2019-6-29 22:06 回复TA
来了,老弟 
小小电子爱好者 2019-6-27 13:49 回复TA
@LED2013 :来了 
LED2013 2019-5-23 23:47 回复TA
你的主贴呢 
dirtwillfly 2019-5-21 22:59 回复TA
积极参与 
 楼主 | 2019-6-27 13:38 | 显示全部楼层
本帖最后由 小小电子爱好者 于 2019-6-27 20:00 编辑

STM8L152C6 开发板做的数字函数发生器
时间紧,就争取把基本的做好。
刚开始确定了一下功能:
1. OLED12864常规操作 来显示一下信息,知到我们在干嘛。
2. 4个按键切换 4种不同波形(正弦,锯齿,三角,方波)。
3. 旋转编码器来调整波形的 幅度、频率 、通过编码器自带的按键实现切换。
4. 计划加入一些预先准备的自定义波形,放在flash存储区,通过页面来切换 【基本波形页面】【自定义波形页面】。
423025d1459cf76c39.png 481695d14afe3695a3.png

使用特权

评论回复
 楼主 | 2019-6-27 20:19 | 显示全部楼层
本帖最后由 小小电子爱好者 于 2019-6-27 20:37 编辑

硬件外设:

芯片 : STM8L152   
软件 :IAR 3.10.4 固件库
外设 : DAC 、DMA、 定时器4
硬件 : 独立按键*4,编码器+按键  OLED12864

488455d14b40814540.png
编码器短按 切换 调频 调幅,长按切换页面显示自定义波形。
34335d14b4a6cce47.png
检测波形的小设计  哈哈 为了方便
189015d14b5bd51f63.png









使用特权

评论回复
 楼主 | 2019-6-27 20:36 | 显示全部楼层
本帖最后由 小小电子爱好者 于 2019-6-28 18:23 编辑

软件实现安排:


开启DAC
开启DMA的DAC通道设置数据地址、数据量(数据buff大可以波形更流畅)
开定时器设置成溢出更新事件触发DMA转换(改变定时器值可修改波形频率)

正弦波 锯齿波 三角波 方波
这几个波形用简单算法给数组赋值,可以方便修改幅度。其他自定义波形做个数组,存在内部flash。
然后
按键程序逻辑设计,编码器调节程序


最后
主程序跑按键 OLED显示 等逻辑
然后开启DMA持续运输数组数据跑波形。




使用特权

评论回复
 楼主 | 2019-6-28 18:56 | 显示全部楼层
本帖最后由 小小电子爱好者 于 2019-6-28 18:59 编辑

复制代码
代码部分:


DAC部分代码
  1. static void DMA_Config(void)
  2. {
  3.   DMA_GlobalDeInit();
  4.   DMA_DeInit(DMA1_Channel3);
  5.   CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
  6.   
  7.   DMA_Init(DMA1_Channel3,
  8.               (uint32_t)((uint16_t)&Wave_Buffer),
  9.               0x5388,
  10.               130,
  11.               DMA_DIR_MemoryToPeripheral,
  12.               DMA_Mode_Circular,
  13.               DMA_MemoryIncMode_Inc,
  14.               DMA_Priority_VeryHigh,
  15.               DMA_MemoryDataSize_HalfWord );
  16.   
  17.   DMA_Cmd(DMA1_Channel3, ENABLE);
  18.   DMA_GlobalCmd(ENABLE );
  19. }
  20. static void Timer4_Config()
  21. {
  22.     TIM4_DeInit();
  23.    
  24.     CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE);
  25.    
  26.     TIM4_TimeBaseInit(TIM4_Prescaler_1,
  27.                        0x09);
  28.    
  29.     TIM4_SelectOutputTrigger(TIM4_TRGOSource_Update);
  30.     //TIM4_ITConfig( TIM4_IT_Update, ENABLE );
  31.    
  32.     TIM4_Cmd(ENABLE);

  33. }
  34. /**
  35. *
  36. *        DAC初始化
  37. *
  38. **/
  39. void DAC_Config()
  40. {
  41.   DAC_DeInit();
  42.   
  43.   CLK_PeripheralClockConfig(CLK_Peripheral_DAC, ENABLE);
  44.   
  45.   DAC_Init(DAC_Channel_1,
  46.                 DAC_Trigger_T4_TRGO,//DAC_Trigger_Software//DAC_Trigger_T4_TRGO
  47.                 DAC_OutputBuffer_Disable);//DAC_OutputBuffer_Enable

  48.   DAC_Cmd(DAC_Channel_1, ENABLE);
  49.   
  50.   DAC_DMACmd(DAC_Channel_1, ENABLE);
  51.   
  52.   Timer4_Config();
  53.   
  54.   DMA_Config();

  55. }
复制代码

编码器部分
  1. void ROTATY_Init()
  2. {
  3.   GPIO_Init(GPIOD,GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_5,GPIO_Mode_In_PU_No_IT);
  4. }
  5. void ROTATY_Scan_Driver()
  6. {
  7.   static uint8_t Turn_L=0,Turn_R=0,Rot_Flag=0;
  8.   
  9.   if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7)==GPIO_Pin_7)&&(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6)==GPIO_Pin_6))
  10.   {
  11.     Rot_Flag=0x01;
  12.   }
  13.   if(Rot_Flag == 0x01)
  14.   {
  15.     if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7)!=GPIO_Pin_7)&&(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6)!=GPIO_Pin_6))
  16.     {
  17.       if(Turn_L == 0x01)
  18.       {
  19.         if((Selet_Value == 0x00)&&(Menu_value == 0))
  20.         {
  21.           if(Roty_Value<4000)
  22.           Roty_Value+=Roty_Value2;
  23.           Roty_value3=(uint16_t)((Roty_Value*3.3)*10/4096);
  24.          
  25.           OLED_ShowNum(80,6,Roty_value3/10,1,16);
  26.           OLED_ShowChar(88,6,'.');
  27.           OLED_ShowNum(96,6,Roty_value3%10,1,16);
  28.         }
  29.         else if((Selet_Value == 0x01)&&(Menu_value == 0))
  30.         {
  31.           if(Bias_Value<9)
  32.           Bias_Value+=Bias_Value2;
  33.           OLED_ShowNum(0,6,Bias_Value*1000,5,16);  
  34.           TIM4_TimeBaseInit(Bias_Value,10);
  35.         }
  36.         Rot_Flag=0x00;
  37.       }
  38.       if(Turn_R == 0x01)
  39.       {
  40.         if((Selet_Value == 0x00)&&(Menu_value == 0))
  41.         {
  42.           if(Roty_Value>100)
  43.           Roty_Value-=Roty_Value2;
  44.           Roty_value3=(uint16_t)((Roty_Value*3.3)*10/4096);
  45.           OLED_ShowNum(80,6,Roty_value3/10,1,16);
  46.           OLED_ShowChar(88,6,'.');
  47.           OLED_ShowNum(96,6,Roty_value3%10,1,16);
  48.         }
  49.         else if((Selet_Value == 0x01)&&(Menu_value == 0))
  50.         {
  51.           if(Bias_Value>1)
  52.           Bias_Value-=Bias_Value2;
  53.           OLED_ShowNum(0,6,Bias_Value*1000,5,16);         
  54.           TIM4_TimeBaseInit(Bias_Value,10);
  55.         }        
  56.         Rot_Flag=0x00;
  57.       }
  58.       if(Menu_value == 0)
  59.       {
  60.         if(n_wave == 1)
  61.          getSinTab(130,Roty_Value);
  62.         else if(n_wave == 2)
  63.          getTriaTab(130,Roty_Value);
  64.         else if(n_wave == 3)
  65.          getSawTab(130,Roty_Value);
  66.         else if(n_wave == 4)  
  67.          getSquarTab(130,Roty_Value);
  68.       }
  69.     }
  70.   }
  71.   
  72.   if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7) == GPIO_Pin_7))
  73.   {
  74.     Turn_L =0x01;
  75.   }
  76. else
  77. {
  78.   Turn_L =0;
  79. }
  80.   if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6) == GPIO_Pin_6))
  81.   {
  82.     Turn_R =0x01;
  83.   }
  84. else
  85. {
  86.   Turn_R =0;
  87. }
  88. }
复制代码
OLED部分
  1. void Delay_5us()
  2. {
  3.   uint8_t i,x;
  4.   for(i = 0;i>45;x++)
  5.     {
  6.     }
  7. }
  8. void iic_start()
  9. {
  10.   GPIO_WriteBit( GPIOB, IIC_DAT,SET);
  11.   GPIO_WriteBit( GPIOB, IIC_CLK,SET);
  12.   Delay_5us();
  13.   GPIO_WriteBit( GPIOB, IIC_DAT,RESET);
  14.   GPIO_WriteBit( GPIOB, IIC_CLK,RESET);
  15.   Delay_5us();
  16. }
  17. void iic_stop()
  18. {
  19.   GPIO_WriteBit( GPIOB, IIC_DAT,RESET);
  20.   GPIO_WriteBit( GPIOB, IIC_CLK,SET);
  21.   Delay_5us();
  22.   GPIO_WriteBit( GPIOB, IIC_DAT,SET);
  23.   
  24. }
  25. uint8_t iic_ReadByte(void)
  26. {
  27.         uint8_t i;
  28.         uint8_t value;

  29.         /* 读到第1个bit为数据的bit7 */
  30.         value = 0;
  31.         GPIO_Init( GPIOB,  IIC_DAT, GPIO_Mode_In_FL_No_IT);
  32.         for (i = 0; i < 8; i++)
  33.         {
  34.                 value <<= 1;
  35.                 GPIO_WriteBit( GPIOB, IIC_CLK,SET);
  36.                  Delay_5us();
  37.                 if (GPIO_ReadInputDataBit( GPIOB,  IIC_DAT) ==IIC_DAT)
  38.                 {
  39.                         value++;
  40.                 }
  41.                 GPIO_WriteBit( GPIOB, IIC_CLK,RESET);
  42.                 Delay_5us();
  43.         }
  44.        GPIO_Init( GPIOB,  IIC_DAT, GPIO_Mode_Out_PP_High_Fast);
  45.        GPIO_WriteBit( GPIOB, IIC_DAT,SET);
  46.         return value;
  47. }
  48. uint8_t iic_waitAck()
  49. {
  50.   uint8_t res=1;
  51.   uint8_t i=0;
  52.   
  53.   GPIO_WriteBit( GPIOB, IIC_CLK,SET);
  54.   Delay_5us();
  55.   
  56.   GPIO_Init( GPIOB,  IIC_DAT, GPIO_Mode_In_FL_No_IT);
  57.   
  58.   while((res)&&(i<5))
  59.   {
  60.     if(GPIO_ReadInputDataBit( GPIOB,  IIC_DAT) ==IIC_DAT )
  61.     {
  62.       res = 1;
  63.     }
  64.     else
  65.     {
  66.       res= 0;
  67.     }
  68.     i++;
  69.   }

  70.   GPIO_WriteBit( GPIOB, IIC_CLK,RESET);
  71.   GPIO_Init( GPIOB,  IIC_DAT, GPIO_Mode_Out_PP_High_Fast);
  72.   return  res;  
  73. }

  74. void iic_rack()
  75. {
  76.   GPIO_Init( GPIOB,  IIC_DAT, GPIO_Mode_Out_PP_High_Fast);
  77.   GPIO_WriteBit( GPIOB, IIC_DAT,RESET);
  78.   Delay_5us();
  79.   GPIO_WriteBit( GPIOB, IIC_CLK,SET);
  80.   Delay_5us();
  81.   GPIO_WriteBit( GPIOB, IIC_CLK,RESET);
  82.   Delay_5us();
  83.   GPIO_WriteBit( GPIOB, IIC_DAT,SET);  
  84. }
  85. void iic_nack()
  86. {
  87.   GPIO_Init( GPIOB,  IIC_DAT, GPIO_Mode_Out_PP_High_Fast);
  88.   GPIO_WriteBit( GPIOB, IIC_DAT,SET);
  89.   Delay_5us();
  90.   GPIO_WriteBit( GPIOB, IIC_CLK,SET);
  91.   Delay_5us();
  92.   GPIO_WriteBit( GPIOB, IIC_CLK,RESET);
  93.   Delay_5us();
  94. }
  95. uint8_t iic_sendbyte(uint8_t data)
  96. {
  97.   uint8_t i;
  98.   for(i=0;i<8;i++)
  99.   {
  100.     if(data & 0x80)
  101.     {
  102.       GPIO_WriteBit( GPIOB, IIC_DAT,SET);
  103.     }
  104.     else
  105.     {
  106.       GPIO_WriteBit( GPIOB, IIC_DAT,RESET);
  107.     }
  108.     data<<=1;
  109.     GPIO_WriteBit( GPIOB, IIC_CLK,SET);
  110.     Delay_5us();
  111.     GPIO_WriteBit( GPIOB, IIC_CLK,RESET);
  112.     Delay_5us();   
  113.   }
  114.   GPIO_WriteBit( GPIOB, IIC_DAT,SET);
  115.   return data;
  116. }
  117. /**
  118.   * @函数名       Write_OELD_Command
  119.   * @功  能       对OLED写入命令
  120.   * @参  数       IIC_Command:写入的命令字节
  121.   * @返回值       无
  122.   */
  123. void Write_OLED_Command(unsigned char IIC_Command)
  124. {
  125.   iic_start();
  126.   
  127.   iic_sendbyte(0x78);
  128.   
  129.   iic_waitAck();
  130.   
  131.   iic_sendbyte(0x00);

  132.   iic_waitAck();
  133.   
  134.   iic_sendbyte(IIC_Command);
  135.   
  136.   iic_waitAck();
  137.   
  138.   iic_stop();
  139. }


  140. /**
  141.   * @函数名       Write_OELD_Data
  142.   * @功  能       对OLED写入数据
  143.   * @参  数       IIC_Data:写入的数据字节
  144.   * @返回值       无
  145.   */
  146. void Write_OLED_Data(unsigned char IIC_Data)
  147. {
  148.   iic_start();
  149.   
  150.   iic_sendbyte(0x78);
  151.   
  152.   iic_waitAck();
  153.   
  154.   iic_sendbyte(0x40);

  155.   iic_waitAck();
  156.   
  157.   iic_sendbyte(IIC_Data);
  158.   
  159.   iic_waitAck();
  160.   
  161.   iic_stop();
  162. }


  163. /**
  164.   * @函数名       OLED_WR_Byte
  165.   * @功  能       OLED写入一字节命令/数据
  166.   * @参  数       dat:写入的数据/命令字节
  167.   * @返回值       cmd:1-写入数据;0-写入命令
  168.   */
  169. void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
  170. {
  171.   if(cmd)
  172.     {
  173.       Write_OLED_Data(dat); //写入数据
  174.     }
  175.   else {
  176.       Write_OLED_Command(dat); //写入命令
  177.     }
  178. }


  179. /**
  180.   * @函数名       OLED_Set_Pos
  181.   * @功  能       在坐标X,Y初开始花店
  182.   * @参  数       x:X坐标;y:Y坐标
  183.   * @返回值       无
  184.   */
  185. void OLED_Set_Pos(unsigned char x, unsigned char y)
  186. {
  187.   OLED_WR_Byte(0xb0+y,OLED_CMD);        //写入页地址
  188.   OLED_WR_Byte((x&0x0f),OLED_CMD);        //写入列低地址
  189.   OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);        //写入列高地址
  190. }            


  191. /**
  192.   * @函数名       OLED_Display_On
  193.   * @功  能       开OLED显示
  194.   * @参  数       无
  195.   * @返回值       无
  196.   */
  197. void OLED_Display_On(void)
  198. {
  199.   OLED_WR_Byte(0X8D,OLED_CMD);  //设置OLED电荷泵
  200.   OLED_WR_Byte(0X14,OLED_CMD);  //使能,开
  201.   OLED_WR_Byte(0XAF,OLED_CMD);  //开显示
  202. }

  203. /**
  204.   * @函数名       OLED_Display_Off
  205.   * @功  能       关OLED显示
  206.   * @参  数       无
  207.   * @返回值       无
  208.   */
  209. void OLED_Display_Off(void)
  210. {
  211.   OLED_WR_Byte(0X8D,OLED_CMD);  //设置OLED电荷泵
  212.   OLED_WR_Byte(0X10,OLED_CMD);  //失能,关
  213.   OLED_WR_Byte(0XAE,OLED_CMD);  //关显示
  214. }                                            


  215. /**
  216.   * @函数名       OLED_Clear
  217.   * @功  能       清屏
  218.   * @参  数       无
  219.   * @返回值       无
  220.   */
  221. void OLED_Clear(void)  
  222. {  
  223.   unsigned char i,n;                    //定义变量
  224.   for(i=0;i<8;i++)  
  225.     {  
  226.       OLED_WR_Byte (0xb0+i,OLED_CMD);    //从0~7页依次写入
  227.       OLED_WR_Byte (0x00,OLED_CMD);      //列低地址
  228.       OLED_WR_Byte (0x10,OLED_CMD);      //列高地址  
  229.       for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); //写入 0 清屏
  230.     }
  231. }

  232. /**
  233.   * @函数名       OLED_ShowChar
  234.   * @功  能       在指定位置显示字符
  235.   * @参  数       x:X坐标;y:Y坐标;chr:显示的字符
  236.   * @返回值       无
  237.   */
  238. void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr)
  239. {              
  240.   unsigned char c=0,i=0;        
  241.   c=chr-' '; //获取字符的偏移量        
  242.   if(x>Max_Column-1){x=0;y=y+2;} //如果列书超出了范围,就从下2页的第0列开始
  243.   if(SIZE ==16) //字符大小如果为 16 = 8*16
  244.     {
  245.       OLED_Set_Pos(x,y);        //从x y 开始画点
  246.       for(i=0;i<8;i++)  //循环8次 占8列
  247.         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); //找出字符 c 的数组位置,先在第一页把列画完
  248.       OLED_Set_Pos(x,y+1); //页数加1
  249.       for(i=0;i<8;i++)  //循环8次
  250.         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); //把第二页的列数画完
  251.     }
  252.   else  //字符大小为 6 = 6*8
  253.     {        
  254.       OLED_Set_Pos(x,y+1); //一页就可以画完
  255.       for(i=0;i<6;i++) //循环6次 ,占6列
  256.       OLED_WR_Byte(F6x8[c][i],OLED_DATA); //把字符画完
  257.     }
  258. }

  259. /**
  260.   * @函数名       oled_pow
  261.   * @功  能       计算m的n次方
  262.   * @参  数       无
  263.   * @返回值       result:计算结果
  264.   */
  265. unsigned int oled_pow(unsigned char m,unsigned char n)
  266. {
  267.   unsigned int result=1;         
  268.   while(n--)result*=m;   
  269.   return result;
  270. }

  271. /**
  272.   * @函数名       OLED_ShowNum
  273.   * @功  能       在指定的位置显示指定长度&大小的数字
  274.   * @参  数       x:X坐标;y:Y坐标;num:显示的数字;len:数字的长度;size2:字体的大小
  275.   * @返回值       无
  276.   */                  
  277. void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size2)
  278. {                 
  279.   unsigned char t,temp;  //定义变量
  280.   unsigned char enshow=0;                //定义变量
  281.   for(t=0;t<len;t++)
  282.     {
  283.       temp=(num/oled_pow(10,len-t-1))%10;//取出输入数的每个位,由高到低
  284.       if(enshow==0&&t<(len-1)) //enshow:是否为第一个数;t<(len-1):判断是否为最后一个数
  285.         {
  286.           if(temp==0) //如果该数为0
  287.             {
  288.               OLED_ShowChar(x+(size2/2)*t,y,' ');//显示 0 ;x+(size2/2)*t根据字体大小偏移的列数(8)
  289.               continue; //跳过剩下语句,继续重复循环(避免重复显示)
  290.             }else enshow=1;
  291.         }
  292.       OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); //显示一个位;x+(size2/2)*t根据字体大小偏移的列数(8)
  293.     }
  294. }

  295. /**
  296.   * @函数名       OLED_ShowString
  297.   * @功  能       在指定位置显示字符串
  298.   * @参  数       x:X坐标;y:Y坐标;*chr:显示的字符串
  299.   * @返回值       无
  300.   */
  301. void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr)
  302. {
  303.   unsigned char j=0; //定义变量
  304.   while (chr[j]!='\0') //如果不是最后一个字符
  305.     {               
  306.       OLED_ShowChar(x,y,chr[j]); //显示字符
  307.       x+=8; //列数加8 ,一个字符的列数占8
  308.       if(x>120){x=0;y+=2;} //如果x超过128,切换页,从该页的第一列显示
  309.         j++; //下一个字符
  310.     }
  311. }

  312. /**
  313.   * @函数名       OLED_ShowCHinese
  314.   * @功  能       在指定的位置显示汉字
  315.   * @参  数       x:X坐标;y:Y坐标;no:汉字的数组位置
  316.   * @返回值       无
  317.   */
  318. void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)
  319. {                                 
  320.   unsigned char t; //定义变量
  321.   OLED_Set_Pos(x,y);        //从 x y 开始画点,先画第一页
  322.   for(t=0;t<16;t++) //循环16次,画第一页的16列
  323.     {
  324.       OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);//画no在数组位置的第一页16列的点
  325.     }        
  326.   OLED_Set_Pos(x,y+1); //画第二列
  327.   for(t=0;t<16;t++)        //循环16次,画第二页的16列
  328.     {        
  329.       OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);//画no在数组位置的第二页16列的点
  330.     }                                       
  331. }


  332. /**
  333.   * @函数名       OLED_DrawBMP
  334.   * @功  能       在指定的范围显示图片
  335.   * @参  数       x0:起始X坐标;y0:起始X坐标;x1:起始X坐标;y1:起始X坐标;BMP[]:图片的数组起始地址
  336.   * @返回值       无
  337.   */
  338. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  339. {         
  340. unsigned int j=0; //定义变量
  341. unsigned char x,y; //定义变量
  342.   
  343.   if(y1%8==0) y=y1/8;   //判断终止页是否为8的整数倍
  344.   else y=y1/8+1;
  345.   
  346.   for(y=y0;y<y1;y++) //从起始页开始,画到终止页
  347.     {
  348.       OLED_Set_Pos(x0,y); //在页的起始列开始画
  349.       for(x=x0;x<x1;x++) //画x1 - x0 列
  350.         {
  351.           OLED_WR_Byte(BMP[j++],OLED_DATA);        //画图片的点            
  352.         }
  353.     }
  354. }

  355. /**
  356.   * @函数名       OLED_Init
  357.   * @功  能       OLED初始化
  358.   * @参  数       无
  359.   * @返回值       无
  360.   */                                    
  361. void OLED_Init(void)
  362. {

  363.   delay_ms(200);        //延迟,由于单片机上电初始化比OLED快,所以必须加上延迟,等待OLED上电初始化完成

  364.   OLED_WR_Byte(0xAE,OLED_CMD);        //关闭显示
  365.   OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动

  366.   OLED_WR_Byte(0x00,OLED_CMD);        //设置低列地址
  367.   OLED_WR_Byte(0x10,OLED_CMD);        //设置高列地址
  368.   OLED_WR_Byte(0x40,OLED_CMD);        //设置起始行地址
  369.   OLED_WR_Byte(0xB0,OLED_CMD);        //设置页地址

  370.   OLED_WR_Byte(0x81,OLED_CMD);         // 对比度设置,可设置亮度
  371.   OLED_WR_Byte(0xFF,OLED_CMD);        //  265  

  372.   OLED_WR_Byte(0xA1,OLED_CMD);        //设置段(SEG)的起始映射地址;column的127地址是SEG0的地址
  373.   OLED_WR_Byte(0xA6,OLED_CMD);        //正常显示;0xa7逆显示

  374.   OLED_WR_Byte(0xA8,OLED_CMD);        //设置驱动路数
  375.   OLED_WR_Byte(0x3F,OLED_CMD);        //1/32 duty
  376.          
  377.   OLED_WR_Byte(0xC8,OLED_CMD);        //重映射模式,COM[N-1]~COM0扫描

  378.   OLED_WR_Byte(0xD3,OLED_CMD);        //设置显示偏移
  379.   OLED_WR_Byte(0x00,OLED_CMD);        //无偏移
  380.          
  381.   OLED_WR_Byte(0xD5,OLED_CMD);        //设置震荡器分频(默认)大概370KHz
  382.   OLED_WR_Byte(0x80,OLED_CMD);        
  383.          
  384.   OLED_WR_Byte(0xD8,OLED_CMD);        //设置 area color mode off(没有)
  385.   OLED_WR_Byte(0x05,OLED_CMD);
  386.          
  387.   OLED_WR_Byte(0xD9,OLED_CMD);        //设置 Pre-Charge Period(默认)
  388.   OLED_WR_Byte(0xF1,OLED_CMD);
  389.          
  390.   OLED_WR_Byte(0xDA,OLED_CMD);        //设置 com pin configuartion(默认)
  391.   OLED_WR_Byte(0x12,OLED_CMD);
  392.          
  393.   OLED_WR_Byte(0xDB,OLED_CMD);        //设置 Vcomh,可调节亮度(默认)
  394.   OLED_WR_Byte(0x30,OLED_CMD);
  395.          
  396.   OLED_WR_Byte(0x8D,OLED_CMD);        //设置OLED电荷泵
  397.   OLED_WR_Byte(0x14,OLED_CMD);        //开显示

  398.   OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
  399.   OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)

  400.   OLED_WR_Byte(0xAF,OLED_CMD);//开启OLED面板显示
  401.   OLED_Clear();        //清屏
  402.   OLED_Set_Pos(0,0);          //画点
  403. }  

  404. /**
  405.   * @函数名       OLED_Scroll
  406.   * @功  能       滚动效果配置函数
  407.   * @参  数       无
  408.   * @返回值       无
  409.   */        
  410. void OLED_Scroll(void)
  411. {
  412.   OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
  413.   OLED_WR_Byte(0x27,OLED_CMD);        //水平向左滚动
  414.   OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
  415.   OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
  416.   OLED_WR_Byte(0x00,OLED_CMD);        //滚动时间间隔
  417.   OLED_WR_Byte(0x01,OLED_CMD);        //终止页 1
  418.   OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
  419.   OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
  420.   OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
  421. }
复制代码



使用特权

评论回复
 楼主 | 2019-6-28 19:15 | 显示全部楼层
本帖最后由 小小电子爱好者 于 2019-6-28 19:16 编辑

波形实现:

正弦波
684085d15f614b0d75.png 7915d15f6282ac85.png

锯齿波
139665d15f6485eb5b.png

三角波
682065d15f6667c874.png
方波
990355d15f67d5de43.png

自定义波形1:
613995d15f6b92b7b9.png




使用特权

评论回复
 楼主 | 2019-6-28 19:42 | 显示全部楼层
本帖最后由 小小电子爱好者 于 2019-6-28 19:43 编辑

随手录了个无声演示视频 :
嘿嘿   完结了   跟帖吐槽吧!https://v.youku.com/v_show/id_XNDI0NzQ1NTE5Ng==.html?x&amp;sharefrom=android&amp;sharekey=ba55b6e99d546f2eb771284885228b976

使用特权

评论回复
| 2019-6-29 22:06 | 显示全部楼层

使用特权

评论回复
 楼主 | 2019-7-2 13:03 | 显示全部楼层

使用特权

评论回复
| 2019-7-16 16:12 | 显示全部楼层

使用特权

评论回复
| 2019-7-16 16:44 | 显示全部楼层
坚持就是胜利!!

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /6 下一条

在线客服 快速回复 返回顶部 返回列表