assembly 字符液晶显示器显示在我的Proteus项目什么都没有

iqih9akk  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(93)

我需要打印我的名字和姓氏在液晶显示器上的变形,但我尝试了每一个解决方案,我可以找到,但它不工作。液晶屏上什么都没有显示。请看下面的示意图和我的代码。我也试过其他模式,但它们也不起作用。我想问题是变形杆菌,但我不确定。
我能为解决方案做些什么?


的数据

LIST P='16F877A'
INCLUDE <P16F877A.INC>
DEGER EQU 0x21
SAYAC1 EQU 0x22
SAYAC2 EQU 0X23
    ORG 0x00
    GOTO START
    ORG 0x04
VERIYAZ
    
    MOVWF DEGER ;
    SWAPF DEGER ,W ;
    ANDLW 0x0F
    MOVWF PORTB
    BSF PORTB,4 ;
    CALL GECIKME ;
    
    MOVF DEGER,W ;
    ANDLW 0x0F
    MOVWF PORTB
    BSF PORTB,4 ;
    CALL GECIKME
    RETURN

KOMUTYAZ
    MOVWF DEGER ; 1101 1010
    SWAPF DEGER,W;1010 1101
    ANDLW 0x0F ;  0000 1111 =0000 1101
    MOVWF PORTB
    BCF PORTB,4 ;
    CALL GECIKME ;
    
    MOVF DEGER,W ;1101 1010
    ANDLW 0x0F   ;0000 1010
    MOVWF PORTB
    BCF PORTB,4 ;
    CALL GECIKME
    RETURN
    
START
    CLRF PORTB
    
    BANKSEL TRISB
    CLRF TRISB
    
    BANKSEL PORTB
    MOVLW 0x03  ;
    CALL KOMUTYAZ ;
    
    MOVLW 0x02;
    CALL KOMUTYAZ ;
    MOVLW 0x28 ;
    CALL KOMUTYAZ ;
    MOVLW 0x01 ;
    CALL KOMUTYAZ ;
    MOVLW 0x06;
    CALL KOMUTYAZ ;
    MOVLW 0x0C ;
    CALL KOMUTYAZ ;
    
    MOVLW 0x80;
    CALL KOMUTYAZ ;
    
    MOVLW 'B'
    CALL VERIYAZ
    MOVLW 'A'
    CALL VERIYAZ
    MOVLW 'T'
    CALL VERIYAZ
    MOVLW 'U'
    CALL VERIYAZ
    MOVLW 'H'
    CALL VERIYAZ

    
    MOVLW 0xC0;
    CALL KOMUTYAZ
    MOVLW 0x06 ;
    CALL KOMUTYAZ
    
    MOVLW 'D'
    CALL VERIYAZ
    MOVLW 'I'
    CALL VERIYAZ
    MOVLW 'L'
    CALL VERIYAZ
    MOVLW 'L'
    CALL VERIYAZ
    MOVLW 'I'
    CALL VERIYAZ
    
GECIKME
    BSF PORTB,5;
    CALL BEKLE
    BCF PORTB,5;
    RETURN
BEKLE
    MOVLW 0x40
    MOVWF SAYAC1;
D1
    MOVLW 0x05
    MOVWF SAYAC2
D2
    DECFSZ SAYAC2
    GOTO D2
    DECFSZ SAYAC1
    GOTO D1
    RETURN
    
    END

字符串
我试了我能找到的,我期待着解决方案。

d4so4syb

d4so4syb1#

  • PORTB 3* 默认配置为低压编程(LVP)引脚。在此模式下,此引脚不能用作IO。您必须更改配置位来控制LVP位,以便B3引脚可用作IO。将这一行添加到源代码中的include行之后,如下所示:
...
INCLUDE <PIC16F877A.INC>
__CONFIG _LVP_OFF ; Turn off Low voltage programming feature
...

字符串
您也可以将输出端口更改为PORTB以外的其他端口。但要小心; IO引脚可以设计为多功能的,也就是说,单个IO引脚可以设计为用作模拟输入或数字IO或定时器输入或PWM输出等。您应该始终检查微控制器的datasheet,以便能够根据您的需要正确配置引脚。
继续并将该配置行添加到代码中,然后重试。然后让我知道结果。

编辑-1

上面提供的解决方案没有工作,那么现在怎么办?我们会一直努力直到你成功。现在我们已经确保了 * PORTB 3 * 引脚是空闲的,我们可以专注于其他错误。这是我看到的另一个:LCD的初始化过程。初始化过程非常重要,以便LCD知道它应该如何工作。如果没有正确地初始化它,不幸的是它将无法控制。所以我们开始吧...
在第13页的this datasheet中,您可以看到16 x2 LCD控制器的初始化过程。你看...
x1c 0d1x的数据

  • 如您所见,第一步(通电后)是在VDD > 2.7V后等待超过40 ms,然后在VDD > 4.5V后等待超过15 ms,在向LCD发送任何命令之前总共等待55+ms。让我们把它四舍五入到100 ms。
  • 然后我们将发送命令0x3
  • 然后等待超过4.1ms(我们将其舍入为10 ms)
  • 然后发送命令0x3第二次,然后等待超过100 us(我们将其四舍五入为1 ms)
  • 最后一次发送命令0x3

这些步骤应该以这种方式完成,以便LCD控制器完成其复位程序,以便进一步设置。然后是接口设置步骤。现在,您必须替换以下代码:

BANKSEL PORTB
MOVLW 0x03  ;
CALL KOMUTYAZ ;

MOVLW 0x02;
CALL KOMUTYAZ ;
MOVLW 0x28 ;
CALL KOMUTYAZ ;
MOVLW 0x01 ;
CALL KOMUTYAZ ;
MOVLW 0x06;
CALL KOMUTYAZ ;
MOVLW 0x0C ;
CALL KOMUTYAZ ;

MOVLW 0x80;
CALL KOMUTYAZ ;


代码如下:

CALL    Wait100ms   ;< implement this delay
BANKSEL PORTB       ; Make sure your in PORTB bank after returning from the delay
BCF     PORTB,4     ; Set the RS pin low to send command
BCF     PORTB,5     ; Set the Enable pin low
MOVLW   0xF0
ANDWF   PORTB,F     ; Clear Lower 4 bits of PORTB
MOVLW   0x3         ; Load the reset command value
IORWF   PORTB,F     ; Output the command value out of data pins
BSF     PORTB,5
BCF     PORTB,5     ; Generate a falling edge on the Enable pin
CALL    Wait10ms    ;< implement this delay
BANKSEL PORTB       ; Make sure your in PORTB bank after returning from the delay
BSF     PORTB,5
BCF     PORTB,5     ; Latch the 0x3 to the LCD again
CALL    Wait1ms     ;< implement this delay
BANKSEL PORTB       ; Make sure your in PORTB bank after returning from the delay
BSF     PORTB,5
BCF     PORTB,5     ; Latch the 0x3 for the last time
CALL    Wait1ms

; Now setup the LCD interface
BANKSEL PORTB
CLRF    PORTB
MOVLW   2
IORWF   PORTB,F
BSF     PORTB,5
BCF     PORTB,5
CALL    Wait1ms
BANKSEL PORTB
BSF     PORTB,5
BCF     PORTB,5     ; Latch the command value 2 two times
CALL    Wait100us   ;< implement this delay
BANKSEL PORTB
MOVLW   0xF0
ANDWF   PORTB,F     ; Clear the data pins
BSF     PORTB,5
BCF     PORTB,5
CALL    Wait100us
MOVLW   0x8
BANKSEL PORTB
IORWF   PORTB,F
BSF     PORTB,5
BCF     PORTB,5
CALL    Wait100us
MOVLW   0xF0
BANKSEL PORTB
ANDWF   PORTB,F
BSF     PORTB,5
BCF     PORTB,5
CALL    Wait100us
MOVLW   1
BANKSEL PORTB
IORWF   PORTB,F
BSF     PORTB,5
BCF     PORTB,5
CALL    Wait10ms    ; You must delay more than 3ms after sending 0x1 (Clear display command)
MOVLW   0xF0
BANKSEL PORTB
ANDWF   PORTB,F
BSF     PORTB,5
BCF     PORTB,5
MOVLW   6
IORWF   PORTB,F
BSF     PORTB,5
BCF     PORTB,5
CALL    Wait100us
; Finally the LCD should be ready to use with the new interface setup


除LVP配置外,还应进行此更改。试着让我知道结果。

相关问题