专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于STC12C5410AD的字库型12864的使用

作者:佚名   来源:本站原创   点击数:  更新时间:2011年11月01日   【字体:

   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);

}

=========================================================================

程序到这里结束,如果有什么想法或者建议请给我留言!
关闭窗口

相关文章