微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于STC12C5410AD的字库型12864的使用

基于STC12C5410AD的字库型12864的使用

时间:08-13 来源:互联网 点击:

12864和1602还是有一些相似之处的,但是论功能来看,12864还是强大很多的!

12864的操作方式有两种----(串行和并行),就我个人而言是比较倾向于串行的,虽然程序稍微麻烦一点,但是很节省GPIO的资源,这是很重要的,12864也可以实现绘制各种图形的功能,和1602相似,个人认为还是弄一个比较好用的取模软件比较好,生成代码后就可以显示自己想要的图形了(1602的使用里是有介绍的^_^)!

STC12C5410AD这款单片机和51单片机是十分相似的,相对比51而言,它更有了推挽输出功能,AD转换功能等;它内部锁相环也照比51强大的多,最高工作频率可达30+M。它的基本操作方法和51是一样的。

我来简单的介绍一下12864的显示问题:

1、字符产生ROM(CGROM)

里面提供了8192(213)个汉字GB2132宋体

2、显示数据RAM(DDRAM)

内部提供64*2位空间,最多可控制4行16字,也就是16个中文字型显示,当写入显示数据RAM时,可分别显示CGROM和CGRAM的字型,可以用来显示三种字型:半角英文数字型、CGRAM字型和CGROM的中文字型,三种字型的选择,由在DDRAM总写入的编码选择,在0000H—0006H的编码中(其代码分别为0000、0002、0004、0006共四个)将选择CGRAM的自定义字型,02H—7FH的编码中将显示半角英文数字型的字型(也就是ASCII码,大小为16*8),至于A1以上的编码将自动结合下一个位元组,组成两个位元组的编码,从而形成一个中文字型的编码,也就是说显示一个汉字要两个ASCII码显示的位置,即大小为16*16。BIG(A140—D75F),GB(A1A0—F7FF)。

下面我来写一个显示古诗《凉州词》的程序,这个实现起来比较简单,可以参照数据手册来看,无论什么时候,数据手册都是十分重要的,其实就是一款产品的说明书,所以学会自己阅读数据手册是很必要的哦^_^!
由于篇幅有限本文只列出了部分代码,完整的源代码下载地址:http://www.51hei.com/f/1286452.rar 以下是部分代码
#include intrins.h>

sbit E_CLK =P1^2; //时钟使能

sbit RW_SID=P1^1;//串行数据输入、输出端

sbit RS_CS =P1^0;//片选端


//宏定义

#define uint unsigned int

#define uchar unsigned char

//下面是数组定义

uchar code ts[]={"黄河远上白云间"};

uchar code tw[]={"一片孤城万仞山"};

uchar code ta[]={"羌笛何须怨杨柳"};

uchar code tb[]={"春风不度玉门关"};


//延时子函数

void delay(unsigned int xms)

{

unsigned int i,j;

for(i=0; ixms; i++)

for(j=0;j110;j++)

{};

}

//串行发送一字节数据

void Send_Byte(unsigned char dat)

{

unsigned char i;

for(i=0;i8;i++)

{

delay(1);

P1M0=0;

P1M1=1;

E_CLK=0; //时钟线拉低

if(dat0x80)

RW_SID=1;

else

RW_SID=0;

E_CLK=1;

dat=dat1;

}

}

//控制命令

void Send_command(unsigned char dat)

{

P1M0=0;

P1M1=1;

RS_CS=1;

Send_Byte(0xF8);//11111,00,0 RW=0,RS=0 同步标志

Send_Byte(dat0xF0);//高四位

Send_Byte((dat0x0F)4);//低四位

RS_CS=0;

}

//显示数据或单字节字符

void Send_Dat(unsigned char dat)

{

RS_CS=1;

Send_Byte(0xFA);//11111,01,0 RW=0,RS=1

Send_Byte(dat0xF0);//高四位

Send_Byte((dat0x0F)4);//低四位

RS_CS=0;

}


void display_1()

{

uchar a;

Send_command(0x80);

for(a=0;a14;a++)

{

Send_Dat(ts[a]);

}

}


void display_2()

{

uchar b;

Send_command(0x90);

for(b=0;b14;b++)

{

Send_Dat(tw[b]);

}

}

void display_3()

{

uchar c;

Send_command(0x88);

for(c=0;c14;c++)

{

Send_Dat(ta[c]);

}

}

void display_4()

{

uchar d;

Send_command(0x98);

for(d=0;d14;d++)

{

Send_Dat(tb[d]);

}

}


//初始化 LCD

void init(void)

{

P1M0=0;

P1M1=1;

RS_CS=0;

delay(1);

Send_command(0x30);//功能设置,一次送8位数据,基本指令集

Send_command(0x0c);//0000,1100 整体显示,游标on,游标位置on

Send_command(0x01);//0000,0001 清DDRAM

Send_command(0x02);//0000,0010 DDRAM地址归位

Send_command(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC

}


void main(void)

{

init();

delay(1);

display_1();

display_2();

display_3();

display_4();

while(1);

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top