那位老大能提供一个stc单片机驱动oled屏(128*64)的keil c程序,要很简单的就行

那位老大能提供一个stc单片机驱动oled屏(128*64)的keil c程序,要很简单的就行,第1张

#define LCM_RW P2_0 //定义引脚

#define LCM_RS P2_1

#define LCM_E P2_2

#define LCM_Data P1

#define Busy0x80 //用于检测LCM状态字中的Busy标识

#i nclude <at89x51.h>

void WriteDataLCM(unsigned char WDLCM)

void WriteCommandLCM(unsigned char WCLCM,BuysC)

unsigned char ReadDataLCM(void)

unsigned char ReadStatusLCM(void)

void LCMInit(void)

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)

void Delay5Ms(void)

void Delay400Ms(void)

unsigned char code uctech[] = {"uctech"}

unsigned char code net[] = {"uctech.icpcn.com"}

void main(void)

{

Delay400Ms()//启动等待,等LCM讲入工作状态

LCMInit()//LCM初始化

Delay5Ms()//延时片刻(可不要)

DisplayListChar(0, 5, uctech)

DisplayListChar(0, 0, net)

ReadDataLCM()//测试用句无意义

while(1)

}

//写数据

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM()//检测忙

LCM_Data = WDLCM

LCM_RS = 1

LCM_RW = 0

LCM_E = 0//若晶振速度太高可以在这后加小的延时

LCM_E = 0//延时

LCM_E = 1

}

//写指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测

{

if (BuysC) ReadStatusLCM()//根据需要检测忙

LCM_Data = WCLCM

LCM_RS = 0

LCM_RW = 0

LCM_E = 0

LCM_E = 0

LCM_E = 1

}

//读数据

unsigned char ReadDataLCM(void)

{

LCM_RS = 1

LCM_RW = 1

LCM_E = 0

LCM_E = 0

LCM_E = 1

return(LCM_Data)

}

//读状态

unsigned char ReadStatusLCM(void)

{

LCM_Data = 0xFF

LCM_RS = 0

LCM_RW = 1

LCM_E = 0

LCM_E = 0

LCM_E = 1

while (LCM_Data &Busy)//检测忙信号

return(LCM_Data)

}

void LCMInit(void) //LCM初始化

{

LCM_Data = 0

WriteCommandLCM(0x38,0)//三次显示模式设置,不检测忙信号

Delay5Ms()

WriteCommandLCM(0x38,0)

Delay5Ms()

WriteCommandLCM(0x38,0)

Delay5Ms()

WriteCommandLCM(0x38,1)//显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1)//关闭显示

WriteCommandLCM(0x01,1)//显示清屏

WriteCommandLCM(0x06,1)// 显示光标移动设置

WriteCommandLCM(0x0C,1)// 显示开及光标设置

}

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1

X &= 0xF//限制X不能大于15,Y不能大于1

if (Y) X |= 0x40//当要显示第二行时地址码+0x40

X |= 0x80// 算出指令码

WriteCommandLCM(X, 0)//这里不检测忙信号,发送地址码

WriteDataLCM(DData)

}

//按指定位置显示一串字符

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)

{

unsigned char ListLength

ListLength = 0

Y &= 0x1

X &= 0xF//限制X不能大于15,Y不能大于1

while (DData[ListLength]>0x20) //若到达字串尾则退出

{

if (X <= 0xF) //X坐标应小于0xF

{

DisplayOneChar(X, Y, DData[ListLength])//显示单个字符

ListLength++

X++

}

}

}

//5ms延时

void Delay5Ms(void)

{

unsigned int TempCyc = 5552

while(TempCyc--)

}

//400ms延时

void Delay400Ms(void)

{

unsigned char TempCycA = 5

unsigned int TempCycB

while(TempCycA--)

{

TempCycB=7269

while(TempCycB--)

}

你while(1){}里面的程序执行是需要时间的,所以导致会闪,因为我不知道你几个子程序都是怎么写的所以无法详细说,不过基本是在显示子程序【oled_fixeds_2x("\nScore")是这个吧】之后加个延时就可以实现保持,不过如果你要完全不闪的那就在后面加个while(1);


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

原文地址: http://outofmemory.cn/yw/7988852.html

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

发表评论

登录后才能评论

评论列表(0条)

保存