12864液晶屏是工业控制领域常用的显示部件,以下为老朽自己写的一部分程序以搏一洒;
#include "stc8g.h"
#include "intrins.h"
#define DATA_PORT P0
sbit LCD12864_CS1 = P2^5; //左半屏高有效;
sbit LCD12864_CS2 = P2^4; //右边半屏高有效;
sbit LCD12864_RST = P2^3; //复位信号低有效
sbit LCD12864_RS = P2^0; //指令数据选择信号低指令高数据;
sbit LCD12864_RW = P2^1; //读写信号,(高度低些)高为读低为写;
sbit LCD12864_E = P2^2; //使能操作;
char code hanzi[]=
{
/*-- 文字0: 本 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x10,0x10,0x10,0x10,0xD0,0x30,0xFF,0x30,0xD0,0x10,0x10,0x10,0x10,0x00,0x00,
0x10,0x08,0x04,0x02,0x09,0x08,0x08,0xFF,0x08,0x08,0x09,0x02,0x04,0x08,0x10,0x00,
/*-- 文字1: 机 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,
/*-- 文字2: 地 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0x20,0xFF,0x20,0x20,0x80,0xF8,0x80,0x40,0xFF,0x20,0x10,0xF0,0x00,0x00,
0x10,0x30,0x10,0x0F,0x08,0x08,0x00,0x3F,0x40,0x40,0x5F,0x42,0x44,0x43,0x78,0x00,
/*-- 文字3: 址 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0x20,0xFF,0x20,0x20,0x00,0xF8,0x00,0x00,0xFF,0x40,0x40,0x40,0x00,0x00,
0x10,0x30,0x10,0x0F,0x08,0x48,0x40,0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x00,
/*-- 文字4: 串 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x3C,0x24,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0x24,0x3C,0x00,0x00,0x00,
0x00,0x1F,0x09,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x09,0x1F,0x00,0x00,
/*-- 文字5: 口 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,
0x00,0x00,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,
/*-- 文字6: 波 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x60,0x02,0x0C,0xC0,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0xA8,0x18,0x00,
0x04,0x04,0x7C,0x03,0x80,0x60,0x1F,0x80,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00,
/*-- 文字7: 特 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x3C,0x10,0xFF,0x10,0x10,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x40,0x00,
0x02,0x06,0x02,0xFF,0x01,0x01,0x00,0x02,0x0A,0x12,0x42,0x82,0x7F,0x02,0x02,0x00,
/*-- 文字8: 率 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x14,0xA4,0x44,0x24,0x34,0xAD,0x66,0x24,0x94,0x04,0x44,0xA4,0x14,0x00,0x00,
0x08,0x09,0x08,0x08,0x09,0x09,0x09,0xFD,0x09,0x09,0x0B,0x08,0x08,0x09,0x08,0x00,
/*-- 文字9: 黑方块 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
/*-- 清零10 --*/
/*-- 宽度x高度=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字11;横线图像 --*/
/*-- 宽度x高度=16x16 --*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
};
char code shuzi[]=
{
/*-- 文字10: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字11: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字12: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字13: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字14: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字15: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字16: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字17: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字18: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-- 文字19: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*-- 文字A: 冒号 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
/*-- 文字b: 清空 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/*******************************************************************************
* 函 数 名 : LCD12864_WriteCmd
* 函数功能 : 写入一个命令到12864
* 输 入 : cmd RS=H;数据,L指令
* 输 出 : 无 WR=H: 读 L写;
*******************************************************************************/
void lcd12864_writecmd(unsigned char cmd)
{
unsigned char xh;
LCD12864_E = 1; //E初始为高延时一段时间
LCD12864_RS = 1;
LCD12864_RW = 1;
xh=60;
while(xh--);
LCD12864_E = 0;
xh=20;
while(xh--);
LCD12864_RS = 0;
LCD12864_RW = 0;
xh=40;
while(xh--);
LCD12864_E = 1;
DATA_PORT = cmd;
xh=60;
while(xh--);
LCD12864_E = 0;// 锁存
xh=10;
while(xh--);
}
/*******************************************************************************
* 函 数 名 : Lcd2864WriteData
* 函数功能 : 写入一个数据到12864
* 输 入 : cmd RS=H;数据,L指令
* 输 出 : 无 WR=H: 读 L写;
*******************************************************************************/
void lcd12864_writedat(unsigned char dat)
{
unsigned char xh;
LCD12864_E = 1; //E初始为高延时一段时间
LCD12864_RS = 0;
LCD12864_RW = 1;
xh=60;
while(xh--);
LCD12864_E = 0;
xh=20;
while(xh--);
LCD12864_RS = 1;
LCD12864_RW = 0;
xh=40;
while(xh--);
LCD12864_E = 1;
DATA_PORT = dat;
xh=60;
while(xh--);
LCD12864_E = 0;// 锁存
xh=10;
while(xh--);
}
/*******************************************
***** 函 数 名 : LCD12864_Init ****
***** 函数功能 : 初始化12864 ****
***** 输 入 : 无 ****
***** 输 出 : 无 ****
* ****说 明 : ****
********************************************/
void lcd12864_init(void)
{ unsigned char hczz;
LCD12864_RST = 0;
hczz=20;
while(hczz--);
LCD12864_RST = 1;
hczz=20;
while(hczz--);
lcd12864_writecmd(0x3F); //打开显示;
lcd12864_writecmd(0xC0); // 显示起始行设置;
}
/****************************************************************************************************
* 函 数 名 * :LcdWrite_Word(unsigned char x,unsigned char y,unsigned char *p) *
* 函数功能 * : 在液晶屏指定位置写一个字;p为存放数据的地址;x为纵坐标从上到下取值为0到3; *
* * : y为左右,取值范围为0到f,程序没有检测数值范围注意不要超过; *
* 输 入 * : 页地址,位地址,数据存放位置指针数值; *
* 输 出 * : 无
x代表从上到下的位置从0到3共四行可选;
y代表从左到右的位置:从0到f,共15个位置可选,汉字两个位置组成一个汉字每行能写8个汉字
num:是汉字数组里的排序:数组里面写好了编号;bit fan为布尔值,0代表正写,1代表反白;
*****************************************************************************************************/
void lcdwrite_word(unsigned char x,unsigned char y,unsigned char num,bit fan)
{
unsigned char yin,i,datain;
unsigned char *p;
if(y<=7) //如果字符横坐标在0到7选左面片区
{
LCD12864_CS1 = 1; //选中左片区;
LCD12864_CS2 = 0; //选中左片区;
yin=y;
}
else //如果字符横坐标在8到e选右面片区
{
LCD12864_CS1 = 0; //选中右片区;
LCD12864_CS2 = 1; //选中右片区;
yin=y-8;
}
//写汉字上面8行16列;
lcd12864_writecmd(0xB8+x*2); //设置页面x地址垂直地址上小下大;实际取值范围是b8到bf
lcd12864_writecmd(0x40+(yin<<3)); //设置y地址;水平地址,左边小右边大,取值范围是40到8f;
p=&hanzi[0]+num*0x20;
for(i=0;i<16;i++) //字模软件取得垂直八个点为一个字节,顺序取16列。是汉字的上面
{
datain=*p; //指针数值是程序区域存储的字模数据位置
if(fan==1) //调用之前找到数组用&hanzi[0]数组取得数值
datain=~datain; //赋值给p;p=&shuzu[x];就行 ;
lcd12864_writedat(datain) ;
p++;
}
//写汉字下面16列;
lcd12864_writecmd(0xB8+x*2+1); //设置x地址;上下方向为x
lcd12864_writecmd(0x40+(yin<<3)); //设置y地址;左右方向为y
for(i=0;i<16;i++)
{
datain=*p; //指针没有动继续写下一行;
if(fan==1) //调用之前找到数组用&hanzi[0]数组取得数值
datain=~datain;
lcd12864_writedat(datain) ;
p++;
}
}
/*******************************************************************************
* 函 数 名 : void Write0() *
* 函数功能 : 清屏12864时往数据ram区域写零清屏; *
* 输 入 : 无 *
* 输 出 : 无 *
*******************************************************************************/
void write0(void)
{
unsigned char j,i,xh;
LCD12864_CS1 = 1; //选中左片区;
LCD12864_CS2 = 0; //选中左片区;
xh=5;
while(xh--)
for(i=0;i<8;i++) //x坐标循环设置
{
lcd12864_writecmd(0xB8+i);
lcd12864_writecmd(0x40);
for(j=0;j<64;j++) //y坐标自动加一;
{
lcd12864_writedat(0x00);
}
}
LCD12864_CS1 = 0; //选中右片区;
LCD12864_CS2 = 1; //选中右片区;
xh=5;
while(xh--)
for(i=0;i<8;i++)
{
lcd12864_writecmd(0xB8+i);
lcd12864_writecmd(0x40);
for(j=0;j<64;j++)
{
lcd12864_writedat(0x00);
}
}
}
/**********************************************
* 函 数 名 : void write——unmb() *
* 函数功能 : 在液晶上写数字 *
* 输 入 : 无 *
* 输 出 : 无 *
方法同写汉字一样,本例程全是正显示,需要反白的自己根据写汉字的方法修改程序即可;
***********************************************/
void write_numb(unsigned char x,unsigned char y,unsigned char num)
{
unsigned char yin,i,datain,xh;
unsigned char *p;
if(y<=7) //如果字符横坐标在0到7选左面片区
{
LCD12864_CS1 = 1; //选中左片区;
LCD12864_CS2 = 0; //选中左片区;
xh=5;
while(xh--)
yin=y;
}
else //如果字符横坐标在8到f选右面片区
{
LCD12864_CS1 = 0; //选中右片区;
LCD12864_CS2 = 1; //选中右片区;
xh=5;
while(xh--)
yin=y-8;
} //写数字上面8列;
lcd12864_writecmd(0xB8+x*2); //设置页面x地址垂直地址上小下大;实际取值范围是b8到bf
lcd12864_writecmd(0xB8+x*2);
lcd12864_writecmd(0x40+(yin<<3)); //设置y地址;水平地址,左边小右边大,取值范围是40到8f;
p=&shuzi[0]+num*0x10;
for(i=0;i<8;i++) //字模软件取得垂直八个点为一个字节,顺序取8列。是数字的上面
{
datain=*p; //指针数值是程序区域存储的字模数据位置
//调用之前找到数组用&shuzi[0]数组取得数值
//赋值给p;p=&shuzu[x];就行 ;
lcd12864_writedat(datain) ;
p++;
}
//写数字下面8列;
lcd12864_writecmd(0xB8+x*2+1); //设置x地址;上下方向为x
lcd12864_writecmd(0xB8+x*2+1);
lcd12864_writecmd(0x40+(yin<<3)); //设置y地址;左右方向为y
for(i=0;i<8;i++)
{
datain=*p; //指针没有动继续写下一行;
lcd12864_writedat(datain) ;
p++;
}
}