返回该小组首页 回复主题
iron05

iron05

小组等级:     E币:272  (E币换礼)

#1楼主:求助1602c,虽然是很简单的东西,可就是调不出来

文章发表于:2008-05-16 09:27

CW_Add   EQU 8000H   ;写指令代码

CR_Add   EQU 0A000H   ; read busy and ac

DW_Add   EQU 0C000H   ;WRITE  DATA


ORG 00H
AJMP START

ORG 0100H
START:ACALL DELY20MS ;等待LCD电源稳定
      MOV SP,#50H

INIT:MOV A,#00000001B   ;初始话清屏
     ACALL WC51R
     ACALL DELY
     MOV A,#00111000B   ;双行显示 ,5*7字符,8位数据
     LCALL WC51R
     ACALL DELY
     MOV A,#0EH   ;显示开,光标开,闪烁关
     LCALL WC51R
     ACALL DELY

     MOV A,#00000110B  ;  AC自动加 1,画面保持不动
     LCALL WC51R
     ACALL DELY

DISPLAY:MOV A,#10000000B  ;设置显示位置
        ACALL WC51R
MOV A,#"G"
ACALL WC51DDR
MOV A,#"O"
ACALL WC51DDR
MOV A,#"O"
ACALL WC51DDR
MOV A,#"D"
ACALL WC51DDR
MOV A,#11000101B
ACALL WC51R
MOV A,#"B"
ACALL WC51DDR
MOV A,#"Y"
ACALL WC51DDR
MOV A,#"E"
ACALL WC51DDR

LOOP:MOV P2,#00H   ;在硬件上观测能否运行完显示程序
     ACALL DELY2S
     MOV P2,#0FFH
     ACALL DELY2S
     LJMP LOOP


 ;--------------1、读BF和AC值

F_BUSY:  PUSH        ACC

         MOV         DPTR,#CR_Add    ;设置指令口读地址

WAIT:    MOVX       A,@DPTR     ;读BF和AC值

         JB         ACC.7,WAIT

         POP         ACC

         RET

;-------2、写指令代码子程序

WC51R:   ACALL    F_BUSY

         MOV      DPTR,#CW_Add

         MOVX     @DPTR,A

         ACALL DELY

         RET

;-------------2、写显示数据子程序

WC51DDR: ACALL F_BUSY

         MOV      DPTR,#DW_Add

         MOVX     @DPTR,A

         ACALL DELY

         RET

DELY: MOV R6,#5
      D1:MOV R7,#248
      DJNZ R7,$
      DJNZ R6,D1
      RET
DELY20MS:MOV R6,#64H
      AAA:MOV R7,#98
          NOP
          DJNZ R7,$
          DJNZ R6,AAA
          RET
DELY2S:   MOV R5,#64H
      ABC:MOV R6,#64H
      BBB:MOV R7,#99
          NOP
          DJNZ R7,$
          DJNZ R6,BBB
          DJNZ R5,ABC
          RET
END

万分感谢

      【回复】

iron05

   小组等级:    E币:272  (E币换礼)

#2

文章发表于:2008-05-16 09:34

点击看大图

smaps

   小组等级:    E币:114  (E币换礼)

#3

文章发表于:2008-05-16 13:55

怎么不用C呀,我空间有可以看看!

iron05

   小组等级:    E币:272  (E币换礼)

#4

文章发表于:2008-05-16 15:20

感觉汇编很好用嘿

jianghongke

   小组等级:    E币:293  (E币换礼)

#5

文章发表于:2008-05-21 00:49

汇编不太懂!我都是用C的

bzhen123

   小组等级:    E币:244  (E币换礼)

#6

文章发表于:2008-05-21 15:42

不习惯用汇编,感觉看起来好累,建议你以后还是用C编比较好,对于一些含寄存器类的器件,你若用汇编编写的话将会很吃力的滴

王小朝

   小组等级:    E币:290  (E币换礼)

#7

文章发表于:2008-05-22 23:02

不懂汇编,留个脚印,明天给你C代码,1602需要注意时序。

王小朝

   小组等级:    E币:290  (E币换礼)

#8

文章发表于:2008-05-24 17:22

//$$************$$************$$************$$************$$************$$
//液晶控制 $$
// $$
//$$************$$************$$************$$************$$************$$

//液晶初始化
void lcd_initial()
{
delay30ms();
delay30ms();
delay30ms();
lcd_command_write(0x38,0);//三次显示模式设置,不检测忙信号
delay5ms();
lcd_command_write(0x38,0);
delay5ms();
lcd_command_write(0x38,0);
delay5ms();

lcd_command_write(0x38,1); //显示模式设置,开始要求每次检测忙信号
lcd_command_write(0x08,1); //关闭显示
lcd_command_write(0x01,1); //显示清屏
lcd_command_write(0x06,1); // 显示光标移动设置
lcd_command_write(0x0c,1); // 显示开及光标设置
return;
}

//液晶_写字符
void lcd_data_write(unsigned char lcd_data_temp)
{
lcd_status_read(); //检测忙
lcd_data = lcd_data_temp;
lcd_en = 0; //延时
lcd_rw = 0; //写模式
lcd_rs = 1; //数据模式
lcd_en = 0; //若晶振速度太高可以在这后加小的延时
lcd_en = 1;
delay5ms();
lcd_en = 0;
return;
}

//液晶_写命令
void lcd_command_write(unsigned char lcd_cmd,busy_check) //busy_check为0时忽略忙检测
{
if (busy_check) lcd_status_read(); //根据需要检测忙,busy_check=0则不检测忙
lcd_data = lcd_cmd;
lcd_en = 0;
lcd_rw = 0; //写模式
lcd_rs = 0; //指令模式
lcd_en = 0;
lcd_en = 1;
delay5ms();
lcd_en = 0;
return;
}

//读数据
unsigned char lcd_data_read(void)
{
lcd_en = 0;
lcd_rw = 1;
lcd_rs = 1;
lcd_en = 0;
lcd_en = 1;
return(lcd_data);
delay5ms();
lcd_en = 0;
}

//读状态
unsigned char lcd_status_read(void)
{
lcd_en = 0;
lcd_rw = 1;
lcd_rs = 0;
lcd_en = 0;
lcd_en = 1;
while (lcd_data & Busy); //检测忙信号
return(lcd_data);
}

//按指定位置显示一个字符
void display_one_char(unsigned char X,Y,dis_data)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
lcd_command_write(X, 0); //这里不检测忙信号,发送地址码
lcd_data_write(dis_data);
}

//按指定位置显示一串字符
void display_list_char(unsigned char X,Y, unsigned char code *dis_data)
{
unsigned char list_length;

  list_length = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (list_length<0x20) //若到达字串尾则退出
{
  if (X <= 0xF) //X坐标应小于0xF
   {
    display_one_char(X, Y, dis_data[list_length]); //显示单个字符
    list_length++;
    X++;
   }
}
}
//液晶控制--------------------------------------------------------------
//**********************************************************************

王小朝

   小组等级:    E币:290  (E币换礼)

#9

文章发表于:2008-05-24 17:26

需要注意写命令和写字符 lcd_en的时序,一定要根据datasheet上的时序图来写。网上有个流传较广的源程序是错的。

ahai0306

   小组等级:    E币:72  (E币换礼)

#10

文章发表于:2008-05-28 10:02

去我的博客找找,以前写过很详细的,而且实验过的

http://blog.ednchina.com/ahai0306/

王小朝

   小组等级:    E币:290  (E币换礼)

#11

文章发表于:2008-05-29 16:01

不好意思,这段是死循环.....

while (list_length<0x20)

{
  if (X <= 0xF) //X坐标应小于0xF
   {
    display_one_char(X, Y, dis_data[list_length]); //显示单个字符
    list_length++;
    X++;
   }
}

不过判断一下是否到字符串尾端就OK 了..

总共 , 当前 /,2【下一页】

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

浏览该小组的用户还看过...

设计资源与分销

";