IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32用PC13PC14PC15、PB4驱动OLED -> 正文阅读

[嵌入式]STM32用PC13PC14PC15、PB4驱动OLED

一、简述

一般PC14、PC15是默认接外部晶振32.86KHZ用的,PB4用来接JTAG调试口,不能用作一般的IO口来使用,如想用做普通IO口,需要加以下这代码

 RCC->APB2ENR|=1<<3;                  //使能PORTB时钟	   	 
 GPIOB->CRL&=0XFFF0FFFF; 
 GPIOB->CRL|=0X00020000;              //PB4 推挽输出   

 RCC->APB2ENR|=1<<4;     	            //使能PORTC时钟  
 RCC->APB2ENR|=1<<0;     	            //使能AFIO时钟	
 GPIOC->CRH&=0X000FFFFF;	            //PC13,14,15设置成输出 2MHz 推挽输出   
 GPIOC->CRH|=0X22200000; 
 PWR->CR|=1<<8;	                        //取消备份区写保护 
 RCC->BDCR&=0xFFFFFFFE;	                //外部低俗振荡器关闭 PC14,PC15成为普通IO	 	
 BKP->CR&=0xFFFFFFFE; 	                //侵入检测TAMPER引脚作为通用IO口使用 
 PWR->CR&=0xFFFFFEFF;	                //备份区写保护
在主函数中要加入以下两段代码
JTAG_Set(JTAG_SWD_DISABLE);     //=====关闭JTAG接口
JTAG_Set(SWD_ENABLE);           //=====打开SWD接口 可以利用主板的SWD接口调试

二、用PC13,PC14,PC15、PB4驱动OLED显示

OLED.C

#include "oled.h"
#include "stdlib.h"
#include "oledfont.h"  	 
#include "delay.h"

u16 JuLi=10;

u8 OLED_GRAM[128][8];	 
void OLED_Refresh_Gram(void)
{
 u8 i,n;		    
 for(i=0;i<8;i++)  
 {  
  OLED_WR_Byte (0xb0+i,OLED_CMD);       //设置页地址(0~7)
  OLED_WR_Byte (0x00,OLED_CMD);         //设置显示位置—列低地址
  OLED_WR_Byte (0x10,OLED_CMD);         //设置显示位置—列高地址   
  for(n=0;n<128;n++)
  {
   OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA); 
  }
 }   
}

void OLED_WR_Byte(u8 dat,u8 cmd)
{	
 u8 i;			  
 if(cmd)
 {
  OLED_RS_Set();
 }
 else 
 {
  OLED_RS_Clr();
 }		  
 for(i=0;i<8;i++)
 {			  
  OLED_SCLK_Clr();
  if(dat&0x80)
  {
   OLED_SDIN_Set();
  }
  else
  { 
   OLED_SDIN_Clr();
  }
  OLED_SCLK_Set();
  dat<<=1;   
 }				 		  
 OLED_RS_Set();   	  
}

void OLED_Display_On(void)
{
 OLED_WR_Byte(0X8D,OLED_CMD);            //SET DCDC命令
 OLED_WR_Byte(0X14,OLED_CMD);            //DCDC ON
 OLED_WR_Byte(0XAF,OLED_CMD);            //DISPLAY ON
}

void OLED_Display_Off(void)
{
 OLED_WR_Byte(0X8D,OLED_CMD);            //SET DCDC命令
 OLED_WR_Byte(0X10,OLED_CMD);            //DCDC OFF
 OLED_WR_Byte(0XAE,OLED_CMD);            //DISPLAY OFF
}

void OLED_Clear(void)  
{  
 u8 i,n;  
 for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00;  
 OLED_Refresh_Gram();                    //更新显示
}

void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
 u8 pos,bx,temp=0;
 if(x>127||y>63)return;                  //超出范围了.
 pos=7-y/8;
 bx=y%8;
 temp=1<<(7-bx);
 if(t)OLED_GRAM[x][pos]|=temp;
 else OLED_GRAM[x][pos]&=~temp;	    
}

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{      			    
 u8 temp,t,t1;
 u8 y0=y;
 chr=chr-' ';                             //得到偏移后的值				   
 for(t=0;t<size;t++)
 {   
  if(size==12)			                      //调用1206字体
  {
   temp=oled_asc2_1206[chr][t];  
  }
  else 							                      //调用1608字体
  {
   temp=oled_asc2_1608[chr][t];		  
  }	                          
  for(t1=0;t1<8;t1++)
  {
   if(temp&0x80)
   {
    OLED_DrawPoint(x,y,mode);
   }
   else
   {
    OLED_DrawPoint(x,y,!mode);
   }
   temp<<=1;
   y++;
   if((y-y0)==size)
   {
	y=y0;
	x++;
	break;
   }
  }  	 
 }          
}

u32 oled_pow(u8 m,u8 n)
{
 u32 result=1;	 
 while(n--)result*=m;    
 return result;
}

void OLED_ShowNumber(u8 x,u8 y,u32 num,u8 len,u8 size)
{         	
 u8 t,temp;
 u8 enshow=0;						   
 for(t=0;t<len;t++)
 {
  temp=(num/oled_pow(10,len-t-1))%10;
  if(enshow==0&&t<(len-1))
  {
   if(temp==0)
   {
	OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
    continue;
   }
   else
   {
    enshow=1;
   } 		 	 
  }
  OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); 
 }
}

void OLED_ShowString(u8 x,u8 y,const u8 *p)
{
 #define MAX_CHAR_POSX 122
 #define MAX_CHAR_POSY 58          
 while(*p!='\0')
 {       
  if(x>MAX_CHAR_POSX){x=0;y+=16;}
  if(y>MAX_CHAR_POSY){y=x=0;OLED_Clear();}
  OLED_ShowChar(x,y,*p,12,1);	 
  x+=8;
  p++;
 }  
}

void Oled_Init(void)
{ 	  	 
 RCC->APB2ENR|=1<<3;                  //使能PORTB时钟	   	 
 GPIOB->CRL&=0XFFF0FFFF; 
 GPIOB->CRL|=0X00020000;              //PB4 推挽输出   

 RCC->APB2ENR|=1<<4;     	            //使能PORTC时钟  
 RCC->APB2ENR|=1<<0;     	            //使能AFIO时钟	
 GPIOC->CRH&=0X000FFFFF;	            //PC13,14,15设置成输出 2MHz 推挽输出   
 GPIOC->CRH|=0X22200000; 
 PWR->CR|=1<<8;	                        //取消备份区写保护 
 RCC->BDCR&=0xFFFFFFFE;	                //外部低俗振荡器关闭 PC14,PC15成为普通IO	 	
 BKP->CR&=0xFFFFFFFE; 	                //侵入检测TAMPER引脚作为通用IO口使用 
 PWR->CR&=0xFFFFFEFF;	                //备份区写保护

 OLED_RST_Clr();
 delay_ms(100);
 OLED_RST_Set(); 
					  
 OLED_WR_Byte(0xAE,OLED_CMD);         //关闭显示
 OLED_WR_Byte(0xD5,OLED_CMD);         //设置时钟分频因子,震荡频率
 OLED_WR_Byte(80,OLED_CMD);           //[3:0],分频因子;[7:4],震荡频率
 OLED_WR_Byte(0xA8,OLED_CMD);         //设置驱动路数
 OLED_WR_Byte(0X3F,OLED_CMD);         //默认0X3F(1/64) 
 OLED_WR_Byte(0xD3,OLED_CMD);         //设置显示偏移
 OLED_WR_Byte(0X00,OLED_CMD);         //默认为0

 OLED_WR_Byte(0x40,OLED_CMD);         //设置显示开始行 [5:0],行数.
													    
 OLED_WR_Byte(0x8D,OLED_CMD);         //电荷泵设置
 OLED_WR_Byte(0x14,OLED_CMD);         //bit2,开启/关闭
 OLED_WR_Byte(0x20,OLED_CMD);         //设置内存地址模式
 OLED_WR_Byte(0x02,OLED_CMD);         //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
 OLED_WR_Byte(0xA1,OLED_CMD);         //段重定义设置,bit0:0,0->0;1,0->127;
 OLED_WR_Byte(0xC0,OLED_CMD);         //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
 OLED_WR_Byte(0xDA,OLED_CMD);         //设置COM硬件引脚配置
 OLED_WR_Byte(0x12,OLED_CMD);         //[5:4]配置
		 
 OLED_WR_Byte(0x81,OLED_CMD);         //对比度设置
 OLED_WR_Byte(0xEF,OLED_CMD);         //1~255;默认0X7F (亮度设置,越大越亮)
 OLED_WR_Byte(0xD9,OLED_CMD);         //设置预充电周期
 OLED_WR_Byte(0xf1,OLED_CMD);         //[3:0],PHASE 1;[7:4],PHASE 2;
 OLED_WR_Byte(0xDB,OLED_CMD);         //设置VCOMH 电压倍率
 OLED_WR_Byte(0x30,OLED_CMD);         //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

 OLED_WR_Byte(0xA4,OLED_CMD);         //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
 OLED_WR_Byte(0xA6,OLED_CMD);         //设置显示方式;bit0:1,反相显示;0,正常显示	    						   
 OLED_WR_Byte(0xAF,OLED_CMD);         //开启显示	 
 OLED_Clear();
} 

void Oled_Show(void)
{	
 OLED_ShowString(20,10,"TEST");                             
 
 OLED_ShowString(0,30,"ADMIN:");
 //OLED_ShowNumber(80,30,(u16)JuLi,4,12);
 OLED_ShowString(0,54,"XIAONANHAI");
	
 OLED_Refresh_Gram();	                        //刷新
}


OLED.H

#ifndef __OLED_H
#define __OLED_H			  	 
#include "sys.h"

//-----------------OLED端口定义---------------- 
#define OLED_RST_Clr() PCout(13)=0            //RST
#define OLED_RST_Set() PCout(13)=1            //RST

#define OLED_RS_Clr() PBout(4)=0              //DC
#define OLED_RS_Set() PBout(4)=1              //DC

#define OLED_SCLK_Clr() PCout(15)=0           //SCL
#define OLED_SCLK_Set() PCout(15)=1           //SCL

#define OLED_SDIN_Clr() PCout(14)=0           //SDA
#define OLED_SDIN_Set() PCout(14)=1           //SDA

#define OLED_CMD  0	//写命令
#define OLED_DATA 1	//写数据
//OLED控制用函数
void OLED_WR_Byte(u8 dat,u8 cmd);	    
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Refresh_Gram(void);		   				   		    
void Oled_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode);
void OLED_ShowNumber(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y,const u8 *p);	

void Oled_Show(void); 
#endif  
	 

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:30:35  更:2021-08-28 09:32:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 18:45:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计