ampire 12864
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCD_AMPIRE12864的简单使用(PROTEUS)
(hplonline)2009.3.13
一。
原因
练习LCD,选的是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跑得天花乱坠的,
要不直接来首强大的歌,主要是又没注释,也没原理说明。
这些东西,也许只有拿给喜欢捡懒的人用吧。
拿到老师那里交差应该没问题。
对于想了解里面真正的内涵的人,乃是莫大的打击。