一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 14361|回复: 32

[其他综合] 终于学会4线驱动1602了,发一段我写的给初学者参考

 火.. [复制链接]
发表于 2011-3-18 17:47 | 显示全部楼层 |阅读模式
;;;;;;;;LCD1602驱动程序;;;;;;;;;;;;;;;;;
;;;;;;12mhz晶振;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;显示固定字符;;;;;;;;;;;;;;;;;;;;
;;;;;;;;p0口高4位接DB7-DB4  RW接地;;;
;;;;有文挡说上电要延时15MS以上再送指令,但试过不延时也行;;;;
RS EQU P2.5
E EQU P2.7
ORG 0000H
ajmp start
org 0033h
start:
       mov sp,#60h
;;;;;lcd上电初始化;;;;;;
main:  mov p0,#30h  ;三条03H指令,因为我的是P0口高4位接的DB7-DB4所以是30H
       acall enable
       acall delay1  ;增加了延时,没此句在频繁按复位按钮时可能会出现乱码
      
       mov p0,#30h
       acall enable
      
       mov p0,#30h
       acall enable
      
       mov p0,#20h  
       acall enable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;lcd设置;;;;;;;;;;;;;;      
       MOV P0,#00H;清屏  很多屏此条指令只能放此处
       ACALL ENABLE  ;指定是传的指令而非数据
       MOV P0,#10H
       ACALL ENABLE
      
       MOV P0,#00H;清屏
       ACALL ENABLE
       MOV P0,#10H
       ACALL ENABLE
      
        MOV P0,#20H ;功能设置 4总线驱动,2行,5X7
       ACALL ENABLE
       MOV P0,#80H
       ACALL ENABLE
      
      
       MOV P0,#00H;光标复位
       ACALL ENABLE
       MOV P0,#20H
       ACALL ENABLE
      
       MOV P0,#00H;字符和光标 ,I/D=1光标右移(AC自动加1) S=0字符移动无效
       ACALL ENABLE
       MOV P0,#60H
       ACALL ENABLE
      
       MOV P0,#00H ;显示开关控制 D=1开显示,C=1光标,B=1光标闪
       ACALL ENABLE
       MOV P0,#0F0H
       ACALL ENABLe
;;;;;;;指定显示首址;;;;;;;;;;      
         
       MOV DPTR ,#TAB
       MOV A,#80H ;;第1行第1位
       mov p0,A
       ACALL ENABLE
       SWAP A
       MOV P0,A
       ACALL ENABLE
       ACALL DISP
     
      MOV DPTR ,#tab1
      MOV A,#0C0H  ;第2行第1位
      MOV P0,A
      ACALL ENABLE
      SWAP A
      mov p0,A
      ACALL ENABLE
      ACALL DISP
      
      AJMP $
  ;;;;;;;;;;;;;;;;;;;;
  ;;送指令子程序;;;;;;      
ENABLE: CLR RS       ;送命令
        CLR E
        ACALL DELAY
        SETB E
        RET
;;;;;;;;;;;;;;;;;;;;;;
;;;;显示子程序;;;;;;;;
DISP: MOV R0,#16
LOOP:MOV A,#00H
     MOVC A,@A+DPTR
     ACALL DISP1
     INC DPTR
     DJNZ R0,LOOP
     RET
     ;;;;;;;;;;;;;;;
DISP1:MOV P0,A
      SETB RS        ;1
      CLR E          ;2
      ACALL DELAY    ;3
      SETB E         ;4    1,2,3,4四句指定传的是数据
      
      SWAP A
      MOV P0,A
      SETB RS
      CLR E
      ACALL DELAY
      SETB E
      
      RET
;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;
DELAY: MOV R7,#100  
D1:    MOV R6,#2
       DJNZ R6,$
       DJNZ R7,D1
       RET
      
DELAY1: MOV R7,#38H  ;5。1MS
D11:    MOV R6,#2CH
       DJNZ R6,$
       DJNZ R7,D11
       RET
      
TAB: DB "CHENLI  1602TEXT"
tab1:db "TEL: 15000000000"
END

  

发表于 2011-3-18 20:04 | 显示全部楼层
汇编看的头大,绕行。不过还是顶一下
回复

使用道具 举报

发表于 2011-3-19 01:28 | 显示全部楼层
本帖最后由 40560335 于 2011-3-19 01:34 编辑

4线驱动其实很简单,先写高4位,再写低4位,不过我不会汇编,完全看不懂,我贴个C写的主要部分代码吧:
======================================高4位IO驱动===============================================
#define LCD_EN_PORT    PORTD   //以下2个要设为同一个口
#define LCD_EN_DDR     DDRD
#define LCD_RS_PORT    PORTD   //以下2个要设为同一个口
#define LCD_RS_DDR     DDRD
#define LCD_RW_PORT    PORTD   //以下2个要设为同一个口
#define LCD_RW_DDR     DDRD
#define LCD_RS         (1<<PD5) //portA5       RS
#define LCD_EN         (1<<PD4) //portA4       EN
#define LCD_RW         (1<<PD6) //portA6       RW
#define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口
#define LCD_DATA_DDR   DDRA    //一定要用高4位
#define LCD_DATA_PIN   PINA
#define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7))


void LCD_write_command(unsigned char command) //写指令
{
  Delayus(16);
  LCD_RS_PORT&=~LCD_RS;        //RS=0
  LCD_DATA_PORT&=0X0f;         //清高四位
  LCD_DATA_PORT|=command&0xf0; //写高四位
  LCD_en_write();
  command=command<<4;          //低四位移到高四位
  LCD_DATA_PORT&=0x0f;         //清高四位
  LCD_DATA_PORT|=command&0xf0; //写低四位
  LCD_en_write();
  
}

void LCD_write_data(unsigned char data) //写数据
{
  Delayus(16);
  LCD_RS_PORT|=LCD_RS;       //RS=1
  LCD_DATA_PORT&=0X0f;       //清高四位
  LCD_DATA_PORT|=data&0xf0;  //写高四位
  LCD_en_write();
  data=data<<4;               //低四位移到高四位
  LCD_DATA_PORT&=0X0f;        //清高四位
  LCD_DATA_PORT|=data&0xf0;   //写低四位
  LCD_en_write();
}



===============================中四位驱动(通过上面改的)=====================================
#define LCD_EN_PORT    PORTD   //以下2个要设为同一个口
#define LCD_EN_DDR     DDRD
#define LCD_RS_PORT    PORTD   //以下2个要设为同一个口
#define LCD_RS_DDR     DDRD
#define LCD_RW_PORT    PORTD   //以下2个要设为同一个口
#define LCD_RW_DDR            DDRD
#define LCD_RS         (1<<PD0) //portA5       RS
#define LCD_EN         (1<<PD1) //portA4       EN
//#define LCD_RW         (1<<PD6) //portA6       RW

#define LCD_DATA_PORT  PORTD   //以下3个要设为同一个口
#define LCD_DATA_DDR   DDRD    //一定要用高4位
#define LCD_DATA_PIN   PIND
#define LCD_DATA       ((1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5))


void LCD_write_command(unsigned char command) //写指令
{
  uchar command_tmp;
  command_tmp=command;
  Delayus(16);
  LCD_RS_PORT&=~LCD_RS;        //RS=0
  
  command=command>>2;          //高四位移到中四位
  LCD_DATA_PORT&=0XC3;         //清中四位
  LCD_DATA_PORT|=command&0x3C; //写中四位
  LCD_en_write();
  
  command_tmp=command_tmp<<2;  //低四位移到中四位
  LCD_DATA_PORT&=0xC3;         //清高四位
  LCD_DATA_PORT|=command_tmp&0x3C; //写低四位
  LCD_en_write();
  
}

void LCD_write_data(unsigned char data) //写数据
{

  uchar data_tmp;
  data_tmp=data;
  Delayus(16);
  LCD_RS_PORT|=LCD_RS;       //RS=1

  data=data>>2;              //高四位移到中四位
  LCD_DATA_PORT&=0XC3;       //清中四位
  LCD_DATA_PORT|=data&0x3C;  //写中四位
  LCD_en_write();

  data_tmp=data_tmp<<2;      //低四位移到中四位
  LCD_DATA_PORT&=0xC3;       //清高四位
  LCD_DATA_PORT|=data_tmp&0x3C; //写低四位
  LCD_en_write();
}
回复

使用道具 举报

发表于 2011-4-1 11:19 | 显示全部楼层
收藏,以后慢慢看~~~
回复

使用道具 举报

发表于 2011-4-8 00:11 | 显示全部楼层
好东西,收藏...
回复

使用道具 举报

发表于 2011-4-9 21:05 | 显示全部楼层
马克………
回复

使用道具 举报

发表于 2011-4-10 08:06 | 显示全部楼层
   
    不错,帮顶!
回复

使用道具 举报

发表于 2011-4-12 14:07 | 显示全部楼层
mark一下
回复

使用道具 举报

发表于 2011-10-10 00:43 | 显示全部楼层
马克
回复

使用道具 举报

发表于 2011-10-10 19:53 | 显示全部楼层
二线成功驱动的飘过
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-2 04:18 , Processed in 0.039182 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表