求一个12864画点简单程序,和一个画图的简单程序,不要教程 要亲测过可以才行。

求一个12864画点简单程序,和一个画图的简单程序,不要教程 要亲测过可以才行。,第1张

//如果只是要话一个点的话简单,这里是个串口程序

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

/LCD接口定义/

sbit SID = P1^0; //串行数据

sbit SCLK = P1^1; //串行同步时钟

/汉字地址表/

uchar code addr_tab[]={

0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置

0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置

0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置

0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置

};

/n(ms)延时子程序/

void delayms(uint t) //约延时n(ms)

{

uint i;

while(t--)

{

for(i=0;i<125;i++);

}

}

/串行发送一个字节/

void SendByte(uchar Dbyte)

{

uchar i;

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

{

SCLK = 0;

Dbyte=Dbyte<<1; //左移一位

SID = CY; //移出的位给SID

SCLK = 1;

SCLK = 0;

}

}

/写指令/

void Lcd_WriteCmd(uchar Cbyte )

{

//delayms(1);

SendByte(0xf8); //11111,RW(0),RS(0),0

SendByte(0xf0&Cbyte); //高四位

SendByte(0xf0&Cbyte<<4); //低四位(先执行<<)

}

/写数据/

void Lcd_WriteData(uchar Dbyte )

{

//delayms(1);

SendByte(0xfa); //11111,RW(0),RS(1),0

SendByte(0xf0&Dbyte); //高四位

SendByte(0xf0&Dbyte<<4); //低四位(先执行<<)

}

/初始化LCD/

void Lcd_Init(void)

{

delayms(3);

Lcd_WriteCmd(0x30); //选择基本指令集

delayms(1);

Lcd_WriteCmd(0x30); //选择8bit数据流

delayms(1);

Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)

delayms(1);

Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H

delayms(2);

}

void pic_Disp(uchar x,uchar y) //显示一个点

{

Lcd_WriteCmd(0x34); //切换到扩充指令,

Lcd_WriteCmd(0x34);//关闭图形显示

Lcd_WriteCmd(0x80+y); //行地址

Lcd_WriteCmd(0x80+x); //列地址,如果是下半屏这里多加8

Lcd_WriteData(0); //写数据 D15-D8

Lcd_WriteData(1); //写数据 D7-D0

Lcd_WriteCmd(0x36);//打开图形显示

}

void main()

{

Lcd_Init();

pic_Disp(1,1);

while(1);

}

给你测试了,行可行

我有51的程序,可供参考。

#include "lcd12864h"

#include "zikuh"

#include <stringh>

static void delay(uint j) //延时

{

uchar i;

for(; j!=0; j--)

for(i=0; i<100; i++);

}

void busy(void)

{

uchar i;

for(i=0;i<50;i++)

_nop_();

}

void wdata(uchar wdata)

{

busy(); //忙提示

LCD_RW=0;

LCD_DI=1;

P0=wdata;

LCD_EN=0;

LCD_EN=1;

LCD_EN=0;

}

void wcode(uchar wcode)

{

busy();

LCD_RW=0;

LCD_DI=0;

P0=wcode;

LCD_EN=0;

LCD_EN=1;

LCD_EN=0;

}

void subinit()

{

delay(10);

wcode(0xc0);//设置显示初始行

}

//设置显示位置

void setxy(uchar x,uchar y)

{

if ((y>=0)&(y<=63))

{

LCD_CSA=0;

LCD_CSB=1;

}

else //if (y<=127)

{

LCD_CSA=1;

LCD_CSB=0;

}

wcode(0x40|(y%64));

wcode(0xb8|x);

P0=0xff;

}

void wdram(uchar x,uchar y,uchar dd)

{

setxy(x,y);

wdata(dd);

P0=0xff;

LCD_CSA=1;

LCD_CSB=1;

}

//复位

void Lcd_RST(void)

{

//rst=0;

LCD_REST=0;

delay(50);

LCD_REST=1;

Lcd_Clear(0,7,0,128);

wcode(0x3f);//开显示

}

//LCD初始化

void Lcd_Init(void)

{

LCD_POR=0;

Lcd_RST();

LCD_CSA=0;

LCD_CSB=1;

wcode(0x3e);subinit();

LCD_CSA=1;

LCD_CSB=0;

wcode(0x3e);subinit();

Lcd_Clear(0,7,0,128);

LCD_CSA=0;

LCD_CSB=1;

wcode(0x3f);//开显示

LCD_CSA=1;

LCD_CSB=0;

wcode(0x3f);//开显示

}

void Lcd_On(void)

{

LCD_CSA=0;

LCD_CSB=1;

wcode(0x3f);//开显示

LCD_CSA=1;

LCD_CSB=0;

wcode(0x3f);//开显示

}

//LCD 清显示屏

void Lcd_Clear(uchar StartLine,uchar StopLine,uchar StartRow,uchar StopRow)

{

uchar x,y;

for(x=StartLine; x<StopLine+1; x++)

{

for(y=StartRow; y<StopRow; y++)

{

wdram(x,y,0);

}

}

}

//显示一个汉字

void Lcd_DispOneChar(uchar x,uchar y,uchar hz,uchar disp_mode,uchar Width)

{

uchar i;

for(i=0; i<Width; i++)

{

if(disp_mode==WHITE)

{

wdram(x,y+i,(hz+i));

wdram(x+1,y+i,(hz+Width+i));

}

else

{

wdram(x,y+i,0xff-(hz+i));

wdram(x+1,y+i,0xff-(hz+Width+i));

}

}

if(Width==12)

{

for(i=12; i<14; i++)

{

if(disp_mode==WHITE)

{

wdram(x,y+i,0);

wdram(x+1,y+i,0);

}

else

{

wdram(x,y+i,0xff);

wdram(x+1,y+i,0xff);

}

}

for(i=1; i<4; i++)

{

if(disp_mode==WHITE)

{

wdram(x,y-i,0);

wdram(x+1,y-i,0);

}

else

{

wdram(x,y-i,0xff);

wdram(x+1,y-i,0xff);

}

}

}

}

void Lcd_Disp_String(uchar x,uchar y,char pString,uchar disp_mode)

{

uchar i,j;

uchar LineDispCode[16];

//strlen(),为字符串长度测量。

memset(LineDispCode,0,16); //清零数组

strcpy(LineDispCode,pString); //字符串之间的相互复制。

for(i=0; i<strlen(pString); i++)

{

LineDispCode[i]=(pString+i);

}

i=0;

while(LineDispCode[i]!=0)

{

if(LineDispCode[i]>=0xA0)

{

//显示的是汉字

for(j=0; j<ZIMO_NUM; j++)

{

if(GB_12[j]Index[0]==LineDispCode[i] &&

GB_12[j]Index[1]==LineDispCode[i+1])

{

//显示的是汉字

Lcd_DispOneChar(x,y,GB_12[j]Msk,disp_mode,12);

y+=16;

break;

}

}

i+=2;

}

else

{

//显示的是ASCII编码

for(j=0; j<ASC_NUM; j++)

{

if(ASC_12[j]Index==LineDispCode[i])

{

//显示的是汉字

Lcd_DispOneChar(x,y,ASC_12[j]Msk,disp_mode,8);

y+=8;

break;

}

}

i++;

}

if(i>=16)

{

break;

}

}

}

//显示数字

void Lcd_Disp_OneNum(uchar x,uchar y,uchar num,uchar disp_mode)

{

switch(num)

{

case 0:{Lcd_Disp_String(x,y,"0",disp_mode);}break;

case 1:{Lcd_Disp_String(x,y,"1",disp_mode);}break;

case 2:{Lcd_Disp_String(x,y,"2",disp_mode);}break;

case 3:{Lcd_Disp_String(x,y,"3",disp_mode);}break;

case 4:{Lcd_Disp_String(x,y,"4",disp_mode);}break;

case 5:{Lcd_Disp_String(x,y,"5",disp_mode);}break;

case 6:{Lcd_Disp_String(x,y,"6",disp_mode);}break;

case 7:{Lcd_Disp_String(x,y,"7",disp_mode);}break;

case 8:{Lcd_Disp_String(x,y,"8",disp_mode);}break;

case 9:{Lcd_Disp_String(x,y,"9",disp_mode);}break;

default: break;

}

}

//显示二位数。

void Disp_2num(uchar x,uchar y,uchar num,uchar disp_mode)

{

uchar ch[2];

ch[0]=num%10;

ch[1]=num/10;

Lcd_Disp_OneNum(x,y,ch[1],disp_mode);

Lcd_Disp_OneNum(x,y+8,ch[0],disp_mode);

}

//

//显示三位数。

void Disp_3num(uchar x,uchar y,uint num,uchar disp_mode)

{

uchar ch[2];

ch[0]=num/100;

ch[1]=num%100;

if(ch[0])

Lcd_Disp_OneNum(x,y, ch[0],disp_mode);

else

Lcd_Disp_String(x,y," ",disp_mode);

Disp_2num(x,y+8, ch[1],disp_mode);

}

//

//显示四位数。

void Disp_4num(uchar x,uchar y,uint num,uchar disp_mode)

{

uchar ch[4],tmp;

tmp=num/100;

ch[0]=tmp/10;

ch[1]=tmp%10;

tmp=num%100;

ch[2]=tmp/10;

ch[3]=tmp%10;

Lcd_Disp_OneNum(x,y,ch[0],disp_mode);

Lcd_Disp_OneNum(x,y+8,ch[1],disp_mode);

Lcd_Disp_OneNum(x,y+16,ch[2],disp_mode);

Lcd_Disp_OneNum(x,y+24,ch[3],disp_mode);

}

void Lcd_DispIco2(uchar x,uchar y,uchar pIco)//显示老肯图标

{

uchar i,j;

for(i=0; i<4; i++)

{

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

{

wdram(x+i,y+j,pIco);

pIco++;

}

}

}

//

//显示多位数。 disp_mode&0x10==1时,进行即每位都显示,否则大于0的位置不显示。

void Disp_NumGB16(uchar x,uchar y,ulong Data,uchar num,uchar disp_mode)

{

uchar idata ch=0,i,tmp;

for(i=0;i<num;i++)

{

tmp=Data%10;

Data/=10;

if((disp_mode&0x10)||tmp>0||Data>0||num<=2)

Lcd_Disp_OneNum(x,y+(num-i-1)8,tmp,disp_mode%10);

else

Lcd_Disp_String(x,y+(num-i-1)8," ",disp_mode%10);

}

}

/

程序名称:带汉字库的12864液晶显示模块驱动

程序功能:显示字符 、汉字和

开发工具:Kile

MCU型号:AT89S52-24PU

时钟频率:110592MHZ

程序作者:yuan

版权说明:yuan

/

#include<reg52h>

#include "lcdh"

#include "utilh"

sbit E=P1^5;//脉冲使能

sbit RW=P1^6;//读写选择

sbit RS=P1^7;//数据命令选择

sbit rst=P3^6;//12864复位

// 延时ms函数:

// 12864检查状态函数:

void Check12864State(void)

{

P0=0xff;

E=0;//读状态前三控制线的状态

RS=0;

RW=1;

E=1;//拉高,读状态

while((P0&0x80)==0x80);//等待空闲

E=0;//写命令后三控制线的状态

RS=1;

RW=0;

}

// 12864写命令函数:

void Write12864Command( unsigned char com)

{

Check12864State();//检查状态

P0=com;//赋值

E=0;//写命令前三控制线的状态

RS=0;

RW=0;

E=1;//拉高,写命令

E=0;//写命令后三控制线的状态

RS=1;

RW=1;

}

//12864写数据函数:

void Write12864Data( unsigned char dat)

{

Check12864State();//检查状态

P0=dat;//赋值

E=0;//写数据前三控制线的状态

RS=1;

RW=0;

E=1;//拉高,写数据

E=0;//写数据后三控制线的状态

RS=0;

RW=1;

}

//在指定的位置显示字符串(汉字和ASCII码字符)函数:

void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char pstr)

//y-行数值0-3,x-列数值0-7,pstr-字符串指针

//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字

//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符

//为了实现自动换行功能,这个函数比较繁琐

{

unsigned char row,n=0;

Write12864Command(0x30);//基本指令

Write12864Command(0x06);//地址计数器自动加以,光标右移

switch(y)//根据行号选择行地址

{

case 0:row=0x80;break;//第一行首地址

case 1:row=0x90;break;//第二行首地址

case 2:row=0x88;break;//第三行首地址

case 3:row=0x98;break;//第四行首地址

default:;

}

Write12864Command(row+x);//写地址

while(pstr!='\0')

{

Write12864Data(pstr);//写字符

pstr++;

n++;//计数

if((n+x2)==16)//如果一行写完 ,继续写第二行

{

if(y==0) Write12864Command(0x90);//写下一行地址

else if(y==1) Write12864Command(0x88);//写下一行地址

else if(y==2) Write12864Command(0x98);//写下一行地址

else ;

}

else if((n+x2)==32)//如果第二行写完 ,继续写第三行

{

if(y==0) Write12864Command(0x88);//写下一行地址

else if(y==1) Write12864Command(0x98);//写下一行地址

else ;

}

else if((n+x2)==48)//如果第三行写完 ,继续写第四行

{

if(y==0) Write12864Command(0x98);//写下一行地址

else ;

}

else ;

}

}

//模式清屏函数:

void Clear12864Screen()

{

unsigned char i,j;

Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令

Write12864Command(0x36);//使用扩充指令,绘图显示控制

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

//ST7920可控制25632点阵(32行256列),而12864液晶实际的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,

//也就是说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推

{

Write12864Command(0x80|i);//写行地址(垂直地址)

Write12864Command(0x80);//写列地址(水平地址)

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

Write12864Data(0x00);//清屏

}

}

//在任意位置显示任意大小的函数:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char pp)

//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),

//px-宽度,py-高度,pp-指针指向数组

//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐

{

unsigned char i,j,k;

Clear12864Screen();//清屏

if(y<32)//如果起始行在上半屏

{

k=32-y;//算出上半屏的行数

for(i=0;i<k;i++,y++)//上半屏行数

{

Write12864Command(0x80|y);//写行地址(垂直地址)

Write12864Command(0x80|x);//写列地址(水平地址)

for(j=0;j<px/8;j++)

Write12864Data(pp[ipx/8+j]);//写数据

}

y=0;//下半屏起始行,接上半屏继续写数据

for(;i<py;i++,y++)//下半屏剩下的行数

{

Write12864Command(0x80|y);//写行地址(垂直地址)

Write12864Command(0x80|(8+x));//写列地址(水平地址)

for(j=0;j<px/8;j++)

Write12864Data(pp[ipx/8+j]);//写数据

}

}

else //如果起始行在下半屏

{

for(i=0;i<py;i++,y++)//行数

{

Write12864Command(0x80|(y-32));//写行地址(垂直地址)

Write12864Command(0x80|(8+x));//写列地址(水平地址)

for(j=0;j<px/8;j++)

Write12864Data(pp[ipx/8+j]);//写数据

}

}

}

void Clear12864Text()

{

Write12864Command(0x34);//清屏

DelayMs(5);

Write12864Command(0x30);//清屏

DelayMs(5);

Write12864Command(0x01);//清屏

DelayMs(5);

}

//12864初始化函数:

void Initialize12864()

{

rst=0;//复位12864

DelayMs(30);

rst=1;

DelayMs(20);

Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令

Write12864Command(0x08);//显示关

Write12864Command(0x01);//清屏

Write12864Command(0x06);//地址计数器加一、光标右移

Write12864Command(0x0c);//显示开

}

带字库的驱动

//LCD12864字库系列(控制器ST7920A),单片机:89S52,晶振:12M,

//串口连接 与 并口连接 ( 串口时 屏蔽 并行模块)

//并行连接方式,P20-RS,P21-RW,P22-E

#include<reg52h>

#include <intrinsh>

sbit RS=P3^2; //串口时为CS

sbit RW=P3^1; //串口为SID

sbit E=P3^0; //串口为时钟SCLK

sbit stop=P2^2;

sbit PSB=P3^4;

sbit REST=P3^3;

//以下是用<at89x51h>头文件的定义

/

#define RS P2_0

#define RW P2_1 //定义引脚

#define E P2_2

#define PSB P2_3

#define REST P2_4

#define Data P1

#include<at89x51h>

/

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

typedef unsigned int Uint;

typedef unsigned char Uchar;

//字符串例子

//"F1--English",也可以往里面写入汉字码,一个汉字由两个码组成

const Uchar F1English[]={0x46,0x31,0x2d,0x2d,0x45,0x6e,0x67,0x6c,0x69,0x73,0x68,0x00};

const Uchar lengthF1=6; //字符串长度

//汉字,直接可以写入字形

unsigned char code uctech[] = {"有限公司"};

const Uchar lengthCF3=8;

Uchar code TAB1[]={

/-- 调入了一幅图像:D:\公司的文件\程序\未命名11bmp --/

/-- 宽度x高度=128x64 --/

0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x05,0xAE,0x90,0x00,0x00,0x00,0x00,0x00,

0x95,0x55,0x48,0x80,0x00,0x00,0x00,0x00,

0x2B,0x55,0x00,0x00,0x00,0x00,0x00,0x00,

0xA8,0x00,0x22,0x15,0x20,0x00,0x00,0x00,

0x97,0xFB,0x00,0x00,0x00,0x00,0x00,0x00,

0x45,0x55,0x08,0xA0,0x00,0x00,0x00,0x0A,

0x6F,0xF4,0x00,0x00,0x00,0x00,0x00,0x00,

0xB2,0x80,0x40,0x00,0x04,0x40,0x00,0x00,

0xBA,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,

0x4D,0x55,0x15,0x15,0x20,0x00,0x00,0x95,

0xD5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xFF,0xE8,0x40,0x40,0x00,0x00,0x00,0x4A,

0xAA,0x80,0x00,0x00,0x00,0x00,0x00,0x00,

0xFF,0xFF,0x2A,0x00,0x40,0x00,0x00,0x15,

0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xFF,0xFD,0xD0,0xAA,0x01,0x00,0x00,0x25,

0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,

0xFF,0xFF,0xB6,0x00,0x10,0x00,0x01,0x4A,

0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xFF,0xFF,0xFD,0xE8,0x40,0x00,0x00,0x11,

0x00,0x24,0x84,0x00,0x00,0x00,0x00,0x00,

0xAB,0xFF,0xFF,0x55,0x00,0x00,0x00,0x24,

0x02,0x49,0x5E,0xA0,0x00,0x00,0x00,0x00,

0x84,0xBF,0xFF,0xF4,0x88,0x00,0x00,0x00,

0x10,0x05,0xFF,0xF4,0x00,0x00,0x00,0x00,

0x29,0x0B,0xFF,0xFA,0x20,0x00,0x00,0x00,

0x02,0xBF,0xFF,0xFC,0x00,0x00,0x00,0x00,

0x44,0xA0,0x57,0xFD,0x80,0x00,0x00,0x00,

0x08,0x5F,0xFF,0xFF,0x80,0x00,0x00,0x00,

0x91,0x0A,0xAA,0xF6,0x50,0x00,0x00,0x00,

0x41,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,

0x44,0xA0,0x01,0x1B,0x84,0x00,0x00,0x00,

0x26,0xFF,0xFF,0xFF,0x90,0x00,0x00,0x00,

0x11,0x0A,0xAA,0x6D,0x68,0x00,0x00,0x00,

0x0B,0xFB,0xFF,0xEF,0xE0,0x00,0x00,0x00,

0xC4,0xA0,0x01,0x02,0x80,0x00,0x00,0x00,

0x43,0xF1,0xFE,0x63,0xF0,0x00,0x00,0x00,

0x15,0x55,0x54,0x55,0x6A,0x00,0x00,0x00,

0x9F,0xE3,0xFC,0x87,0x38,0x00,0x00,0x00,

0xCA,0xAB,0x91,0x00,0x90,0x00,0x00,0x00,

0x07,0xC1,0xFA,0x2A,0x80,0x00,0x00,0x00,

0x25,0xFF,0xFE,0x95,0x2A,0x00,0x00,0x00,

0x2F,0x13,0xFE,0xFC,0x10,0x00,0x00,0x00,

0x95,0xFF,0xFF,0xC0,0x50,0x00,0x00,0x00,

0x0F,0x41,0xFF,0xF3,0x80,0x00,0x00,0x00,

0x4F,0xFF,0xFF,0xF9,0x2A,0x00,0x00,0x00,

0x9F,0x08,0xFF,0xD4,0x00,0x00,0x00,0x00,

0xB3,0xFF,0xFF,0xFE,0x54,0x80,0x00,0x00,

0x1E,0xA0,0x7F,0xA0,0x00,0x00,0x00,0x00,

0x5F,0xFE,0x7F,0xFE,0xAA,0x00,0x00,0x00,

0x5F,0x57,0xFE,0x00,0x00,0x00,0x00,0x00,

0xAF,0xFD,0x7F,0xFF,0x94,0x80,0x00,0x00,

0x1F,0xFE,0xE8,0x00,0x00,0x00,0x00,0x00,

0x7F,0xFA,0x7F,0x5F,0xCA,0x00,0x00,0x00,

0x3F,0x55,0x00,0x00,0x00,0x00,0x00,0x00,

0xAF,0xF1,0x7F,0xDE,0xF5,0x40,0x00,0x00,

0x1A,0xA0,0x80,0x00,0x00,0x00,0x00,0x00,

0xDF,0xF2,0x3F,0xFC,0xC2,0x00,0x00,0x00,

0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,

0x2F,0xFA,0xBF,0xFF,0xF4,0xA0,0x00,0x00,

0x05,0x42,0x00,0x00,0x00,0x00,0x00,0x00,

0x97,0xFE,0x3F,0xFF,0xE3,0x00,0x00,0x00,

0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x68,0xFF,0xDF,0xD5,0x78,0x40,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x07,0x5F,0xFF,0x48,0x02,0x80,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xD0,0xAA,0xF4,0xA0,0xAA,0x40,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x0A,0x45,0x09,0x05,0x11,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xA1,0x28,0xA0,0x00,0x44,0x40,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x08,0x42,0x04,0x52,0x12,0x80,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xA5,0x09,0x51,0x00,0x48,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x50,0x04,0x4A,0x12,0x80,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xAA,0x05,0x50,0x21,0x48,0x20,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x90,0x02,0x84,0x12,0x80,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xD4,0x05,0x48,0x10,0x48,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x81,0x20,0x00,0x02,0x02,0x80,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xA4,0x84,0x92,0x48,0x94,0x40,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x48,0x10,0x00,0x00,0x21,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};

//这个是在串口时指令和数据之间的延时

/

void delay10US(Uchar x)

{

Uchar k;

for(k=0;k<x;k++);

}

/

const Uchar delay=250; //延时时间常数

static void Wait1ms(void)//延迟1 ms

{

Uchar cnt=0;

while (cnt<delay) cnt++;

}

//延迟n ms

void WaitNms(int n)

{

Uchar i;

for(i=1;i<=n;i++)

Wait1ms();

}

void stopint(void)//中断程序

{

if(stop==0)

while(1);

}

////

//以下是并口时才开的

//读忙标志,

void RDBF(void)

{

Uchar temp;

RS=0; // RS=0

RW=1; // RW=1

while(1)

{

P1=0xFF; //数据线为输入

E=1;

temp=P1;

E=0; // E=0

if ((temp&0x80)==0) break;

}

}

//写数据到指令寄存器

void WRCommand(Uchar comm)

{

RDBF();

RW=0;

P1=comm;

E=1;

E=0;

}

//写数据到数据寄存器

void WRData(Uchar TEMP)

{

RDBF();

RS=1;

RW=0;

P1=TEMP;

E=1;

E=0;

stopint();

}

/////////////////////////////////////////////////////////////////////////////////

//以下是串口时开的读写时序

/void SendByteLCD(Uchar WLCDData)

{

Uchar i;

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

{

if((WLCDData<<i)&0x80)RW=1;

else RW=0;

E=0;

E=1 ;

}

}

SPIWR(Uchar Wdata,Uchar WRS)

{

SendByteLCD(0xf8+(WRS<<1));

SendByteLCD(Wdata&0xf0);

SendByteLCD((Wdata<<4)&0xf0);

}

void WRCommand(Uchar CMD)

{

RS=0;

RS=1;

SPIWR(CMD,0);

delay10US(90);//89S52来模拟串行通信,所以,加上89S52的延时,

}

void WRData(Uchar Data)

{

RS=0;

RS=1;

SPIWR(Data,1);

}

/

//

//初始化LCD-8位接口

void LCDInit(void)

{ // PSB=0; //串口

PSB=1;//并口时选这个,上一行取消

REST=1;

REST=0;

REST=1;

WRCommand(0x30); //基本指令集,8位并行

WRCommand(0x06); //启始点设定:光标右移

WRCommand(0x01); //清除显示DDRAM

WRCommand(0x0C); //显示状态开关:整体显示开,光标显示关,光标显示反白关

WRCommand(0x02); //地址归零

}

//显示数组字符串(显示半宽字型168点阵)

void ShowQQChar(Uchar addr,Uchar english,Uchar count)

{

Uchar i;

WRCommand(addr); //设定DDRAM地址

for(i=0;i<count;)

{

WRData(english[i2]);

WRData(english[i2+1]);

i++;

}

}

//显示连续字串(半宽字符)

void ShowNUMChar(Uchar addr,Uchar i,Uchar count)

{

Uchar j;

for(j=0;j<count;)

{

WRCommand(addr); //设定DDRAM地址

WRData(i+j);

j++;

WRData(i+j);

addr++;

j++;

}

}

//自定义字符写入CGRAM

void WRCGRAM(Uchar data1,Uchar data2,Uchar addr)

{

Uchar i;

for(i=0;i<16;)

{

WRCommand(addr+i); //设定CGRAM地址

WRData(data1);

WRData(data1);

i++;

WRCommand(addr+i); //设定CGRAM地址

WRData(data2);

WRData(data2);

i++;

}

}

//显示自定义的字符,并把这个字符填满全屏1616

void ShowCGChar(Uchar addr,Uchar i)

{

Uchar j;

for(j=0;j<0x20;)

{

WRCommand(addr+j); //设定DDRAM地址

WRData(0x00);

WRData(i);

j++;

}

}

void CLEARGDRAM(void)

{

Uchar j;

Uchar i;

WRCommand(0x34);

WRCommand(0x36);

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

{

WRCommand(0x80+j);

WRCommand(0x80);//X坐标

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

{

WRData(0x00);

}

}

}

//写入GDRAM 绘图,Y是Y绘图坐标,2个字节一行,CLONG是图形长度,以字节

//为单位;HIGHT是图形高度,TAB是图形数据表12864M的图形显示是相当于25632点阵

//由两屏12832上下两屏组成,同一行的下屏的头地址紧接上屏的未地址。

//绘图在串口输入时,会比在并口下的输入要慢一些

void WRGDRAM(Uchar Y1,Uchar clong,Uchar hight,Uchar TAB1)

{

Uint k;

Uchar j;

Uchar i;

WRCommand(0x34);

WRCommand(0x36);

for(j=0;j<hight;j++)//32

{ //先上半屏

WRCommand(Y1+j); //Y总坐标,即第几行

WRCommand(0x80);//X坐标,即横数第几个字节开始写起

for(i=0;i<clong;i++)//

{

WRData(TAB1[clongj+i]);

}

//后下半屏

for(k=0;k<clong;k++)//

{

WRData(TAB1[clong(j+hight)+k]);

}

}

}

void menu(void)

{

LCDInit();

ShowNUMChar(0x80,0x01,0x0f);//显示半宽特殊符号

ShowNUMChar(0x90,0x30,0x0f);//显示半宽0~数字标点

ShowNUMChar(0x88,0x41,0x0f);//显示半宽A~P大写

ShowNUMChar(0x98,0x61,0x0f);//显示半宽a~p小写

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

WRCommand(0x01); //清除显示DDRAM

WRCGRAM(0xff,0x00,0x40);//写入横

WRCGRAM(0x00,0xff,0x50);//写入横2

WRCGRAM(0xaa,0xaa,0x60);//写入竖

WRCGRAM(0x55,0x55,0x70);//写入竖2

ShowCGChar(0x80,0x00);//显示横并填满

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

WRCommand(0x01); //清除显示DDRAM

ShowCGChar(0x80,02);//显示横2并填满

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

WRCommand(0x01); //清除显示DDRAM

ShowCGChar(0x80,04);//显示竖并填满

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

WRCommand(0x01); //清除显示DDRAM

ShowCGChar(0x80,06);//显示竖2并填满

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

WRCommand(0x01); //清除显示DDRAM

WRCGRAM(0x00,0x00,0x40);//清CGRAM1

WRCGRAM(0x00,0x00,0x50);//清CGRAM2

WRCGRAM(0xaa,0x55,0x40);//写入点

WRCGRAM(0x55,0xaa,0x50);//写入点2

ShowCGChar(0x80,00);//显示点并填满

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

WRCommand(0x01); //清除显示DDRAM

ShowCGChar(0x80,02);//显示点2并填满

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

WRCommand(0x01); //清除显示DDRAM

ShowQQChar(0x80,uctech,lengthCF3);//显示'有限公司',以下共四行

ShowQQChar(0x90,uctech,lengthCF3);

ShowQQChar(0x88,uctech,lengthCF3);

ShowQQChar(0x98,uctech,lengthCF3);

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

WRCommand(0x01); //清除显示DDRAM

}

void menu2(void)

{ CLEARGDRAM();

WRGDRAM(0x80,16,32,TAB1);

WaitNms(250); //等待时间

WaitNms(250); //等待时间

stopint();

}

//主函数

void main(void)

{

menu();//初始化及半宽字符和点横竖汉字扫描

menu2();//绘图显示

for(;;)

{;}

}

以上就是关于求一个12864画点简单程序,和一个画图的简单程序,不要教程 要亲测过可以才行。全部的内容,包括:求一个12864画点简单程序,和一个画图的简单程序,不要教程 要亲测过可以才行。、stm32并口驱动12864,求大神看看我的程序错在哪了编译通过但是屏幕上没显示~搞了两天了,头疼死我了、、关于单片机液晶屏LCD12864的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10117512.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存