新手上路
- 积分
- 35
- 金钱
- 35
- 注册时间
- 2020-8-14
- 在线时间
- 7 小时
|
楼主 |
发表于 2020-8-15 10:25:53
|
显示全部楼层
- /* Includes ------------------------------------------------------------------*/
- #include "stm8s.h"
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- #define OLED_CMD 0 //写命令
- #define OLED_DATA 1 //写数据
- #define HARDWARE_SPI
- #define STM8S003
- static void delay(__IO uint32_t nCount)
- {
- /* Decrement nCount value */
- while (nCount != 0)
- {
- nCount--;
- }
- }
- void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
- {
-
- if(cmd == 1)GPIO_WriteHigh(GPIOC, GPIO_PIN_4);//PC4是D/C线
- else GPIO_WriteLow(GPIOC,GPIO_PIN_4);
-
- #ifdef HARDWARE_SPI
-
- while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
- SPI_SendData(dat);
-
- #else
- u8 i;
- for(i=0;i<8;i++)
- {
- GPIO_WriteLow(GPIOC,GPIO_PIN_5);
- if(dat&0x80)GPIO_WriteHigh(GPIOC,GPIO_PIN_6);
- else GPIO_WriteLow(GPIOC,GPIO_PIN_6);
- GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
- dat<<=1;
- }
- #endif
- }
- void OLED_WriteCmd(uint8_t dat){
- OLED_WR_Byte(dat,OLED_CMD);
- }
- void gpioInit(){
- // GPIO_DeInit(GPIOC);
- // GPIO_DeInit(GPIOB);
- GPIO_Init(GPIOC, GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);//D/C
- GPIO_Init(GPIOB, GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//RST
- GPIO_Init(GPIOC, GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//SCK
- GPIO_Init(GPIOC, GPIO_PIN_6,GPIO_MODE_OUT_PP_HIGH_FAST);//MOSI
- }
- void OLEDInit(){
- GPIO_WriteHigh(GPIOC, GPIO_PIN_4);
- GPIO_WriteLow(GPIOB,GPIO_PIN_5);
- delay(0xFFF);
- GPIO_WriteHigh(GPIOB, GPIO_PIN_5);
- delay(0xFFF);
- 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); //开启显示
- }
- //SPI初始化
- void spiInit(){
- #ifdef HARDWARE_SPI
- SPI_DeInit();
- SPI_Init(SPI_FIRSTBIT_MSB,
- SPI_BAUDRATEPRESCALER_8,
- SPI_MODE_MASTER,
- SPI_CLOCKPOLARITY_HIGH,
- SPI_CLOCKPHASE_2EDGE,
- SPI_DATADIRECTION_1LINE_TX,
- SPI_NSS_SOFT,(uint8_t)0x07);
- SPI_Cmd(ENABLE);
- #endif
- }
- //屏幕刷新
- void OLED_Refresh_Gram(void)
- {
- uint8_t i,n;
- for(i=0;i<8;i++)
- {
- OLED_WR_Byte (0xb0+i,OLED_CMD);
- OLED_WR_Byte (0x00,OLED_CMD);
- OLED_WR_Byte (0x10,OLED_CMD);
- for(n=0;n<128;n++)OLED_WR_Byte(0xFF,OLED_DATA);
- }
- }
- void main(void)
- {
- CLK_HSICmd(ENABLE);
- CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
- CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
- CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI,ENABLE);
- // CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,CLK_SOURCE_HSI,DISABLE,CLK_CURRENTCLOCKSTATE_ENABLE);
- gpioInit();
- spiInit();
- delay(400);
- OLEDInit();
-
- while(1) OLED_Refresh_Gram();
- }
复制代码 |
|