这oled屏在stm32上驱动没问题,同样的程序在msp430无法显示,编译通过都没错

这oled屏在stm32上驱动没问题,同样的程序在msp430无法显示,编译通过都没错,第1张

我做过stm32和msp430,我觉得问题应该出在以下几个方面:

1.I/O配置错误:单片机与屏驱动芯片相连的I/O变了,在程序移植后没有修改,造成数据的读写错误。

2.延时程序:STM32主频是72MHz,而MSP430是8MHZ,相差很多,原来的演示程序不试用430。在对驱动芯片读写过程中调用延时函数,由于延时不匹配,造成读写失败。

如下

#include <msp430x14x.h>

typedef unsigned int uint

typedef unsigned char uchar

#define BIT(x) (1 <<(x))

extern const unsigned char shuzi_table[]

void Send(uchar type,uchar transdata)

/**********液晶控制IO的宏定义*************/

#define cyCS 0//P3.0,片选信号

#define cySID 1//P3.1,串行数据

#define cyCLK 2//P3.2,同步时钟

#define cyPORTP3OUT

#define cyDDR P3DIR

/*******************************************

函数名称:delay_Nus

功能:延时N个us的时间

参数:n--延时长度

返回值 :无

********************************************/

void delay_Nus(uint n)

{

uchar i

for(i = ni >0i--)

_NOP()

}

/*******************************************

函数名称:delay_1ms

功能:延时约1ms的时间

参数:无

返回值 :无

********************************************/

void delay_1ms(void)

{

uchar i

for(i = 150i >0i--) _NOP()

}

/*******************************************

函数名称:delay_Nms

功能:延时N个ms的时间

参数:无

返回值 :无

********************************************/

void delay_Nms(uint n)

{

uint i = 0

for(i = ni >0i--)

delay_1ms()

}

/*******************************************

函数名称:Ini_Lcd

功能:初始化液晶模块

参数:无

返回值 :无

********************************************/

void Ini_Lcd(void)

{

cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS) //相应的位端口设置为输出

delay_Nms(100)//延时等待液晶完成复位

Send(0,0x30) /*功能设置:一次送8位数据,基本指令集*/

delay_Nus(72)

Send(0,0x02) /*DDRAM地址归位*/

delay_Nus(72)

Send(0,0x0c) /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/

delay_Nus(72)

Send(0,0x01) /*清屏,将DDRAM的位址计数器调整为“00H”*/

delay_Nus(72)

Send(0,0x06) /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/

delay_Nus(72)

}

/*******************************************

函数名称:Send

功能:MCU向液晶模块发送1一个字节的数据

参数:type--数据类型,0--控制命令,1--显示数据

transdata--发送的数据

返回值 :无

********************************************/

void Send(uchar type,uchar transdata)

{

uchar firstbyte = 0xf8

uchar temp

uchar i,j = 3

if(type) firstbyte |= 0x02

cyPORT |= BIT(cyCS)

cyPORT &= ~BIT(cyCLK)

while(j >0)

{

if(j == 3) temp = firstbyte

else if(j == 2) temp = transdata&0xf0

else temp = (transdata <<4) &0xf0

for(i = 8i >0i--)

{

if(temp &0x80) cyPORT |= BIT(cySID)

else cyPORT &= ~BIT(cySID)

cyPORT |= BIT(cyCLK)

temp <<= 1

cyPORT &= ~BIT(cyCLK)

}

//三个字节之间一定要有足够的延时,否则易出现时序问题

if(j == 3) delay_Nus(600)

else delay_Nus(200)

j--

}

cyPORT &= ~BIT(cySID)

cyPORT &= ~BIT(cyCS)

}

/*******************************************

函数名称:Clear_GDRAM

功能:清除液晶GDRAM内部的随机数据

参数:无

返回值 :无

********************************************/

void Clear_GDRAM(void)

{

uchar i,j,k

Send(0,0x34) //打开扩展指令集

i = 0x80

for(j = 0j <32j++)

{

Send(0,i++)

Send(0,0x80)

for(k = 0k <16k++)

{

Send(1,0x00)

}

}

i = 0x80

for(j = 0j <32j++)

{

Send(0,i++)

Send(0,0x88)

for(k = 0k <16k++)

{

Send(1,0x00)

}

}

Send(0,0x30) //回到基本指令集

}

/*******************************************

函数名称:Draw_PM

功能:在整个屏幕上画一个图片

参数:ptr--指向保存图片位置的指针

返回值 :无

********************************************/

void Draw_PM(const uchar *ptr)

{

uchar i,j,k

Send(0,0x34) //打开扩展指令集

i = 0x80

for(j = 0j <32j++)

{

Send(0,i++)

Send(0,0x80)

for(k = 0k <16k++)

{

Send(1,*ptr++)

}

}

i = 0x80

for(j = 0j <32j++)

{

Send(0,i++)

Send(0,0x88)

for(k = 0k <16k++)

{

Send(1,*ptr++)

}

}

Send(0,0x36) //打开绘图显示

Send(0,0x30) //回到基本指令集

}

/*******************************************

函数名称:Draw_TX

功能:在液晶上描绘一个16*16的图形

参数:Yaddr--Y地址,

Xaddr--X地址

dp--指向保存图形数据的指针

返回值 :无

********************************************/

void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)

{

uchar j

uchar k = 0

Send(0,0x34) //使用扩展指令集,关闭绘图显示

for(j = 0j <16j++)

{

Send(0,Yaddr++)//Y地址

Send(0,Xaddr) //X地址

Send(1,dp[k++])//送两个字节的显示数据

Send(1,dp[k++])

}

Send(0,0x36) //打开绘图显示

Send(0,0x30) //回到基本指令集模式

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11795610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存