原子哥,你好,我把战舰版本的oled程序改成mini版本的程序,改了如下的三个地方,初始化不成功,屏没反应,帮我看看是哪里还没有设置到,哪里导致的问题,谢谢。
编译是可以通过的,硬件也没有问题,因为我把你写的mini版本的程序下载进去,是没问题的,正常显示。
#define OLED_MODE 1
//-----------------OLED端口定义----------------
#define OLED_CS_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_9)
#define OLED_CS_Set() GPIO_SetBits(GPIOC,GPIO_Pin_9)
#define OLED_RST_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_14)
#define OLED_RST_Set() GPIO_SetBits(GPIOB,GPIO_Pin_14)
#define OLED_RS_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_8)
#define OLED_RS_Set() GPIO_SetBits(GPIOC,GPIO_Pin_8)
#define OLED_WR_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_7)
#define OLED_WR_Set() GPIO_SetBits(GPIOC,GPIO_Pin_7)
#define OLED_RD_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_6)
#define OLED_RD_Set() GPIO_SetBits(GPIOC,GPIO_Pin_6)
//PC0~7,作为数据线
//#define DATAOUT(x) GPIO_Write(GPIOC,x);//输出
#define DATAOUT(DataValue) {GPIO_Write(GPIOB,(GPIO_ReadOutputData(GPIOB)&0xff00)|(DataValue&0x00FF));}
//使用4线串行接口时使用
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_0)
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_0)
#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_1)
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_1)
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
以上是oled.h的改动,
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB, ENABLE); //使能PC,D,G端口时钟
#if OLED_MODE==1
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //JTAG-DP 失能 + SW-DP使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Write(GPIOB,0XFFFF);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_6);
GPIO_SetBits(GPIOC, GPIO_Pin_7);
GPIO_SetBits(GPIOC, GPIO_Pin_8);
GPIO_SetBits(GPIOC, GPIO_Pin_9);
#else
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD ; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Write(GPIOB,0X03);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_8);
GPIO_SetBits(GPIOC, GPIO_Pin_9);
#endif
以上是GPIO初始化的改动。
下面是main主函数
int main(void)
{ u8 t;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init(); //LED端口初始化
OLED_Init(); //初始化OLED
OLED_ShowString(0,0, "0.96' OLED TEST");
OLED_ShowString(0,16,"ATOM@ALIENTEK");
OLED_ShowString(0,32,"2010/06/3");
OLED_ShowString(0,48,"ASCII:");
OLED_ShowString(63,48,"CODE:");
OLED_Refresh_Gram();
t=' ';
while(1)
{
OLED_ShowChar(48,48,t,16,1);//显示ASCII字符
OLED_Refresh_Gram();
t++;
if(t>'~')t=' ';
OLED_ShowNum(103,48,t,3,16);//显示ASCII字符的码值
delay_ms(300);
LED0=!LED0;
}
}