您的位置 首页 > u盘教程

12864显示驱动程序_

1.求个单片机控制12864ZB液晶屏的简单程序

2.stm32并口驱动12864,求大神看看我的程序错在哪了?编译通过但是屏幕上没显示~搞了两天了,头疼死我了、

3.12864程序;求高手解释一下:

4.keil中12864编程

5.12864LCM显示器初始化

12864显示驱动程序_

1,你先学会使用按键,用指示灯的亮灭来表示按键的状态,比如按一次亮,再按一次灭,做到了就会用按键了.

2,再单独调试12864液晶显示,直到会在上面显示字符和文字(这样的资料很多,就百度也有).

3,把1和2步结合起来,并实现更多功能.

求个单片机控制12864ZB液晶屏的简单程序

12864属于点阵式液晶,需要将屏幕上每一个点都刷完才能显示一帧(其实对于点阵式液晶来说也就是一个超大的表示点阵数据的数组),而12864的控制器刷屏幕的速度不够高,因此需要等一段时间才能显示出来,这一点你可以用示波器观察下12864的行同步信号,是比较慢的。

stm32并口驱动12864,求大神看看我的程序错在哪了?编译通过但是屏幕上没显示~搞了两天了,头疼死我了、

在使用下例程序之前要先根据你的电路定义你的IO口

#include <reg52.h>

#include <intrins.h>

#include <string.h>

#include <stdio.h>

#define uchar unsigned char // 8bit, 0 ~ 255

#define uint unsigned int // 16bit, 0 ~ 65,535

#define ulong unsigned long // 32bit, 0 ~ 4,294,967,295

/*-----------建立自定义演示用字符库-----------*/

uchar code CCTAB[]={

/*-- 文字: 实 --*/

/*-- 仿宋_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/

0x02,0x00,0x01,0x00,0x7F,0xFE,0x48,0x02,0x86,0x84,0x02,0x80,0x10,0x80,0x0C,0x80,

0x04,0x84,0xFF,0xFE,0x01,0x00,0x01,0x40,0x02,0x20,0x04,0x10,0x18,0x0C,0x60,0x04,

/*-- 文字: 验 --*/

/*-- 仿宋_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/

0x08,0x40,0xFC,0x40,0x08,0xA0,0x48,0xA0,0x49,0x10,0x4A,0x0E,0x4D,0xF4,0x48,0x00,

0x7C,0x48,0x06,0x48,0x05,0x48,0x1D,0x50,0xE5,0x10,0x44,0x24,0x17,0xFE,0x08,0x00,

/*-- 文字: 中 --*/

/*-- 仿宋_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/

0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE,0x41,0x04,0x41,0x04,0x41,0x04,0x41,0x04,

0x7F,0xFC,0x41,0x04,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00

};

uchar code symbo[]={

/*-- 调入了一幅图像:D:\guoq files\technic support\pic\128x32 Symbo.bmp --*/

/*-- 宽度x高度=128x32 --*/

0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00,

0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x08,0x00,0x80,0x10,0x00,0x00,0x08,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08,

0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8,

0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00,

0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00,

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

};

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

// Delay Routine

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

void delay100us(void) //delay TIMER1*1 ms for 12MHz

{

uchar data i;

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

{

_nop_();

_nop_();

}

}

void delayms( uint m ) // 12MHz Xtal, close to ms value

{

uint j;

uint i;

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

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

_nop_();

}

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

//直接访问方式驱动子程序

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

/*

void SdCmd(uchar Command) //send command{

uchar xdata *wcom_addr;

uchar xdata *rcom_addr;

uchar busy;

do

{

rcom_addr=0x8200;

busy = *rcom_addr&0x80;

}

while (busy==0x80);

wcom_addr=0x8000;

*wcom_addr = Command;

}

void SdData(uchar DData) //send display data

{

uchar xdata *wdata_addr;

uchar xdata *rcom_addr;

uchar busy;

do

{

rcom_addr=0x8200;

busy = *rcom_addr&0x80;

}

while (busy==0x80);

wdata_addr =0x8100;

*wdata_addr = DData;

}

uchar RdData()

{

uchar xdata *rcom_addr;

uchar xdata *rdata_addr;

uchar busy,DData;

do

{

rcom_addr=0x8200;

busy = *rcom_addr&0x80;

}

while (busy==0x80);

rdata_addr =0x8300;

DData =*rdata_addr;

return(DData);

}

*/

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

// 串行通讯方式驱动子程序

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

//uchar bdata transdata; //该变量可为位操作之变量

//sbit transbit = transdata^7;

//sbit SCLK = P3^6;

//sbit SID = P3^7;

//sbit CS = P3^1;

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

/*void SdCmd(uchar Command) //send command

{

uchar i,j,buffur[3];

SCLK = 0;

CS = 1;

buffur[0]=0xf8;

buffur[1]=Command&0xf0;

buffur[2]=(Command&0x0f)<<4;

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

{

transdata=buffur[i];

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

{

SID=transbit;

SCLK=1;

SCLK=0;

transdata=transdata<<1;

}

}

CS=0;

delayms(100);

}

//void SdData(uchar DData) //send display data

{

uchar i,j,buffur[3];

SCLK = 0;

CS = 1;

buffur[0]=0xfa;

buffur[1]=DData&0xf0;

buffur[2]=(DData&0x0f)<<4;

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

{

transdata=buffur[i];

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

{

SID=transbit;

SCLK=1;

SCLK=0;

transdata=transdata<<1;

}

}

CS=0;

delayms(100);

}

*/

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

// 间接控制方式驱动子程序

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

#define LCDBUS P1

sbit RS = P3^1;

sbit RW = P3^7;

sbit E = P3^6;

sbit PSB = P3^4;

sbit RST = P3^5;

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

void SdCmd(uchar Command) //send command

{

// uchar busy;

RS = 0;

/* RW = 1;

do

{

LCDBUS=0xff;

E = 1;

busy = LCDBUS&0x80;

E = 0;

}

while (busy==0x80);*/

RW=0;

LCDBUS = Command;

E = 1;

E = 0;

delay100us();

}

void SdData(uchar DData) //send display data

{

// uchar busy;

RS = 0;

/* RW = 1;

do

{

LCDBUS=0xff;

E = 1;

busy = LCDBUS&0x80;

E = 0;

}

while (busy==0x80);*/

RS=1;

RW=0;

LCDBUS = DData;

E = 1;

E = 0;

delay100us();

}

uchar RdData()

{

// uchar busy;

uchar DData;

RS = 0;

RW = 1;

/* do

{

LCDBUS=0xff;

E = 1;

busy = LCDBUS&0x80;

E = 0;

}

while (busy==0x80);*/

RS=1;

LCDBUS=0xff;

E=1;

DData = LCDBUS;

E = 0;

return(DData);

}

//-----西文写入函数----------------

void PrintASCII(uint x,y,uchar *pstr) //通用函数

{

uint addr;

y=y<<4;

addr=y|0x80+x;

SdCmd(addr);

while(*pstr>0)

{

SdData(*pstr++);

}

}

//----中文写入函数-----------------

void PrintGB(uchar x,y,uchar *pstr)

{

uint addr;

y=y<<4;

addr=y|0x80+x;

SdCmd(addr);

while(*pstr>0)

{

SdData(*pstr++);

delayms(300); //演示用

}

}

//----初始化函数-----------------

void initLCM()

{

RST=0;

delayms(5);

RST=1;

delayms(800);

SdCmd(0x30); /* 设置工作方式(8位总线) */

SdCmd(0x06); /* 设置输入方式 */

SdCmd(0x0f); /* 设置显示方式 */

SdCmd(0x01); /* 清屏 */

delayms(2);

}

//----清屏函数------------------

void ClearRAM()

{

uchar i,j;

// SdCmd(0x01);

// delayms(2);

SdCmd(0x34);

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

{

SdCmd(i|0x80);

SdCmd(0x80);

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

{

SdData(0x00);//

SdData(0x00);

}

}

SdCmd(0x30);

}

//---- 画图函数-----------------------------

void ShowBmp(uchar x,y, width,high,uchar *bmp)

{

uchar i,j;

SdCmd(0x34);

SdCmd(0x36);

for(i=y;i<(y+high);i++)

{

if (i<32)

{

SdCmd(0x80|i);

SdCmd(0x80|x);

}

else

{

SdCmd(0x80|(i-32));

SdCmd(0x80|(x+8));

}

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

{

SdData(*bmp++);

SdData(*bmp++); //

}

}

SdCmd(0x30);

}

//---画点函数----------------

void Draw_Dot(uint x,y)

{

uchar m,n;

uint k;

if(y>=32)

{

y=y-32;

x=x+128;

}

SdCmd(y|0x80);

k=x/16;

SdCmd(k|0x80);

k=0x8000;

k=k>>x%16;

m=RdData();

m=RdData()|k>>8;

n=RdData()|k;

k=x/16;

SdCmd(y|0x80);

SdCmd(k|0x80);

SdData(m);

SdData(n);

}

//--- 画线函数---------------

void Draw_Line(uint x1,y1,x2,y2)

{

uint temp;

int dalt_x,dalt_y,err=0;

if (y1>y2)

{

temp=x1;

x1=x2;

x2=temp;

temp=y1;

y1=y2;

y2=temp;

}

Draw_Dot(x1,y1);

dalt_x=x2-x1;

dalt_y=y2-y1;

if(dalt_x>=0)

{

if(dalt_y>dalt_x)//k>1

{

while(y1<y2)

{

if(err<0)

{

x1=x1+1;

y1=y1+1;

err=err+dalt_y-dalt_x;

}

else

{

y1=y1+1;

err=err-dalt_x;

}

Draw_Dot(x1,y1);

}

}

else // 0<=k=<1

{

if (dalt_y==0)

y1=y1-1;

while(x1<x2)

{

if(err<0)

{

x1=x1+1;

err=err+dalt_y;

}

else

{

y1=y1+1;

x1=x1+1;

err=err+dalt_y-dalt_x;

}

Draw_Dot(x1,y1);

}

}

}

else

{

dalt_x=x1-x2;

if(dalt_y>dalt_x)//k<-1

{

while(y1<y2)

{

if(err<0)

{

x1=x1-1;

y1=y1+1;

err=err+dalt_y-dalt_x;

}

else

{

y1=y1+1;

err=err-dalt_x;

}

Draw_Dot(x1,y1);

}

}

else //0>k>=-1

{

if (dalt_y==0)

y1=y1-1;

while(x1>x2)

{

if(err<0)

{

x1=x1-1;

err=err+dalt_y;

}

else

{

x1=x1-1;

y1=y1+1;

err=err+dalt_y-dalt_x;

}

Draw_Dot(x1,y1);

}

}

}

}

//-----自建字库函数-------------------

void Set_CGRAM(uint num,uchar *pstr)

// num 汉字个数;pstr:汉字数组名

{

uchar i;

SdCmd(0x40);

for(i=0;i<num*32;i++)// 计算数据量

{

SdData(*pstr++);

}

}

//--功能演示函数-------------------------

void quxian1()

{

SdCmd(0x06);

PrintGB( 0,0,"画面不动光标地址加1 指令代码为06");

delayms(3000);

SdCmd(0x01);

delayms(2);

SdCmd(0x04);

PrintGB( 15,0,"画面不动光标地址减1 指令代码为04");

delayms(3000);

SdCmd(0x01);

delayms(2);

SdCmd(0x07);

PrintGB( 0,0,"画面整体左移1 位指令代码为07");

delayms(3000);

SdCmd(0x01);

delayms(2);

SdCmd(0x05);

PrintGB( 15,0,"画面整体右移1 位指令代码为05");

delayms(3000);

SdCmd(0x06);

}

//----做图演示函数------------------------------------

void quxian2()

{

uint code data1[48]={88,89,85,87,89,90,89,89,

88,86,87,86,88,89,90,94,

95,96,96,,99,99,101,103,

101,101,100,103,105,113,113,

117,117,116,114,107,110,114,

113,112,115,112,113,119,120,

125,124,128};

uint a1,b1,a2,b2,i;

SdCmd(0x01);

delayms(2);

SdCmd(0x0c);

PrintASCII(0,0," Time");

PrintASCII(14,1,"Temp");

SdCmd(0x34);

SdCmd(0x36);

Draw_Line(1, 60, 125,60);// 设置坐标 X coordinate

Draw_Line(1, 15, 1, 60);// 设置坐标 Y coordinate

delayms(1000);

a1=1;

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

{

b1=data1[i]-70;

Draw_Dot(a1,b1);//画点

a1=a1+3;

}

delayms(3000);

a1=1;

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

{

b1=data1[i]-70;

b2=data1[i+1]-70;

a2=a1+3;

Draw_Line(a1,b1,a2,b2);//画线

a1=a2;

}

SdCmd(0x32);

}

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

// Main Program

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

void main()

{

SP=0x60;

EA=0;

// PSB=0; //串行接口选择

PSB=1; //并行接口选择

LCDBUS=0xff; // 初始化接口

RW=1;

E =0;

initLCM();

Set_CGRAM(3,CCTAB);

while(1)

{

SdCmd(0x01); /* 清屏 */

delayms(2);

ClearRAM();

//--自定义字符显示

SdCmd(0x0f);

SdCmd(0x82);

SdData(0x00);

SdData(0x00);

SdData(0x00);

SdData(0x02);

SdData(0x00);

SdData(0x04);

//-- 字库字符显示

PrintASCII(8,0," ST7920 演示程序");

delayms(3000);

//-- 图画显示

SdCmd(0x01); /* 清屏 */

delayms(2);

ClearRAM();

ShowBmp(0,0,8,32,symbo);

ShowBmp(0,32,8,32,symbo);

delayms(3000);

//-- 写入功能展示

SdCmd(0x01);

delayms(2);

quxian1();

delayms(3000);

//-- 做图功能展示

ClearRAM();

quxian2(); // 仅在并行接口使用

delayms(3000);

}

}

// end of program

12864程序;求高手解释一下:

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

#include "lcd12864.h"

#include "ziku.h"

#include <string.h>

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);

}

}

keil中12864编程

并行模式下

sbit的就是定义12864的控制管脚

delay的就是延时子程序

busy的就是判断12864是否忙?如果忙就不能读写数据。busy程序中用的sbit定义的量为12864控制时序 要看时序图理解

你后面贴出来的:COM为写命令,dat为写数据,clear为清屏,reset为复位命令也都是更具时序图的

12864LCM显示器初始化

这样的函数要自己编的,就是所谓的驱动,keil连数码管的驱动都没有怎么会有12864的驱动呢,主要原因就是因为这样程序是和硬件连接有很大关系的,比如说你数据口用的P0,别人用的P1,你P0.0连的数据口0,别人就连到数据口1这样的程序根本没办法统一,所以keil不提供硬件的驱动函数

你的LCM应该是COB KS0108的驱动 初始化如下

void Initial()

{

CS1=1; CS2=1; // 高位选通

RES =0;

delay(500);

RES =1;

delay(100);

ComWrite(0x0C0); // start line 00

ComWrite(0x3f); //Display ON

CS1=0; CS2=0; // CS3=1; // CLOSE IC 低位选通,开显示,此为高低选通用程序,以防你的LCM为低选而点不亮

ComWrite(0x3f); //Display ON

}

以下为SPI4线时序写指令

void ComWrite(unsigned char com)

{

unsigned char count;

CS1=1;

A0=0;

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

{

SCL=0;

SDA=(bit)(com&0x80);

SCL=1;

com=com<<1;

}

delay(10);

}

void DatWrite(unsigned char dat)

{

unsigned char count;

CS1=0;

A0=1;

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

{

SCL=0;

SDA=(bit)(dat&0x80);

SCL=1;

dat=dat<<1;

}

delay(10);

}

*/

80时序:

void DatWrite(Uchar dat)//80

{

A0 = 1;

RD1=1;

WR1=0;

P1=dat;

WR1=1;

}

void ComWrite(Uchar com)

{

A0 = 0;

RD1=1;

WR1=0;

P1=com;

WR1=1;

}

有什么不懂的,Q 451526010

本人专业编写各类LCM驱动程序

热门文章