|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 ldy7474 于 2017-1-2 23:41 编辑
终究不是写代码的料磕磕拌拌
研究了一宿终于点亮JLX12864
内牛蛮面
首先感谢萝莉大神一直孜孜不倦
为我等小白传道授业解惑
借用老师的座右铭
为了星辰大海
衷心希望萝莉老大的课程能够继续开展下去
催更催更。。。。。
硬件直接使用的是萝莉3代的。
电路参照3代的LCD电路图即可。
全篇做了详细注释。
沉长的初始化代码
可以省略不看,看了你也记不住
以后要用到,直接贴过去,修改下引脚定义即可。
重点看下主函数里的4段代码然后自己实验一下
多练练手基本上就能玩转了
//调用Display16x16();这段代码就可以显示你自己
//想要显示的汉字 总共4段代码分别显示4个汉字
//括号里的(1,1,)(1,16)等。。。。分别代表你想要
//在12864的那个位置显示汉字有兴趣的同学可以试着修改
//括号里的值然后编译一下看看下载到单片机里
//观察一下假设把Display16x16(1,1,zhon);
//第一段代码括号里的值修改为(5,64,zhon);
//看看多改几次你就明白该怎么玩12864了
//剩下的大家自由发挥哈哈
改明上传源码
#include <reg51.h>
#include <intrins.h>
//#define uchar unsigned char
//#define uint unsigned int
#define u8 unsigned char
#define u16 unsigned int
/*****************************************************/
//STC12 系列新增寄存器
sfr P0M0=0x94;
sfr P1M1=0x91;
sfr P1M0=0x92;
sfr P2M1=0x95;
sfr P2M0=0x96;
sfr P3M0=0xb2;
sfr P3M1=0xb1;
sfr P4M0=0xb4;
sfr P4=0xc0;
sfr P4SW=0xbb;
sfr P5M1=0xC9;
sfr P5M0=0xCA;
sfr IPH=0xb7;
sfr P1ASF=0x9d;
sfr ADC_CONTR=0xbc;
sfr ADC_RES=0xbd;
sfr ADC_RESL=0xbe;
/*******萝莉控LCD引脚***************/
sbit CS=P0^6; //片选 低电平有效
sbit RST=P0^7; //复位 低电平复位复位完成后回到高电平开始工作
sbit RS=P4^6; //指令寄存器 H 1 数据 L 0命令
sbit SDA=P4^5;//串行数据输入信号
sbit SCK=P4^4;//串行时钟 使能信号(E) 到高有效
sbit LEDA=P2^5;
u8 lcd[10];//显示缓存
void Delay1ms() //@12.000MHz
{
u8 i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void DelayMs(u16 i) //延时N毫秒,0~65535ms
{
while(i--) Delay1ms();
}
/*****************液晶屏函数**********************/
/*写指令到 LCD 模块*/
void Command(u8 Data)
{
u8 i;
CS=0;//片选=0
RS=0;//低L 0命令 H 1 数据
for(i=0;i<8;i++)
{
SCK=0;//首先拉低然后传一位数据
if(Data&0x80)//用传过来的数据Data和0x80进行&与运算
//0x80转为2进制1000 0000
// 1与0=0
// 1与1=1
SDA=1;//判断输入的数据是否是1
else SDA=0;//否则SDA为0
SCK=1; //传送结束后拉高锁存一位数据
Data=Data<<=1;//然后data的第7位左移
}
}
/*写数据到 LCD 模块*/
void SendData(u8 Data)
{
u8 i;
CS=0;//片选=0
RS=1;//低L 0命令 H 1 数据
for(i=0;i<8;i++)
{
SCK=0;//首先拉低然后传一位数据
if(Data&0x80)//用传过来的数据Data和0x80进行&与运算
SDA=1;//判断输入的数据是否是1
else SDA=0;//否则SDA为0
SCK=1;//传送结束后拉高锁存一位数据
Data=Data<<=1;//然后data的第7位左移
}
}
/*LCD 模块初始化*/
void InitLCD()
{
CS=0; //片选 低电平有效
RST=0; /*低电平复位*/
DelayMs(2);
RST=1; /*复位完毕*/
DelayMs(10);
Command(0xE2); /*软复位*/
DelayMs(1);
Command(0x2C); /*升压步聚 1*/
Command(0x2E); /*升压步聚 2*/
Command(0x2F); /*升压步聚 3*/
DelayMs(1);
Command(0x23); /*粗调对比度,可设置范围 0x20~0x27*/
Command(0x81); /*微调对比度*/
Command(0x28); /*0x1a,微调对比度的值,可设置范围 0x00~0x3f*/
Command(0xA2); /*1/9 偏压比(bias)*/
Command(0xC8); /*行扫描顺序:从上到下*/
Command(0xA0); /*列扫描顺序:从左到右*/
Command(0x40); /*起始行:第一行开始*/
Command(0xAF); /*开显示*/
CS=1;
}
/*设置液晶屏的显示地址*/
void Address(u8 Page,u8 Column)
{
CS=0;
Column=Column-1;//我们平常所说的第 1 列,
//在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1.
Page=Page-1;
Command(0xB0+Page); //设置页地址。每页是 8 行。
Command(((Column>>4)&0x0F)+0x10); //设置列地址的高 4 位
Command(Column&0x0F); //设置列地址的低 4 位
}
/*全屏清屏*/
void ClearScreen()
{
u8 i,j;
CS=0;
for(i=0;i<9;i++)
{
Address(1+i,1);
for(j=0;j<132;j++)
{
SendData(0x00); /*写数据到 LCD,
//每写完一个 8 位的数据后列地址自动加 1*/
}
}
CS=1;
}
/*显示 12864 点阵图像*/
void Display128x64(u8 *dp)
{
u8 i,j;
CS=0;
for(j=0;j<8;j++)
{
Address(j+1,1);
for (i=0;i<128;i++)
{
SendData(*dp); /*写数据到 LCD,
//每写完一个 8 位的数据
//后列地址自动加 1*/
dp++;
}
}
CS=1;
}
/*显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标*/
void Display16x16(u8 Page,u8 Column,u8 *dp)
{
u8 i,j;
CS=0;
for(j=0;j<2;j++)
{
Address(Page+j,Column);
for (i=0;i<16;i++)
{
SendData(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
dp++;
}
}
CS=1;
}
/***********************液晶屏函数结束****************/
/***液晶屏字库大家可以自由添加自己的字库******/
/***液晶屏字库取模软件zimo221.exe百度大把******/
/***还有详细的使用教程******/
/***取出的字模贴到大括号{}里就OK******/
//终
u8 code zhon[]=
{
0x20,0x30,0xBC,0xEF,0x73,0x10,0x10,0x9F,
0xDF,0x74,0x74,0xDE,0x8E,0x04,0x00,0x00,
0x09,0x1B,0x1B,0x0D,0x05,0x05,0x01,0x09,
0x09,0x1B,0x36,0x34,0x01,0x01,0x01,0x00
};
//于
u8 code yu[]=
{
0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,
0xFE,0x42,0x42,0x43,0x63,0x62,0x40,0x00,
0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x3F,
0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
//点
u8 code diang[]=
{
0x00,0x00,0x00,0xE0,0xE0,0x20,0x20,0x3F,
0x3F,0x24,0x24,0xE4,0xE4,0x04,0x00,0x00,
0x00,0x20,0x38,0x1B,0x03,0x0A,0x3A,0x32,
0x0A,0x3A,0x32,0x0B,0x3B,0x30,0x00,0x00
};
//亮
u8 code liang[]=
{
0x00,0x82,0x82,0xBA,0xBA,0xAA,0xAB,0xAB,
0xAA,0xAA,0xBA,0xBA,0x82,0x82,0x00,0x00,
0x22,0x23,0x21,0x30,0x1E,0x0E,0x02,0x02,
0x1E,0x3E,0x20,0x22,0x23,0x39,0x38,0x00
};
void init () //硬件初始化
{
ADC_CONTR=0x80; //ADC配置
P1ASF=0xff;
LEDA=0;
P4SW=0x70; //允许P4 IO
P2M0=0x20; //推挽点亮背光
}
void main(void)
{ init (); //硬件初始化
LEDA=1; //开启LCD背光
DelayMs(100);//延时100ms等待稳定运行
InitLCD();//LCD初始化
ClearScreen();//调用全屏清屏
while(1)
{
Display16x16(1,1,zhon);//调用显示函数显示16x16汉字、
Display16x16(1,16,yu);//调用显示函数显示16x16汉字、
Display16x16(1,32,diang);//调用显示函数显示16x16汉字、
Display16x16(1,48,liang);//调用显示函数显示16x16汉字、
//调用Display16x16();这段代码就可以显示你自己
//想要显示的汉字 总共4段代码分别显示4个汉字
//括号里的(1,1,)(1,16)等。。。。分别代表你想要
//在12864的那个位置显示汉字有兴趣的同学可以试着修改
//括号里的值然后编译一下看看下载到单片机里
//观察一下假设把Display16x16(1,1,zhon);
//第一段代码括号里的值修改为(5,64,zhon);
//看看多改几次你就明白该怎么玩12864了
//剩下的大家自由发挥哈哈
}
}
|
| |