proteus 中AMPIRE12864仿真

先说AMPIRE12864的组成:
可以看成是两个64*64的屏幕,
通过CS1,CS2两个片选信号来控制,这两个都是低有效(元件面板上没反映出来这一点)

RST是低有效,所以直接连到电源了(开始因为没连这个整了半天没反映。。。)
实际应用的时候应该还是要像单片机那样做个复位电路。

DBx,是并行的指令/数据输入/输出端。

E是使能信号。控制时,应先置1,然后设置DB,最后E回0,结束一轮的信息交换。

RW,低为写入,高为读出。

RS , 低为指令,高为数据。

然后要说的就是坐标的问题:
对于每一片(左边和右边),分成8行*64列,这是光标(想成一根8位的竖线)的放置单位。
而每一行的高度为8位,从上到下对应的是DB的低位到高位


每写一个数据,光标自动向后移动,到行末的时候返回下一行行首
(就跟平时用的控制台类似)

有了这些之后,如果能拿到相应的手册,知道指令是怎么回事,就可以实现想要的功能了。

 

电路:



程序:

//并行控制的AMPIRE12864
#include <reg51.h>

sbit CS1 = P3 ^ 4 ;    //片选1
sbit CS2 = P3 ^ 3 ;    //片选2
sbit RW = P3 ^ 1 ;    //读写,高为读,低为写
sbit RS = P3 ^ 2 ;    //代码/数据,低为代码,高为数据
sbit E = P3 ^ 0 ;    //使能信号
sfr DB = 0xA0 ; //P2地址,数据端口

typedef unsigned char uchar ;

void busy_wait();
void select(uchar i);
void send(uchar type , uchar content);
#define send_cmd(x) send(0,(x))
#define send_data(x) send(1,(x))
void init();
void setpos(uchar row , uchar col);

void main(){
    uchar i;
   
    select(2);
    init();
    //设置显示位置
     setpos(2,30);
    //连续输出32个字节
    for ( i = 0 ; i < 32 ; i ++ )send_data(0x0f);
    setpos(3,30);
    for ( i = 0 ; i < 32 ; i ++ )send_data(0xf0);       
    while(1);
}

//片选,0为第一片,1为第2片
void select(uchar i){
    switch(i){
    case 0 : CS1 = 0 ; CS2 = 1 ;break;
    case 1 : CS1 = 1 ; CS2 = 0 ;break;
    case 2 : ;
    default: CS1 = 0 ; CS2 = 0 ;
    }
}

//忙等待,直到LCD处理完为止
//每个命令前都应当调用
//以保证不会紊乱
void busy_wait(){
    uchar tmp;
    for (tmp = 0 ; tmp < 200 ; tmp ++ );
//(2009.5.21补充,return前面是延迟,后面是读忙标志。
//正常的话,两种方式都可以达到效果的。
//只要在写命令前保证前面的命令已经执行完就行了。
//由于仿真的故障,这里就用了延迟。
//欢迎在硬件上做出来的同学更正下面的读忙标志代码段。

    return ;
    RS = 0 ;
    RW = 1 ;
    do{
        //因为读状态完成时间为0us,
        //所以可以连续不断地读
        DB = 0x00 ;
        E = 1 ;
        //最高位为BF,1为空闲,0为忙
//(2009.4.16补充,此处貌似跟手册不一致,以及proteus有点问题,回头来看 )
        tmp = DB & 0x80 ;
        E = 0 ;
    }while ( !tmp ) ;   
}

void init(){
    send_cmd(0x3f);    //扩充指令集动作   
}

//发送消息:
//type = 0 , 为命令消息
//type = 1 ,为数据消息
void send(uchar type , uchar content){
    switch(type){
    case 0:RS = 0 ;break;
    case 1:RS = 1 ;break;
    default:return ;
    }
    busy_wait();
    RW = 0 ;
    E = 1 ;
    DB = content ;
    E = 0 ;
}

//设置显示位置
//row:0..7
//col:0..63
void setpos(uchar row , uchar col){
    if ( row < 0 || row >= 8 || col < 0 || col >= 64 ) return ;
    send_cmd(0xb8+row);
    send_cmd(0x40+col);   
}

程序结合前面的说明应该能看懂了。。。
我也只能黑箱到这个程度了。
虽然一般LCD的指令,远远不只这些,但是我想基本功能已经够了。
就像前面说的,有了上面的这些函数之后,
就能在指定的地方画出一个点,

而要画任何形状的东西都很容易了。
把程序拿去,改改main函数里面的几条语句,
试试画点别的进去,就可以理解前面描述的坐标系统了。

体会:

很多人到网上,一来就要别人做个功能强大的东西。
真不知道拿去干什么的。。或许想简单点交个作业还是啥的吧。。

同时,网上很多资料。。有结果没过程,看起来很吃力。

我喜欢的是一些简洁的东西。
比如,你告诉我了怎样点亮和灭掉一个LED,
然后给我拿一排出来,要玩任何花样都可以;
你告诉我了怎样发一个音频,
我一定可以弄首歌出来。

我觉得这些才是初学者应该得到的。

而我看到的很多东西,一上来就把LED跑得天花乱坠的,
要不直接来首强大的歌,主要是又没注释,也没原理说明。。。

这些东西,也许只有拿给喜欢捡懒的人用吧。。。拿到老师那里交差应该没问题。
对于想了解里面真正的内涵的人,乃是莫大的打击。。

PS:谁有这东西的详细手册,发我一份吧^_^。。搜半天不到。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值