【12864】 LCD12864无字库显示汉字【仿真+程序+注意事项】
2016-04-09 17:26
405 查看
一、硬件部分
1.1 整体电路
![](https://img-blog.csdn.net/20160409164130066?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1.2 原件列表
![](https://img-blog.csdn.net/20160409172939617?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二、软件部分
2.1 程序架构
![](https://img-blog.csdn.net/20160409173421135?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.2 主程序
#include <includes.h>
void main()
{
lcd_init(); //初始化
lcd_clear(0); //清屏
lcd_set_line(0); //设置起始行为0
display(1,2,2*16,jiao); //交
display(1,2,3*16,liu); //流
display(2,2,4*16,shi); //使
display(2,2,5*16,yong); //用
while(1);
}
2.3 LCD12864驱动程序
#include <lcd.h>
#include <intrins.h>
#define lcd_databus P2 //LCD的8位数据总线
/****************读“忙”函数**************************/
/*******数据口的最高位DB7==1,则busy*****************/
void lcd_r_busy()
{
P2=0x00;
RS=0;
RW=1;
EN=1;
while(P2&0x80);
EN=0;
}
/****************LCD写命令函数********************/
void lcd_w_cmd(uchar value)
{
lcd_r_busy(); //每次读写操作前都要忙判断
RS=0;
RW=0;
lcd_databus=value;
EN=1; //下降沿锁存写入的数据/命令
_nop_();
_nop_();
EN=0;
}
/****************LCD写数据************************/
void lcd_w_data(uchar value)
{
lcd_r_busy();
RS=1;
RW=0;
lcd_databus=value;
EN=1; //下降沿锁存写入的数据/命令
_nop_();
_nop_();
EN=0;
}
/***************页设置:显示在哪一页******************/
/*************共8页,一页是8行像素点*****************/
void lcd_set_page(uchar page)
{
page=0xb8 | page; //页的首地址为0xb8:page或上0xb8=选择page页
lcd_w_cmd(page);
}
/************行设置:起始在哪一行********************/
/**********每页共8行,一般从0行开始******************/
void lcd_set_line(uchar sline)
{
sline=0xc0 | sline; //起始行地址为0xc0:sline或上0xc0=选择行
lcd_w_cmd(sline);
}
/*************起始列设置+像素点选择********************/
/***********每半片共64列,列值不得大于63***************/
void lcd_set_column(uchar column)
{
column=0x3f & column; //与上列的最大值63:0x3f 可得所选列值<63
column=0x40 | column; //得列的首地址
lcd_w_cmd(column);
}
/*************设置显示的开关********************/
/**********0为关闭显示;1为 开启显示************/
void lcd_on_off(uchar set)
{
set=0x3e | set; //=0011 111x----0x3e为关闭显示;0x3f为开启显示
lcd_w_cmd(set);
}
/*************选择左右半屏显示********************/
/********0-全屏显示;1-左;2-右********************/
/************cs片选端低电平有效********************/
void lcd_cs(uchar sel)
{
switch(sel)
{
case 0:CS1=0; CS2=0; break; //全屏显示
case 1:CS1=0; CS2=1; break; //左显示
case 2:CS1=1; CS2=0; break; //右显示
default:break;
}
}
/*************清屏:选择半屏********************/
/********0-清全屏;1-清左;2-清右***************/
void lcd_clear(uchar sel)
{
uchar i,j;
lcd_cs(sel);
for(i=0;i<8;i++)
{
lcd_set_page(i);
lcd_set_column(0);
for(j=0;j<64;j++)
{
lcd_w_data(0x00); //每列全部写0,列地址指针自动+1
}
}
}
/****************LCD的初始化********************/
void lcd_init()
{
lcd_r_busy();
lcd_cs(0);
lcd_on_off(0); //关显示
lcd_cs(0);
lcd_on_off(1); //开显示
lcd_cs(0);
lcd_clear(0); //清全屏
lcd_set_line(0); //起始行设为0
}
/****************16*16像素的汉字显示程序********************/
void display(uchar cs, uchar page, uchar column, uchar *p)
{
uchar i;
lcd_cs(cs);
lcd_set_page(page); //要在本页写上半个汉字8*16
lcd_set_column(column); //选择起始列
for(i=0;i<16;i++)
{
lcd_w_data(p[i]); //按列输入上半个汉字的编码8*16
}
lcd_set_page(page+1); //要在下一页写下半个汉字8*16
lcd_set_column(column); //选择起始列
for(i=0;i<16;i++)
{
lcd_w_data(p[i+16]); /*按列输入下半个汉字的编码8*16 */
}
}
2.4 字库文件
#ifndef _ZIKU_H_
#define _ZIKU_H_
// 交
const uchar code jiao[]={
0x08,0x08,0x88,0x68,0x08,0x08,0x09,0x0E,0x08,0x08,0x88,0x28,0x48,0x88,0x08,0x00,
0x80,0x81,0x40,0x40,0x21,0x22,0x14,0x08,0x14,0x22,0x41,0x40,0x80,0x81,0x80,0x00,
};
// 流
const uchar code liu[]={
0x10,0x60,0x02,0x8C,0x00,0x44,0x64,0x54,0x4D,0x46,0x44,0x54,0x64,0xC4,0x04,0x00,
0x04,0x04,0x7E,0x01,0x80,0x40,0x3E,0x00,0x00,0xFE,0
4000
x00,0x00,0x7E,0x80,0xE0,0x00,
};
// 使
const uchar code shi[]={
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,
};
// 用
const uchar code yong[]={
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,
};
#endif
三、仿真结果
![](https://img-blog.csdn.net/20160409173457526?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1.1 整体电路
1.2 原件列表
二、软件部分
2.1 程序架构
2.2 主程序
#include <includes.h>
void main()
{
lcd_init(); //初始化
lcd_clear(0); //清屏
lcd_set_line(0); //设置起始行为0
display(1,2,2*16,jiao); //交
display(1,2,3*16,liu); //流
display(2,2,4*16,shi); //使
display(2,2,5*16,yong); //用
while(1);
}
2.3 LCD12864驱动程序
#include <lcd.h>
#include <intrins.h>
#define lcd_databus P2 //LCD的8位数据总线
/****************读“忙”函数**************************/
/*******数据口的最高位DB7==1,则busy*****************/
void lcd_r_busy()
{
P2=0x00;
RS=0;
RW=1;
EN=1;
while(P2&0x80);
EN=0;
}
/****************LCD写命令函数********************/
void lcd_w_cmd(uchar value)
{
lcd_r_busy(); //每次读写操作前都要忙判断
RS=0;
RW=0;
lcd_databus=value;
EN=1; //下降沿锁存写入的数据/命令
_nop_();
_nop_();
EN=0;
}
/****************LCD写数据************************/
void lcd_w_data(uchar value)
{
lcd_r_busy();
RS=1;
RW=0;
lcd_databus=value;
EN=1; //下降沿锁存写入的数据/命令
_nop_();
_nop_();
EN=0;
}
/***************页设置:显示在哪一页******************/
/*************共8页,一页是8行像素点*****************/
void lcd_set_page(uchar page)
{
page=0xb8 | page; //页的首地址为0xb8:page或上0xb8=选择page页
lcd_w_cmd(page);
}
/************行设置:起始在哪一行********************/
/**********每页共8行,一般从0行开始******************/
void lcd_set_line(uchar sline)
{
sline=0xc0 | sline; //起始行地址为0xc0:sline或上0xc0=选择行
lcd_w_cmd(sline);
}
/*************起始列设置+像素点选择********************/
/***********每半片共64列,列值不得大于63***************/
void lcd_set_column(uchar column)
{
column=0x3f & column; //与上列的最大值63:0x3f 可得所选列值<63
column=0x40 | column; //得列的首地址
lcd_w_cmd(column);
}
/*************设置显示的开关********************/
/**********0为关闭显示;1为 开启显示************/
void lcd_on_off(uchar set)
{
set=0x3e | set; //=0011 111x----0x3e为关闭显示;0x3f为开启显示
lcd_w_cmd(set);
}
/*************选择左右半屏显示********************/
/********0-全屏显示;1-左;2-右********************/
/************cs片选端低电平有效********************/
void lcd_cs(uchar sel)
{
switch(sel)
{
case 0:CS1=0; CS2=0; break; //全屏显示
case 1:CS1=0; CS2=1; break; //左显示
case 2:CS1=1; CS2=0; break; //右显示
default:break;
}
}
/*************清屏:选择半屏********************/
/********0-清全屏;1-清左;2-清右***************/
void lcd_clear(uchar sel)
{
uchar i,j;
lcd_cs(sel);
for(i=0;i<8;i++)
{
lcd_set_page(i);
lcd_set_column(0);
for(j=0;j<64;j++)
{
lcd_w_data(0x00); //每列全部写0,列地址指针自动+1
}
}
}
/****************LCD的初始化********************/
void lcd_init()
{
lcd_r_busy();
lcd_cs(0);
lcd_on_off(0); //关显示
lcd_cs(0);
lcd_on_off(1); //开显示
lcd_cs(0);
lcd_clear(0); //清全屏
lcd_set_line(0); //起始行设为0
}
/****************16*16像素的汉字显示程序********************/
void display(uchar cs, uchar page, uchar column, uchar *p)
{
uchar i;
lcd_cs(cs);
lcd_set_page(page); //要在本页写上半个汉字8*16
lcd_set_column(column); //选择起始列
for(i=0;i<16;i++)
{
lcd_w_data(p[i]); //按列输入上半个汉字的编码8*16
}
lcd_set_page(page+1); //要在下一页写下半个汉字8*16
lcd_set_column(column); //选择起始列
for(i=0;i<16;i++)
{
lcd_w_data(p[i+16]); /*按列输入下半个汉字的编码8*16 */
}
}
2.4 字库文件
#ifndef _ZIKU_H_
#define _ZIKU_H_
// 交
const uchar code jiao[]={
0x08,0x08,0x88,0x68,0x08,0x08,0x09,0x0E,0x08,0x08,0x88,0x28,0x48,0x88,0x08,0x00,
0x80,0x81,0x40,0x40,0x21,0x22,0x14,0x08,0x14,0x22,0x41,0x40,0x80,0x81,0x80,0x00,
};
// 流
const uchar code liu[]={
0x10,0x60,0x02,0x8C,0x00,0x44,0x64,0x54,0x4D,0x46,0x44,0x54,0x64,0xC4,0x04,0x00,
0x04,0x04,0x7E,0x01,0x80,0x40,0x3E,0x00,0x00,0xFE,0
4000
x00,0x00,0x7E,0x80,0xE0,0x00,
};
// 使
const uchar code shi[]={
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,
};
// 用
const uchar code yong[]={
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,
};
#endif
三、仿真结果
相关文章推荐
- 细看网络仿真工具
- 基于Arduino+LabVIEW的串口控制LED亮灭
- 基于Protues的Arduino学习笔记01-Arduino UNO实验板设计
- 如何迅速画好接线图
- 各类一二线品牌LCD(液晶显示器)的工厂模式的打开方法
- LCD液晶显示器高压板维修代换实例[显示器维修实例15个]
- LCD驱动移植--x35
- TOSSIM仿真之网络配置
- 深圳证券交易所 上机试题答案
- ARM11 s3c6410系列教程之五:LCD操作
- ADS-B雷达显示终端 5.6
- ADS-B 雷达 显示终端5.8
- ADS-B显示终端5.9
- ADS-B显示终端6.0
- ADS-B显示终端6.4
- ADS-B显示终端6.8 基本操作视频 更新
- repast 仿真
- MPLAB X IDE和Proteus联调方法
- 音响系统中的一个简单的mute电路
- LCD_TEST.C之Glib_Line函数简化