求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。

求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。,第1张

绝对好用的串口程序

sbit SID=P2^1//12864数据

sbit SCLK=P2^2//12864时钟

init()

{

write(0,0x30) //8 位介面,基本指令集

write(0,0x0c) //显示打开,光标关,反白关

write(0,0x01) //清屏,将DDRAM的地址计数器归零

delaynms(10)

write(0,0x80)for(i=0i<16i++) write(1,datas11[i])

write(0,0x90)for(i=0i<16i++) write(1,datas2[i])

write(0,0x88)for(i=0i<16i++) write(1,datas3[i])

write(0,0x98)for(i=0i<16i++) write(1,datas4[i])

}

/**********************12864*************************/

void delaynms(unsigned int di) //延时

{

unsigned int da,db

for(da=0da<dida++)

for(db=0db<10db++)

}

void sendbyte(unsigned char bbyte) //发送一个字节

{

unsigned char i

for(i=0i<8i++)

{

SID=bbyte&0x80//取出最高位

SCLK=1

SCLK=0

bbyte<<=1//左移

}

}

void write(bit start, unsigned char ddata) //写指令或数据

{

unsigned char start_data,Hdata,Ldata

if(start==0) start_data=0xf8 //写指令

else start_data=0xfa //写数据

Hdata=ddata&0xf0 //取高四位

Ldata=(ddata<<4)&0xf0 //取低四位

sendbyte(start_data) //发送起始信号

delaynms(5)//延时是必须的

sendbyte(Hdata) //发送高四位

delaynms(1) //延时是必须的

sendbyte(Ldata) //发送低四位

delaynms(1) //延时是必须的

}

/*void lcdinit(void) //初始化LCD

{

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

//PSB=0//串口驱动模式

// RESET=0delaynms(1)RESET=1// 复位LCD

// CS=1

write(0,0x30) //8 位介面,基本指令集

write(0,0x0c) //显示打开,光标关,反白关

write(0,0x01) //清屏,将DDRAM的地址计数器归零

}*/

这个问题有两种回答:

1,你问的不对。你其实想问的是,怎么使用串口,修改12864屏幕上的内容。这个网上有很多程序。随便看一下就好。

2,你沉迷于技术了。模拟本身提供的是八位的输出,你偏偏要自己用UART串口去驱动。这就好比:是要用到PWM的时候,明明单片机内部已经有了集成的模块。配置定时器就可以输出完美的PWM。可你觉得,这样太简单了。于是,你用两个定时器去实现:一个定时,一个控制输出频率。

效果不好还不错,而且浪费资源。

再举个极端的例子,你想实现一个很简单的for循环,使用高级的语言(就C语言来说,一下就好),

但是,你偏偏要用二进制0,1来写。

你觉得,这样才牛B,你才是比较厉害的人。

--------------------------------

喜欢请点赞,不喜欢,另说

俺有串行方式的.供你参考.

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

系统名称:12864串行驱动程序

创建人:w418781840 日期:2008,7,18

功能描述:

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

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

#define com 0

#define dat 1

sbit cs =P2^4

sbit sid=P2^2

sbit sck=P2^0

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

函数名称:

函数功能:

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

void delay1ms(uint x)

{

uint i,j

for(i=0i<xi++)

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

}

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

函数名称:写字节函数

函数功能:

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

void w_12864byte(uchar byte)

{

uchar i

for(i=0i<8i++)

{

sck=0

byte<<=1

sid=CY

sck=1

}

}

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

函数名称:读字节函数

函数功能:

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

uchar r_12864byte(void)

{

uchar i,temp1,temp2

temp1 = 0

temp2 = 0

for(i=0i<8i++)

{

temp1=temp1<<1

sck = 0

sck = 1

sck = 0

if(sid) temp1++

}

for(i=0i<8i++)

{

temp2=temp2<<1

sck = 0

sck = 1

sck = 0

if(sid) temp2++

}

return ((0xf0&temp1)+(0x0f&temp2))

}

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

函数名称:检测忙函数

函数功能:

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

void c_12864busy( void )

{

do

w_12864byte(0xfc) //11111,RW(1),RS(0),0

while(0x80&r_12864byte())

}

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

函数名称:写入函数

函数功能:

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

void w_12864(bit dat_com,uchar byt)

{

uchar temp

if(dat_com==0) //为零,写入指令

temp=0xf8//11111,RS(0),RW(0),0

else//否则,写入数据

temp=0xfa//11111,RS(1),RW(0),0

cs=1

c_12864busy()

w_12864byte(temp)

w_12864byte(byt&0xf0)//写入高四位

w_12864byte(byt<<4) //写入低四位

cs=0

}

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

函数名称:初始化函数

函数功能:

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

void init_12864(void)

{

w_12864(com,0x30)//基本指令功能.

w_12864(com,0x0c)//显示打开,关光标,反白关.

w_12864(com,0x01)//清屏指令.

w_12864(com,0x06)//AC自动加一

}

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

函数名称:绘图函数

函数功能:

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

void w_12864bmp(uchar *puts)

{

uint x=0

uchar i,j

w_12864(com,0x34)//扩展指令

w_12864(com,0x36)//打开绘图

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

{

w_12864(com,0x80|i)//列32行,双屏结构中上半屏

w_12864(com,0x80)//X地址坐标,自动加1.

for(j=0j<16j++) //16*8=256

w_12864(dat,puts[x++])

}

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

{

w_12864(com,0x80|i)

w_12864(com,0x88)//下半屏

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

w_12864(dat,puts[x++])

}

}

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

函数名称:清屏函数

函数功能:

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

void lcd_clear(void)

{

w_12864(com,0x30)

w_12864(com,0x01)

}

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

函数名称:

函数功能: 清图形函数

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

void BMP_clear( void )

{

uchar i,j

w_12864(com,0x34) //8Bit扩充指令集,即使是36H也要写两次

w_12864(com,0x36) //绘图ON,基本指令集里面36H不能开绘图

for(i=0i<32i++)//12864实际为256x32

{

w_12864(com,0x80|i) //行位置

w_12864(com,0x80) //列位置

for(j=0j<32j++)//256/8=32 byte

w_12864(dat,0)

}

}

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

函数名称:

函数功能: 清文本函数

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

void TXT_Clear( void )

{

uchar i

w_12864(com,0x30) //8BitMCU,基本指令集合

w_12864(com,0x80) //AC归起始位

for(i=0i<64i++)

w_12864(dat,0x20)

}

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

函数名称:

函数功能:

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

void w_12864Poss(uchar x,uchar y,uchar *buff)

{

uchar addr,i=0

if(x==1)addr=0x80

if(x==2)addr=0x90

if(x==3)addr=0x88

if(x==4)addr=0x98

addr=addr+y

w_12864(com,0x30)

w_12864(com,addr)

while(buff[i]!='\0')

{

w_12864(dat,buff[i])

i++

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存