免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 848 | 回复: 0
打印 上一主题 下一主题

LM016LCD驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-24 17:17 |只看该作者 |倒序浏览


ORG 0000H
//Port Definition
RS EQU P2.2
RW EQU P2.1
E EQU P2.0
AJMP START
ORG 0030H
START:
//显示模式设置
LCALL BUSY
CLR RS ;0指令
CLR RW ;0写
//将E从1至0产生下降沿执行指令
SETB E
MOV P1,#38H ;8bit,2lines,5*10
CLR E
//清屏光标归位
LCALL BUSY
CLR RS ;0指令
CLR RW ;0写
//将E从1至0产生下降沿执行指令
SETB E
MOV P1,#01H ;clear screen,cursor homing
CLR E
//光标移动设置
LCALL BUSY
CLR RS ;0指令
CLR RW ;0写
//将E从1至0产生下降沿执行指令
SETB E
MOV P1,#06H ;cursor right moving,screen not move
CLR E
//显示屏开,光标显示并闪烁
LCALL BUSY
CLR RS ;0指令
CLR RW ;0写
//将E从1至0产生下降沿执行指令
SETB E
MOV P1,#0FH
CLR E
//显示位置设置
LCALL BUSY
CLR RS
CLR RW
SETB E
MOV P1,#80H //从第一行第三个位置起显示
CLR E
//显示字符串
MOV R0,#00H ;偏移量
MOV R1,#0FH ;要显示的字符个数
LOOP0:
LCALL BUSY
SETB RS ;1数据
CLR RW  ;0写
SETB E
MOV DPTR,#INFO ;将表地址送DPTR
MOV A,R0       ;将偏移地址送A
MOVC A,@A+DPTR ;基址加变址找到操作数送入A
MOV P1,A       ;送出数据
CLR E
INC R0  ;偏移量加1
DJNZ R1,LOOP0 ;R1减1,如果不为零则跳到LOOP
//设置显示位置
LCALL BUSY
CLR RS ;0指令
CLR RW ;0写
SETB E
MOV P1,#0C0H ;从第二行第0个位置起显示
CLR E
//显示字符串
;偏移量(接上面)
MOV R1,#0BH ;要显示的字符个数
LOOP1:
LCALL BUSY
SETB RS ;1数据
CLR RW  ;0写
SETB E
MOV DPTR,#INFO ;将表地址送DPTR
MOV A,R0       ;将偏移地址送A
MOVC A,@A+DPTR ;基址加变址找到操作数送入A
MOV P1,A       ;送出数据
CLR E
INC R0  ;偏移量加1
DJNZ R1,LOOP1 ;R1减1,如果不为零则跳到LOOP
AJMP $ ;原地打转
BUSY: ;检测是否忙
SETB E
MOV P1,#080H ;写一个数据到P1
CLR RS ;0指令
SETB RW ;1读
MOV A,P1 ;传到A中
CLR E
JB ACC.7,BUSY ;检测最高位是否为0,0则忙,1则空闲
RET
INFO: ;定义字符串
DB "Creatory Studio"
DB "Welcome You"
END

/*LM016L LCD Displayer Test*/
#include
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
//define port
sbit RS = P3^0;
sbit RW = P3^1;
sbit E = P3^2;
//LCD instruction definition
#define CLEAR_SCREEN 0x01
#define LCD_RESET 0x38
#define LCDON_CURSORHIDE_NOFLINK 0x0C
#define EIGHTBIT_TWOLINE_fIVEMULSEVEN 0x1B
//software delay
void delay(uint n)
{
uint i,j;
for(i=n;i
//write inst,don't judge busy or not
void sendInst(uchar n)
{
RS=0;
RW=0;
P1=n;
E=1;
_nop_();
E=0;
}
//write inst,judge busy or not
void sendInstBusyWait(uchar n)
{     
Busy_Wait();
sendInst(n);
}
//initial lcd
void initLCD()
{
delay(200); //Reset three times without testing busy
sendInst(LCD_RESET);
delay(100);
sendInst(LCD_RESET);
delay(100);
sendInst(LCD_RESET);
sendInstBusyWait(CLEAR_SCREEN);
sendInstBusyWait(EIGHTBIT_TWOLINE_fIVEMULSEVEN);
sendInstBusyWait(LCDON_CURSORHIDE_NOFLINK);
}
//set cursor position
void setpos(uchar x,uchar y)
{
Busy_Wait();
x&=0x0f;
y&=0x03;
if(y==0x00)
sendInstBusyWait(x|0x80);
else if(y==0x01)
sendInstBusyWait((x+0x40)|0x80);
}
//write one byte
void writeOneByte(uchar n)
{
Busy_Wait();
RS=1;
RW=0;
P1=n;
E=1;
_nop_();
E=0;
}
//write string
void writeString(uchar *s,uint length)
{
int x,y;
int rowCount,rowCharLen[2];
if(length>16)
{
  rowCount=2;
  rowCharLen[0]=16;
  rowCharLen[1]=length-16;
}
else
{
  rowCount=1;
  rowCharLen[0]=length;
  rowCharLen[1]=0;
}
for(y=0;y
//the main
void main()
{
uchar info[]={"Creatory Studio@ Welcome You"};
initLCD();
sendInstBusyWait(CLEAR_SCREEN);
writeString(info,strlen(info));
while(1);
}



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/56374/showart_1334610.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP