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 <stc12c5410ad.h> #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; i<xms; i++) for(j=0;j<110;j++) {}; } //串行发送一字节数据 void Send_Byte(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { delay(1); P1M0=0; P1M1=1; E_CLK=0; //时钟线拉低 if(dat&0x80) RW_SID=1; else RW_SID=0; E_CLK=1; dat=dat<<1; } } //控制命令 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(dat&0xF0);//高四位 Send_Byte((dat&0x0F)<<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(dat&0xF0);//高四位 Send_Byte((dat&0x0F)<<4);//低四位 RS_CS=0; } void display_1() { uchar a; Send_command(0x80); for(a=0;a<14;a++) { Send_Dat(ts[a]); } } void display_2() { uchar b; Send_command(0x90); for(b=0;b<14;b++) { Send_Dat(tw[b]); } } void display_3() { uchar c; Send_command(0x88); for(c=0;c<14;c++) { Send_Dat(ta[c]); } } void display_4() { uchar d; Send_command(0x98); for(d=0;d<14;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); } ========================================================================= 程序到这里结束,如果有什么想法或者建议请给我留言!