求一个12864的测试程序。单片机是89C52RC型号的,显示屏是FM-12864M-12L型号的。

求一个12864的测试程序。单片机是89C52RC型号的,显示屏是FM-12864M-12L型号的。,第1张

//*****1062液晶双行显示

//****************** bravey ************11.27

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit en=P2^7 //这些管脚要看原理图的,或许我的单片机和你的不一样。

sbit rs=P2^6

sbit rw=P2^5

uchar code d1[]={填入你要现实的字的码值,用取模软件 };

uchar code d2[]={填入你要现实的字的码值,用取模软件 };

void delay(uint z)//延迟函数

{

uint x,y

for(x=zx>0x--)

for(y=0y<110y++)

}

void write_com(uchar com) //送地址函数定义

{

rs=0

rw=0

P0=com

delay(5)

en=1

delay(5)

en=0

}

void write_datt(uchar datt) //送数据

{

rs=1

rw=0

P0=datt

delay(5)

en=1

delay(5)

en=0

}

void lcd_init() //初始化

{

en=0

write_com(0x0c)//整体显示,无光标,不反白

write_com(0x07)//地址指针加一设置,且整体左移

write_com(0x01)//清屏

}

void main()

{

uchar i

lcd_init()

write_com(0x80)//地址指针初始化,第一行显示拼音名字

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

{

write_datt(d1[i])

delay(20)

}

write_com(0x90)

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

{

write_datt(d1[i])//高位

write_datt(d2[i])//低位

delay(20)

}

while(1)

}

这是一个简单的12864显示字的程序。LZ可以参考参考

#include <reg52.h>

#include <intrins.h>

#include <math.h>

//------------定义接口-------------//

sbit RS=P2^5

sbit RW=P2^6

sbit E=P2^7

sbit RES=P2^1

#define Lcd_Bus P1

// P1 接 LCM

#define uchar unsigned char

#define FIRST_ADDR 0

//定义字符/汉字显示起始位置

/*------------------检查忙位-----------------------------*/

void chk_busy()

{

RS=0

RW=1

E=1

Lcd_Bus=0xff

while((Lcd_Bus&0x80)==0x80)

E=0

}

/*------------------延时子程序-----------------------------*/

void delay(unsigned int t)

{

unsigned int i,j

for(i=0i<ti++)

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

}

/*------------------写命令到LCD------------------------------*/

void write_com(unsigned char cmdcode)

{

chk_busy()

RS=0

RW=0

E=1

Lcd_Bus=cmdcode

delay(5)

//------------------在数据写入的时候加入适当的延时

E=0

delay(5)

}

/*-------------------写数据到LCD----------------------------*/

void write_data(unsigned char Dispdata)

{

chk_busy()

RS=1

RW=0

E=1

Lcd_Bus=Dispdata

delay(5)

//------------------在数据写入的时候加入适当的延时

E=0

delay(5)

}

/*------------------初始化LCD屏--------------------------*/

void lcdreset()

{

delay(2000)

write_com(0x30)

delay(10)

//选择基本指令集

write_com(0x30)

//选择8bit数据流

delay(5)

write_com(0x0c)

//开显示(无游标、不反白)

delay(10)

write_com(0x01)

//清除显示,并且设定地址指针为00H

delay(500)

write_com(0x06)

//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位

delay(0)

}

/*------------------显示字符串--------------------------*/

void hzkdis(unsigned char code*s)

{

while(*s>0)

{

write_data(*s)

s++

delay(50)

}

}

/*------------------首屏显示--------------------------*/

void ceshi()

{

write_com(0x01)

//清除显示,并且设定地址指针为00H

delay(5)

write_com(0x80)

//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)

hzkdis("中国计量学院")

write_com(0x90)

//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)

hzkdis("光电学院")

write_com(0x88)

//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)

hzkdis("06光信2")

write_com(0x98)

//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)

hzkdis("测试程序")

}

//------------------清整个GDRAM空间----------------------------

void clrgdram()

{

unsigned char x,y

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

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

{

write_com(0x34)

write_com(y+0x80)

//行地址

write_com(x+0x80)

//列地址

write_com(0x30)

write_data(0x00)

write_data(0x00)

}

}

//------------------------------------------------------------

void clrscreen()

{

write_com(0x01)

delay(10)

}

unsigned char ReadByte(void)

{

unsigned char byReturnValue

chk_busy()

Lcd_Bus=0xff

RS=1

RW=1

E=0

E=1

byReturnValue=Lcd_Bus

E=0

return byReturnValue

}

//增加画点子程序

void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)

{

unsigned char Row,Tier,Tier_bit

unsigned char ReadOldH,ReadOldL

write_com(0x34)

write_com(0x36)

Tier=X>>4

Tier_bit=X&0x0f

if(Y<32)

{

Row=Y

}

else

{

Row=Y-32

Tier+=8

}

write_com(Row+0x80)

write_com(Tier+0x80)

ReadByte()

ReadOldH=ReadByte()

ReadOldL=ReadByte()

write_com(Row+0x80)

write_com(Tier+0x80)

if(Tier_bit<8)

{

switch(Color)

{

case 0 :

ReadOldH&=(~(0x01<<(7-Tier_bit)))

break

case 1 :

ReadOldH|=(0x01<<(7-Tier_bit))

break

case 2 :

ReadOldH^=(0x01<<(7-Tier_bit))

break

default :

break

}

write_data(ReadOldH)

write_data(ReadOldL)

}

else

{

switch(Color)

{

case 0 :

ReadOldL&=(~(0x01<<(15-Tier_bit)))

break

case 1 :

ReadOldL|=(0x01<<(15-Tier_bit))

break

case 2 :

ReadOldL^=(0x01<<(15-Tier_bit))

break

default :

break

}

write_data(ReadOldH)

write_data(ReadOldL)

}

write_com(0x30)

}

void main(void)

{

uchar i,j,colour=1

// uint ADzhi

RW=0

lcdreset()

// ceshi()

clrgdram()

// delay(5000)

clrscreen()

for(i=4i<124i++)

{

j=36-28*sin((i-8)*3.14)

//正弦波显示

DrawPoint(i,j,colour)

}

delay(5000)

while(1)

}

#include "AT89x51.h"

#define uchar unsigned char

#define LCD_Data P2 //DO-D7数据总线

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

sbit LCD_RS=P0^0//定义引脚

sbit LCD_RW=P0^1

sbit LCD_E=P0^2

sbit LCD_PS=P0^3

uchar show[]="12864液晶测试程序0123456789ABCDEFGHIJKLMNOPQ"

/////////延时程序/////////

void delay(second) //second=1时,延时5ms子程序

unsigned char second

{

unsigned char i,j,k

for(i=secondi>0i--)

for(j=20j>0j--)

for(k=248k>0k--)

}

////////读状态////////

void ReadStatusLCD(void)

{

LCD_E=0 //使能 取消选择

LCD_Data=0xFF

LCD_RS=0 //instruction

LCD_RW=1 //read

LCD_E=1 //使能 选择

while (LCD_Data&0x80) //检测忙信号

LCD_E=0

}

////////写指令////////

void WriteCommandLCD(uchar Command,BuysC) //BuysC为0时忽略忙检测

{

LCD_E=0

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

LCD_RS=0

LCD_RW=0

LCD_Data=Command

LCD_E=1

LCD_E=0

}

////////写数据////////

void WriteDataLCD(uchar Data,BuysC)

{

LCD_E=0

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

LCD_RS=1

LCD_RW=0

LCD_Data=Data

LCD_E=1

LCD_E=0

}

void LCDInit(void) //LCD初始化

{

WriteCommandLCD(0x01,1)//清除显示

delay(1)

WriteCommandLCD(0x03,1)//地址归位

delay(1)

WriteCommandLCD(0x0f,1)//开显示

// WriteCommandLCD(0x1c,1)//游标右移

WriteCommandLCD(0x30,1)//基本指令集动作

}

//显示一个汉字

void Display(uchar show[])

{

uchar *p,i=0

p=show

WriteCommandLCD(0x80,1)

while(*p!='\0')

{

WriteDataLCD(*p++,1)

i++

if(i==16) WriteCommandLCD(0x90,1)

else if(i==32) WriteCommandLCD(0x88,1)

else if(i==48) WriteCommandLCD(0x98,1)

}

}

void main(void)

{

LCD_PS=1

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

LCDInit()//LCM初始化

Display(show)

delay(250)

//WriteCommandLCD(0xa7,1)

delay(250)

while(1)

}


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

原文地址:https://www.54852.com/yw/7771369.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存