1.求个单片机控制12864ZB液晶屏的简单程序
2.stm32并口驱动12864,求大神看看我的程序错在哪了?编译通过但是屏幕上没显示~搞了两天了,头疼死我了、
3.12864程序;求高手解释一下:
4.keil中12864编程
5.12864LCM显示器初始化
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驱动程序