msp430上怎么控制12864的OLED液晶呢?OLED是4线串行控制的。有51单片机例程,可是移植到430上一直不亮
答案:1 悬赏:70 手机版
解决时间 2021-04-20 04:23
- 提问者网友:动次大次蹦擦擦
- 2021-04-19 14:39
msp430上怎么控制12864的OLED液晶呢?OLED是4线串行控制的。有51单片机例程,可是移植到430上一直不亮
最佳答案
- 五星知识达人网友:掌灯师
- 2021-04-19 16:16
如下
#include
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);
#define cyCS 0 //P3.0,片选信号
#define cySID 1 //P3.1,串行数据
#define cyCLK 2 //P3.2,同步时钟
#define cyPORT P3OUT
#define cyDDR P3DIR
void delay_Nus(uint n)
{
uchar i;
for(i = n;i > 0;i--)
_NOP();
}
void delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
void delay_Nms(uint n)
{
uint i = 0;
for(i = n;i > 0;i--)
delay_1ms();
}
void Ini_Lcd(void)
{
cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS); //相应的位端口设置为输出
delay_Nms(100); //延时等待液晶完成复位
Send(0,0x30);
delay_Nus(72);
Send(0,0x02);
delay_Nus(72);
Send(0,0x0c);
delay_Nus(72);
Send(0,0x01);
delay_Nus(72);
Send(0,0x06);
delay_Nus(72);
}
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 = 8;i > 0;i--)
{
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);
}
void Clear_GDRAM(void)
{
uchar i,j,k;
Send(0,0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x80);
for(k = 0;k < 16;k++)
{
Send(1,0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x88);
for(k = 0;k < 16;k++)
{
Send(1,0x00);
}
}
Send(0,0x30); //回到基本指令集
}
void Draw_PM(const uchar *ptr)
{
uchar i,j,k;
Send(0,0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x80);
for(k = 0;k < 16;k++)
{
Send(1,*ptr++);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x88);
for(k = 0;k < 16;k++)
{
Send(1,*ptr++);
}
}
Send(0,0x36); //打开绘图显示
Send(0,0x30); //回到基本指令集
}
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
uchar j;
uchar k = 0;
Send(0,0x34); //使用扩展指令集,关闭绘图显示
for(j = 0;j < 16;j++)
{
Send(0,Yaddr++); //Y地址
Send(0,Xaddr); //X地址
Send(1,dp[k++]); //送两个字节的显示数据
Send(1,dp[k++]);
}
Send(0,0x36); //打开绘图显示
Send(0,0x30); //回到基本指令集模式
}追问这个是12864LCD的,我也有,不过还没有在OLED上试过,你试过可以么?追答点不亮或许是电压问题呀追问问题解决了 可能开发板有问题 换了一块launchpad OK了
#include
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);
#define cyCS 0 //P3.0,片选信号
#define cySID 1 //P3.1,串行数据
#define cyCLK 2 //P3.2,同步时钟
#define cyPORT P3OUT
#define cyDDR P3DIR
void delay_Nus(uint n)
{
uchar i;
for(i = n;i > 0;i--)
_NOP();
}
void delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
void delay_Nms(uint n)
{
uint i = 0;
for(i = n;i > 0;i--)
delay_1ms();
}
void Ini_Lcd(void)
{
cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS); //相应的位端口设置为输出
delay_Nms(100); //延时等待液晶完成复位
Send(0,0x30);
delay_Nus(72);
Send(0,0x02);
delay_Nus(72);
Send(0,0x0c);
delay_Nus(72);
Send(0,0x01);
delay_Nus(72);
Send(0,0x06);
delay_Nus(72);
}
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 = 8;i > 0;i--)
{
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);
}
void Clear_GDRAM(void)
{
uchar i,j,k;
Send(0,0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x80);
for(k = 0;k < 16;k++)
{
Send(1,0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x88);
for(k = 0;k < 16;k++)
{
Send(1,0x00);
}
}
Send(0,0x30); //回到基本指令集
}
void Draw_PM(const uchar *ptr)
{
uchar i,j,k;
Send(0,0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x80);
for(k = 0;k < 16;k++)
{
Send(1,*ptr++);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x88);
for(k = 0;k < 16;k++)
{
Send(1,*ptr++);
}
}
Send(0,0x36); //打开绘图显示
Send(0,0x30); //回到基本指令集
}
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
uchar j;
uchar k = 0;
Send(0,0x34); //使用扩展指令集,关闭绘图显示
for(j = 0;j < 16;j++)
{
Send(0,Yaddr++); //Y地址
Send(0,Xaddr); //X地址
Send(1,dp[k++]); //送两个字节的显示数据
Send(1,dp[k++]);
}
Send(0,0x36); //打开绘图显示
Send(0,0x30); //回到基本指令集模式
}追问这个是12864LCD的,我也有,不过还没有在OLED上试过,你试过可以么?追答点不亮或许是电压问题呀追问问题解决了 可能开发板有问题 换了一块launchpad OK了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯