找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 727|回复: 0
打印 上一主题 下一主题
收起左侧

STM32f103程序点不亮

[复制链接]
跳转到指定楼层
楼主
ID:880458 发表于 2021-3-21 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
野火32指南者

  1. #include "IIC.h"

  2. void IIC_Start(void)
  3. {
  4.         IIC1_SCL(GPIO_PIN_SET);
  5.         IIC1_SDA (GPIO_PIN_SET);
  6.         IIC1_SCL (GPIO_PIN_RESET);
  7.         IIC1_SDA (GPIO_PIN_RESET);
  8. }

  9. void IIC_Stop(void)
  10. {
  11.         IIC1_SCL (GPIO_PIN_RESET);
  12.         IIC1_SDA (GPIO_PIN_RESET);
  13.         IIC1_SCL(GPIO_PIN_SET);
  14.         IIC1_SDA (GPIO_PIN_SET);
  15. }

  16. void IIC_Ack()
  17. {
  18.         IIC1_SCL (GPIO_PIN_RESET);
  19.         IIC1_SDA(GPIO_PIN_RESET);
  20.         IIC1_SCL(GPIO_PIN_SET);
  21.         IIC1_SCL(GPIO_PIN_RESET);
  22. }

  23. void IIC1_NAck()
  24. {
  25.         IIC1_SCL (GPIO_PIN_RESET);
  26.         IIC1_SDA(GPIO_PIN_SET);
  27.                 IIC1_SCL(GPIO_PIN_SET);
  28.         IIC1_SCL(GPIO_PIN_RESET);
  29. }

  30. u8 IIC_Wait_Ack()
  31. {
  32.         u8 count=0;
  33.         IIC1_SDA(GPIO_PIN_SET);
  34.         IIC1_SCL(GPIO_PIN_SET);

  35.         while(IIC1_SDA_IS_HIGH())
  36.         {
  37.                 count++;
  38.                 if(count==250)
  39.                 {
  40.                         IIC_Stop();
  41.                         return 1;
  42.                 }
  43.         }
  44.         IIC1_SCL(GPIO_PIN_RESET);
  45.         return 0;
  46. }

  47. void Write_IIC_Byte(u8 TX)
  48. {
  49.         u8 i=0;

  50.         IIC1_SCL(GPIO_PIN_RESET);
  51.         for(i=0;i<8;i++)
  52.         {
  53.                 if((TX&0x80)>0)
  54.                 {
  55.                         IIC1_SDA(GPIO_PIN_SET);
  56.                 }
  57.                 else
  58.                 {
  59.                         IIC1_SDA(GPIO_PIN_RESET);
  60.                 }
  61.                 TX<<=1;
  62.                 IIC1_SCL(GPIO_PIN_SET);
  63.                 IIC1_SDA(GPIO_PIN_RESET);
  64.         }
  65. }

  66. u8 IIC_Read_Byte(u8 ack)
  67. {
  68.         u8 i=0,res=0;

  69.         for(i=0;i<8;i++)
  70.         {
  71.                 IIC1_SCL(GPIO_PIN_SET);
  72.                
  73.                 res<<=1;
  74.                 if(IIC1_SDA_IS_HIGH ())
  75.                 {
  76.                         res++;
  77.                 }
  78.                 IIC1_SCL(GPIO_PIN_RESET);
  79.         }
  80.         if(ack==0)
  81.         {
  82.                 IIC1_NAck();
  83.         }
  84.         else
  85.         {
  86.                 IIC_Ack();
  87.         }

  88.         return res;
  89. }
复制代码

  1. #include <oled.h>
  2. #include <oledfont.h>

  3. #if OLED_MODE == 2
  4. //2 为IIC通信
  5. //3 为SPI通信

  6. void OLED_WR_Byte(unsigned char dat, unsigned char cmd)
  7. {
  8.         
  9.         if (cmd == OLED_DATA)
  10.                 OLED_WritrDate(dat);
  11.         else
  12.                 OLED_WriteCommand(dat);
  13. }

  14. void OLED_WritrDate(unsigned char dat)
  15. {
  16.         IIC_Start();
  17.         Write_IIC_Byte (0x78);
  18.         IIC_Wait_Ack();
  19.         Write_IIC_Byte(0x40);//数字寄存器
  20.         IIC_Wait_Ack();
  21.         Write_IIC_Byte(dat);
  22.         IIC_Wait_Ack();
  23.   IIC_Stop();
  24. }
  25. void OLED_WriteCommand(unsigned char dat)
  26. {
  27.         IIC_Start();
  28.         Write_IIC_Byte (0x78);
  29.         IIC_Wait_Ack();
  30.         Write_IIC_Byte(0x00);//命令寄存器
  31.         IIC_Wait_Ack();
  32.         Write_IIC_Byte(dat);
  33.         IIC_Wait_Ack();
  34.   IIC_Stop();

  35. }
  36. #else
  37. void OLED_WR_Byte(unsigned char dat, unsigned char cmd)
  38. {
  39.         Write_SPI_Byte(dat, cmd);
  40. }

  41. #endif

  42. void Initial_OLED_ssd1306(void)
  43. {
  44.         //若模拟VCC GND 最好有延时再开始写数据
  45.         //OELD_GPIO_Init();
  46.         OLED_WR_Byte(0xAE,OLED_CMD);//关显示
  47.         
  48.         OLED_WR_Byte(0x00,OLED_CMD);//列地址  低 00-0F
  49.         OLED_WR_Byte(0x10,OLED_CMD);//列地址  高 10-1F
  50.         
  51.         OLED_WR_Byte(0x40,OLED_CMD);//显示起始行  
  52.         OLED_WR_Byte(0xB0,OLED_CMD);//--设置页地址 B0-B7
  53.         
  54.         OLED_WR_Byte(0x81,OLED_CMD); // 对比度  00~FF 越大越亮哦
  55.         OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  56.         
  57.         OLED_WR_Byte(0xA1,OLED_CMD);//段重定义设置
  58.         OLED_WR_Byte(0xA6,OLED_CMD);//正常A6/反向A7 显示模式
  59.         
  60.         OLED_WR_Byte(0xA8,OLED_CMD);//设置驱动路数 1-64
  61.         OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty -----63
  62.         
  63.         OLED_WR_Byte(0xC8,OLED_CMD);//扫描方式 0xC8 0xC0

  64.         OLED_WR_Byte(0xD3,OLED_CMD);//显示偏移offset
  65.         OLED_WR_Byte(0x00,OLED_CMD);//
  66.         
  67.         OLED_WR_Byte(0xD5,OLED_CMD);//设置时钟分频、震荡频率
  68.         OLED_WR_Byte(0x80,OLED_CMD);//[3:0]分频 [7:4]震荡频率
  69.         
  70.         OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  71.         OLED_WR_Byte(0x05,OLED_CMD);//
  72.         
  73.         OLED_WR_Byte(0xD9,OLED_CMD);//预充电期
  74.         OLED_WR_Byte(0xF1,OLED_CMD);//
  75.         
  76.         OLED_WR_Byte(0xDA,OLED_CMD);//引脚配置
  77.         OLED_WR_Byte(0x12,OLED_CMD);//可选的引脚、不可重映射
  78.         
  79.         OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh(没试过)
  80.         OLED_WR_Byte(0x30,OLED_CMD);//0.83*Vcc  0x20: 0.77*Vcc  0x00: 0.65Vcc
  81.         
  82.         OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵
  83.         OLED_WR_Byte(0x14,OLED_CMD);//开启  0x10关闭
  84.         //delay_ms(100);
  85.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  86.                
  87.         OLED_Clear();        
  88.         OLED_Set_Pos(0,0);
  89.         
  90.         
  91. }

  92. //*****************打点函数******************
  93. void OLED_Set_Pos(unsigned char x, unsigned char y)
  94. {         
  95.         OLED_WR_Byte(0xb0+y,OLED_CMD);
  96.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//高地址
  97.         OLED_WR_Byte((x&0x0f),OLED_CMD); //低地址
  98. }



  99.   //*****************显示一个字符******************
  100. void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
  101. {              
  102.         unsigned char gap=0,i=0;        
  103.                 gap=chr-' ';//得到偏移 即差值                        
  104.                 if(Char_Size ==16)
  105.                         {
  106.                                 OLED_Set_Pos(x,y);        
  107.                                 for(i=0;i<8;i++)
  108.                                         OLED_WR_Byte(F8X16[gap*16+i],OLED_DATA);
  109.                                 
  110.                                 OLED_Set_Pos(x,y+1);
  111.                                 for(i=0;i<8;i++)
  112.                                         OLED_WR_Byte(F8X16[gap*16+i+8],OLED_DATA);
  113.                         }
  114.                         else if(Char_Size == 6)
  115.                         {        
  116.                                 OLED_Set_Pos(x,y);
  117.                                 for(i=0;i<6;i++)
  118.                                 OLED_WR_Byte(F6x8[gap][i],OLED_DATA);        
  119.                         }
  120. }
  121. //*****************显示字符串******************
  122. void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char Char_Size)
  123. {
  124.         unsigned char j=0;
  125.         while (chr[j]!='\0')
  126.         {               
  127.                 OLED_ShowChar(x,y,chr[j],Char_Size);
  128.                         x+=8;
  129.                 if(x>120){x=0;y+=2;}
  130.                         j++;
  131.         }
  132. }






  133. //搭配显示数字函数一起用
  134. //返回:m^n
  135. unsigned int oled_pow(unsigned char m,unsigned char n)
  136. {
  137.         unsigned int result=1;         
  138.         while(n--)result*=m;   
  139.         return result;
  140. }


  141. /*
  142. *****************显示数字******************len:数的位数
  143. */
  144. void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size2)
  145. {                 
  146.         unsigned char t,temp;
  147.         unsigned char enshow=0;                                                   
  148.         for(t=0;t<len;t++)
  149.         {
  150.                 temp=(num/oled_pow(10,len-t-1))%10;//取各个位 从高位开始
  151.                
  152.                 if(enshow==0&&t<(len-1))//当len设置过大情况下,用空格替代
  153.                 {
  154.                         if(temp==0)//高位的0无效,空格占据
  155.                         {
  156.                                 if(size2 == 16)
  157.                                         OLED_ShowChar(x+(size2/2)*t,y,' ',size2);//调整间隔、紧挨显示
  158.                                 else if(size2 == 6)
  159.                                         OLED_ShowChar(x+size2*t,y,' ',size2);//调整间隔、紧挨显示
  160.                                 continue; //取下一个位
  161.                         }
  162.                         else
  163.                                 enshow=1; //可以开始显示
  164.                 }
  165.                 //enshow==1后,开始执行以下程序
  166.                 if(size2 == 16)
  167.                         OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); //调整间隔、紧挨显示
  168.                 else if(size2 == 6)
  169.                         OLED_ShowChar(x+size2*t,y,temp+'0',size2);//调整间隔、紧挨显示
  170.         }
  171.         
  172.         
  173.         
  174. }


  175.   //*****************清屏函数******************
  176. void OLED_Clear (void)
  177. {
  178.         unsigned char i, n;
  179.         for (i = 0; i <8; i++)
  180.         {
  181.                 OLED_Set_Pos(0, i);
  182.                 for (n =0; n<128; n++)OLED_WR_Byte(0x00, OLED_DATA);
  183.         }
  184. }


  185. //*****************清除部分屏幕******************
  186. void OLED_Clear_Part(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2 )
  187. {
  188.         unsigned char i, n;
  189.         
  190.         for (i = x1; i < x2; i++)
  191.         {
  192.                 OLED_Set_Pos(x1, i);
  193.                 for (n = y1; n < y2; n++)
  194.                 {
  195.                         OLED_WR_Byte(0x00, OLED_DATA);
  196.                 }
  197.         }
  198. }


  199. //*****************屏幕全满******************
  200. void OLED_Full (void)
  201. {
  202.         unsigned char i, n;
  203.         for (i = 0; i <8; i++)
  204.         {
  205.                 OLED_Set_Pos(0, i);
  206.                 for (n =0; n<128; n++)OLED_WR_Byte(0xff, OLED_DATA);
  207.                
  208.         }
  209. }


  210. //*****************显示图片******************
  211. void ShowBmp (unsigned char *bmp)
  212. {
  213.         int i, n;
  214.         for (i = 0; i <8; i++)
  215.         {
  216.                 OLED_Set_Pos(0, i);
  217.                 for (n =0; n<128; n++)OLED_WR_Byte(bmp[i*128+n], OLED_DATA);
  218.         }
  219. }

  220. // //*****************显示一个汉字******************
  221. //void OLED_Show_A_CHinese(unsigned char x,unsigned char y,unsigned char* ch,unsigned char Char_Size)
  222. //{
  223. //        unsigned char t,i;
  224. //        OLED_Set_Pos(x,y);        
  225. //        for(i=0;i<10;i++)
  226. //        {
  227. //                if(Char_Size == 16 && Chinese_16[i].name[0] == ch[0] && Chinese_16[i].name[1] == ch[1])
  228. //                {
  229. //                        for(t=0;t<16;t++)
  230. //                        {
  231. //                                OLED_WR_Byte(Chinese_16[i].DaTa[t],OLED_DATA);
  232. //                        }
  233. //                        OLED_Set_Pos(x,y+1);
  234. //                        for(t=16;t<32;t++)
  235. //                        {        
  236. //                                OLED_WR_Byte(Chinese_16[i].DaTa[t],OLED_DATA);
  237. //      }               
  238. //                }
  239. //        }
  240. //}


  241. //*****************显示许多汉字******************
  242. //void OLED_Show_Many_Chinese(unsigned char x, unsigned char y, unsigned char *chr, unsigned char Char_Size)
  243. //{
  244. //        unsigned char j = 0, ch[2];
  245. //        while (chr[j]!='\0')
  246. //        {
  247. //                ch[0] = chr[j];
  248. //                ch[1] = chr[j + 1];
  249. //                OLED_Show_A_CHinese(x,y,ch,Char_Size);
  250. //                        x+=16;
  251. //                if(x>120){x=0;y+=2;}
  252. //                        j+=2;
  253. //        }
  254. //}




  255. /* USER CODE BEGIN Header */
  256. /**
  257.   ******************************************************************************
  258.   * @file           : main.c
  259.   * @brief          : Main program body
  260.   ******************************************************************************
  261.   * @attention
  262.   *
  263.   * <h2><center>© Copyright (c) 2021 STMicroelectronics.
  264.   * All rights reserved.</center></h2>
  265.   *
  266.   * This software component is licensed by ST under BSD 3-Clause license,
  267.   * the "License"; You may not use this file except in compliance with the
  268.   * License. You may obtain a copy of the License at:
  269.   *                        opensource.org/licenses/BSD-3-Clause
  270.   *
  271.   ******************************************************************************
  272.   */
  273. /* USER CODE END Header */
  274. /* Includes ------------------------------------------------------------------*/
  275. #include "main.h"
  276. #include "gpio.h"
  277. #include "oled.h"

  278. /* Private includes ----------------------------------------------------------*/
  279. /* USER CODE BEGIN Includes */
  280. #define uchar unsigned char
  281. /* USER CODE END Includes */

  282. /* Private typedef -----------------------------------------------------------*/
  283. /* USER CODE BEGIN PTD */
  284.   uchar ch;
  285. /* USER CODE END PTD */

  286. /* Private define ------------------------------------------------------------*/
  287. /* USER CODE BEGIN PD */
  288. /* USER CODE END PD */

  289. /* Private macro -------------------------------------------------------------*/
  290. /* USER CODE BEGIN PM */

  291. /* USER CODE END PM */

  292. /* Private variables ---------------------------------------------------------*/

  293. /* USER CODE BEGIN PV */

  294. /* USER CODE END PV */

  295. /* Private function prototypes -----------------------------------------------*/
  296. void SystemClock_Config(void);
  297. /* USER CODE BEGIN PFP */

  298. /* USER CODE END PFP */

  299. /* Private user code ---------------------------------------------------------*/
  300. /* USER CODE BEGIN 0 */

  301. /* USER CODE END 0 */

  302. /**
  303.   * @brief  The application entry point.
  304.   * @retval int
  305.   */
  306. int main(void)
  307. {
  308.   /* USER CODE BEGIN 1 */
  309.         
  310.         
  311.         

  312.   /* USER CODE END 1 */

  313.   /* MCU Configuration--------------------------------------------------------*/

  314.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  315.   HAL_Init();

  316.   /* USER CODE BEGIN Init */

  317.   /* USER CODE END Init */

  318.   /* Configure the system clock */
  319.   SystemClock_Config();

  320.   /* USER CODE BEGIN SysInit */

  321.   /* USER CODE END SysInit */

  322.   /* Initialize all configured peripherals */
  323.   MX_GPIO_Init();
  324.   /* USER CODE BEGIN 2 */
  325.         Initial_OLED_ssd1306();

  326.   /* USER CODE END 2 */

  327.   /* Infinite loop */
  328.   /* USER CODE BEGIN WHILE */
  329.   while (1)
  330.   {
  331.                 OLED_ShowNum(0,0,202,3,16);
  332.                 HAL_Delay(500);
  333.     /* USER CODE END WHILE */

  334.     /* USER CODE BEGIN 3 */
  335.   }
  336.   /* USER CODE END 3 */
  337. }

  338. /**
  339.   * @brief System Clock Configuration
  340.   * @retval None
  341.   */
  342. void SystemClock_Config(void)
  343. {
  344.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  345.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  346.   /** Initializes the RCC Oscillators according to the specified parameters
  347.   * in the RCC_OscInitTypeDef structure.
  348.   */
  349.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  350.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  351.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  352.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  353.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  354.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  355.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  356.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  357.   {
  358.     Error_Handler();
  359.   }
  360.   /** Initializes the CPU, AHB and APB buses clocks
  361.   */
  362.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  363.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  364.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  365.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  366.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  367.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  368.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  369.   {
  370.     Error_Handler();
  371.   }
  372. }

  373. /* USER CODE BEGIN 4 */

  374. /* USER CODE END 4 */

  375. /**
  376.   * @brief  This function is executed in case of error occurrence.
  377.   * @retval None
  378.   */
  379. void Error_Handler(void)
  380. {
  381.   /* USER CODE BEGIN Error_Handler_Debug */
  382.   /* User can add his own implementation to report the HAL error return state */
  383.   __disable_irq();
  384.   while (1)
  385.   {
  386.   }
  387.   /* USER CODE END Error_Handler_Debug */
  388. }

  389. #ifdef  USE_FULL_ASSERT
  390. /**
  391.   * @brief  Reports the name of the source file and the source line number
  392.   *         where the assert_param error has occurred.
  393.   * @param  file: pointer to the source file name
  394.   * @param  line: assert_param error line source number
  395.   * @retval None
  396.   */
  397. void assert_failed(uint8_t *file, uint32_t line)
  398. {
  399.   /* USER CODE BEGIN 6 */
  400.   /* User can add his own implementation to report the file name and line number,
  401.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  402.   /* USER CODE END 6 */
  403. }
  404. #endif /* USE_FULL_ASSERT */

  405. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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