lcd12864.c
#include "lcd12864.h"
void LcdSt7565_WriteCmd(cmd) //写入一个命令到12864
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读使能
LCD12864_RS = 0; //select command,选择命令
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = cmd; //put command,写入命令
_nop_();
_nop_();
LCD12864_RW = 1; //command writing,写入命令
}
void LcdSt7565_WriteData(dat) //写入一个数据到12864
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读使能
LCD12864_RS = 1; //select data,选择数据
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = dat; //put data,写入数据
_nop_();
_nop_();
LCD12864_RW = 1; //data writing,写入数据
}
void Lcd12864_Init()
{
uchar i;
LCD12864_RSET = 0;
for(i=0;i<100;i++);
LCD12864_CS = 0;
LCD12864_RSET = 1;
LcdSt7565_WriteCmd(0xE2);
for(i=0;i<100;i++);
LcdSt7565_WriteCmd(0xa0); //表格第8个命令,0xA0段(左右)方向选择正常方向(0xA1为反方向)
LcdSt7565_WriteCmd(0xC8); //表格第15个命令,0xC8普通(上下)方向选择选择反向,0xC0为正常方向
LcdSt7565_WriteCmd(0xA6); //-表格第9个命令,0xA6为设置字体为黑色,背景为白色. 0xA7为设置字体为白色,背景为黑色
//--表格第10个命令,0xA4像素正常显示,0xA5像素全开--//
LcdSt7565_WriteCmd(0xA4); //normal display
//--表格第11个命令,0xA3偏压为1/7,0xA2偏压为1/9--//
LcdSt7565_WriteCmd(0xA2); //bias set 1/9
//--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--//
//--0xF801,选择增压为5X,其实效果差不多--//
LcdSt7565_WriteCmd(0xF8); //Boost ratio set
LcdSt7565_WriteCmd(0x01); //x4
//--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--//
//--选择从0x00到0X3F。用来设置背景光对比度。---/
LcdSt7565_WriteCmd(0x81); //V0 a set
LcdSt7565_WriteCmd(0x23);
//--表格第17个命令,选择调节电阻率--//
LcdSt7565_WriteCmd(0x25); //Ra/Rb set
//--表格第16个命令,电源设置。--//
LcdSt7565_WriteCmd(0x2F);
for (i=0; i<100; i++);
//--表格第2个命令,设置显示开始位置--//
LcdSt7565_WriteCmd(0x40); //start line
//--表格第1个命令,开启显示--//
LcdSt7565_WriteCmd(0xAF); // display on
for (i=0; i<100; i++);
}
void Lcd12864_ClearScreen()
{
uchar i,j;
for(i=0;i<8;i++){
//y轴有64个,一个坐标8位,就总共有8个坐标//
//所有我们所使用的坐标是0xb0到0xb7//
LcdSt7565_WriteCmd(0xb0+i); // y轴坐标
//上面48行,当初始化是0xa1时,x坐标从(0x10,0x04)到(0x18,0x04),一共128位//
//当你的段初始化为0xA0时,X坐标从(0x10,0x00)到(0x18,0x00),一共128位//
LcdSt7565_WriteCmd(0x10); // 我们初始化是0xa0,设置x轴坐标
LcdSt7565_WriteCmd(0x00);
for(j=0;j<128;j++){ //x轴有128位,就一共刷128次,x坐标会自动加1,所以不需要再次设置坐标
LcdSt7565_WriteData(0x00);
}
}
}
#ifdef CHAR_CODE
#include "charcode.h"
uchar Lcd12864_Write16CnCHAR(uchar x,uchar y,uchar *cn)
{
uchar j,x1,x2,wordNum;
if(y > 7){
return 0;
} //Y的坐标只能从0到7,大于则直接返回
if(x > 128){
return 0;
} //X的坐标只能从0到128,大于则直接返回
y += 0xb0; //得到y坐标的值
LcdSt7565_WriteCmd(y); //设置Y坐标
while(*cn !='\0')
{
LcdSt7565_WriteCmd(y);
x1 = (x>>4)&0x0f;
x2 = x&0x0f;
LcdSt7565_WriteCmd(0x10+x1);
LcdSt7565_WriteCmd(0x00+x2); //设置x坐标
for(wordNum=0;wordNum<50;wordNum++) //在字库里搜索,我们这里假设有50个汉字
{
if ((CN16CHAR[wordNum].Index[0] == *cn)
&&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
{
for(j=0;j<32;j++) //写入相应汉字的显示矩阵共32个数
{
if(j==16)
{ //汉字的上面一半写完了,重新定义下面一半的坐标
LcdSt7565_WriteCmd(y+1);
LcdSt7565_WriteCmd(0x10+x1); //x坐标的高4位
LcdSt7565_WriteCmd(0x00+x2); //x坐标的低4位
}
LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]); //显示汉字的上面一半
}
x +=16; //第一个汉字写完了,坐标右移,汉字占的是16*16
}//if查字结束
} //for查字结束
cn +=2; // 指针加2,指向第二个数字
}
return 1;
}
#endif
main.c
#include "reg52.h"
#include "lcd12864.h"
typedef unsigned int u16;
typedef unsigned char u8;
void Delay10ms(uint c)
{
uchar a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void main()
{
u8 i;
Lcd12864_Init();
Lcd12864_ClearScreen();
while(1){
for(i=0;i<8;i+=2){ //两行构成一个汉字,可写四行汉字
Lcd12864_ClearScreen();
Lcd12864_Write16CnCHAR(0,i,"欢迎使用--开拓者");
Delay10ms(100);
}
}
}
lcd12864.h
//自定义头文件名//
#ifndef _lcd12864_h
#define _lcd12864_h
//包含头文件//
#include<reg52.h>
#include<intrins.h>
#define CHAR_CODE
//快捷定义//
#ifndef uint
#define uint unsigned int
#endif
#ifndef uchar
#define uchar unsigned char
#endif
//引脚//
#define DATA_PORT P0
sbit LCD12864_CS = P3^2;
sbit LCD12864_RD = P2^6;
sbit LCD12864_RW = P2^5;
sbit LCD12864_RSET = P3^3;
sbit LCD12864_RS = P2^7;
//函数//
void LcdSt7565_WriteCmd(cmd);
void LcdSt7565_WriteData(dat);
void Lcd12864_Init();
void Lcd12864_ClearScreen();
uchar Lcd12864_Write16CnCHAR(uchar x,uchar y,uchar *cn);
#endif
charcode.h
#ifndef __CHARCODE_H
#define __CHARCODE_H
#ifdef CHAR_CODE
// ------------------ 汉字字模的数据结构定义 ------------------------ //
struct Cn16CharTypeDef // 汉字字模数据结构
{
unsigned char Index[2]; // 汉字内码索引,一个汉字占两个字节
unsigned char Msk[32]; // 点阵码数据(16*16有32个数据)
};
//纵向取模,字节倒序, 宋体小四
struct Cn16CharTypeDef code CN16CHAR[]=
{
/*-- 文字: 欢 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
"欢",0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,
/*-- 文字: 迎 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
"迎",0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,
0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,
/*-- 文字: 使 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
"使",0x80,0x60,0xF8,0x07,0x04,0xE4,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0xE4,0x04,0x00,
0x00,0x00,0xFF,0x00,0x80,0x81,0x45,0x29,0x11,0x2F,0x41,0x41,0x81,0x81,0x80,0x00,
/*-- 文字: 用 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
"用",0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,
/*-- 文字: — --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
"--",0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 开 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
"开",0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 拓 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
"拓",0x10,0x10,0x10,0xFF,0x10,0x90,0x04,0x04,0x84,0xE4,0x9C,0x84,0x84,0x84,0x04,0x00,
0x04,0x44,0x82,0x7F,0x01,0x04,0x02,0x01,0xFF,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,
/*-- 文字: 者 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
"者",0x20,0x20,0x24,0x24,0x24,0x24,0xBF,0x64,0x24,0x34,0x28,0x24,0x22,0x20,0x20,0x00,
0x10,0x08,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,
};
#endif //end of CHAR_CODE
#endif
网友评论