⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.psm

📁 PicoBlaze的开发压缩包,PicoBlaze的编译器.
💻 PSM
📖 第 1 页 / 共 3 页
字号:
                       RETURN
                       ;
                       ;Delay of 20ms.
                       ;
                       ;Delay of 20ms used during initialisation.
                       ;
                       ;Registers used s0, s1, s2, s3
                       ;
           delay_20ms: LOAD s3, 14                         ;20 x 1ms = 20ms
            wait_20ms: CALL delay_1ms
                       SUB s3, 01
                       JUMP NZ, wait_20ms
                       RETURN
                       ;
                       ;Delay of approximately 1 second.
                       ;
                       ;Registers used s0, s1, s2, s3, s4
                       ;
             delay_1s: LOAD s4, 32                         ;50 x 20ms = 1000ms
              wait_1s: CALL delay_20ms
                       SUB s4, 01
                       JUMP NZ, wait_1s
                       RETURN
                       ;
                       ;
                       ;
                       ;**************************************************************************************
                       ;LCD Character Module Routines
                       ;**************************************************************************************
                       ;
                       ;LCD module is a 16 character by 2 line display but all displays are very similar
                       ;The 4-wire data interface will be used (DB4 to DB7).
                       ;
                       ;The LCD modules are relatively slow and software delay loops are used to slow down
                       ;KCPSM3 adequately for the LCD to communicate. The delay routines are provided in
                       ;a different section (see above in this case).
                       ;
                       ;
                       ;Pulse LCD enable signal 'E' high for greater than 230ns (1us is used).
                       ;
                       ;Register s4 should define the current state of the LCD output port.
                       ;
                       ;Registers used s0, s4
                       ;
          LCD_pulse_E: XOR s4, LCD_E                       ;E=1
                       OUTPUT s4, LCD_output_port
                       CALL delay_1us
                       XOR s4, LCD_E                       ;E=0
                       OUTPUT s4, LCD_output_port
                       RETURN
                       ;
                       ;Write 4-bit instruction to LCD display.
                       ;
                       ;The 4-bit instruction should be provided in the upper 4-bits of register s4.
                       ;Note that this routine does not release the master enable but as it is only
                       ;used during initialisation and as part of the 8-bit instruction write it
                       ;should be acceptable.
                       ;
                       ;Registers used s4
                       ;
      LCD_write_inst4: AND s4, F8                          ;Enable=1 RS=0 Instruction, RW=0 Write, E=0
                       OUTPUT s4, LCD_output_port          ;set up RS and RW >40ns before enable pulse
                       CALL LCD_pulse_E
                       RETURN
                       ;
                       ;
                       ;Write 8-bit instruction to LCD display.
                       ;
                       ;The 8-bit instruction should be provided in register s5.
                       ;Instructions are written using the following sequence
                       ; Upper nibble
                       ; wait >1us
                       ; Lower nibble
                       ; wait >40us
                       ;
                       ;Registers used s0, s1, s4, s5
                       ;
      LCD_write_inst8: LOAD s4, s5
                       AND s4, F0                          ;Enable=0 RS=0 Instruction, RW=0 Write, E=0
                       ;OR s4, LCD_drive                    ;Enable=1
                       CALL LCD_write_inst4                ;write upper nibble
                       CALL delay_1us                      ;wait >1us
                       LOAD s4, s5                         ;select lower nibble with
                       SL1 s4                              ;Enable=1
                       SL0 s4                              ;RS=0 Instruction
                       SL0 s4                              ;RW=0 Write
                       SL0 s4                              ;E=0
                       CALL LCD_write_inst4                ;write lower nibble
                       CALL delay_40us                     ;wait >40us
                       LOAD s4, F0                         ;Enable=0 RS=0 Instruction, RW=0 Write, E=0
                       OUTPUT s4, LCD_output_port          ;Release master enable
                       RETURN
                       ;
                       ;
                       ;
                       ;Write 8-bit data to LCD display.
                       ;
                       ;The 8-bit data should be provided in register s5.
                       ;Data bytes are written using the following sequence
                       ; Upper nibble
                       ; wait >1us
                       ; Lower nibble
                       ; wait >40us
                       ;
                       ;Registers used s0, s1, s4, s5
                       ;
       LCD_write_data: LOAD s4, s5
                       AND s4, F0                          ;Enable=0 RS=0 Instruction, RW=0 Write, E=0
                       OR s4, 0C                           ;Enable=1 RS=1 Data, RW=0 Write, E=0
                       OUTPUT s4, LCD_output_port          ;set up RS and RW >40ns before enable pulse
                       CALL LCD_pulse_E                    ;write upper nibble
                       CALL delay_1us                      ;wait >1us
                       LOAD s4, s5                         ;select lower nibble with
                       SL1 s4                              ;Enable=1
                       SL1 s4                              ;RS=1 Data
                       SL0 s4                              ;RW=0 Write
                       SL0 s4                              ;E=0
                       OUTPUT s4, LCD_output_port          ;set up RS and RW >40ns before enable pulse
                       CALL LCD_pulse_E                    ;write lower nibble
                       CALL delay_40us                     ;wait >40us
                       LOAD s4, F0                         ;Enable=0 RS=0 Instruction, RW=0 Write, E=0
                       OUTPUT s4, LCD_output_port          ;Release master enable
                       RETURN
                       ;
                       ;
                       ;
                       ;Reset and initialise display to communicate using 4-bit data mode
                       ;Includes routine to clear the display.
                       ;
                       ;Requires the 4-bit instructions 3,3,3,2 to be sent with suitable delays
                       ;following by the 8-bit instructions to set up the display.
                       ;
                       ;  28 = '001' Function set, '0' 4-bit mode, '1' 2-line, '0' 5x7 dot matrix, 'xx'
                       ;  06 = '000001' Entry mode, '1' increment, '0' no display shift
                       ;  0E = '00001' Display control, '1' display on, '1' cursor off, '0' cursor blink off
                       ;  01 = '00000001' Display clear
                       ;
                       ;Registers used s0, s1, s2, s3, s4
                       ;
            LCD_reset: CALL delay_20ms                     ;wait more that 15ms for display to be ready
                       LOAD s4, 30
                       CALL LCD_write_inst4                ;send '3'
                       CALL delay_20ms                     ;wait >4.1ms
                       CALL LCD_write_inst4                ;send '3'
                       CALL delay_1ms                      ;wait >100us
                       CALL LCD_write_inst4                ;send '3'
                       CALL delay_40us                     ;wait >40us
                       LOAD s4, 20
                       CALL LCD_write_inst4                ;send '2'
                       CALL delay_40us                     ;wait >40us
                       LOAD s5, 28                         ;Function set
                       CALL LCD_write_inst8
                       LOAD s5, 06                         ;Entry mode
                       CALL LCD_write_inst8
                       LOAD s5, 0E                         ;Display control
                       CALL LCD_write_inst8
            LCD_clear: LOAD s5, 01                         ;Display clear
                       CALL LCD_write_inst8
                       CALL delay_1ms                      ;wait >1.64ms for display to clear
                       CALL delay_1ms
                       RETURN
                       ;
                       ;Position the cursor ready for characters to be written.
                       ;The display is formed of 2 lines of 16 characters and each
                       ;position has a corresponding address as indicated below.
                       ;
                       ;                   Character position
                       ;           0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
                       ;
                       ; Line 1 - 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
                       ; Line 2 - C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
                       ;
                       ;This routine will set the cursor position using the value provided
                       ;in register s5. The upper nibble will define the line and the lower
                       ;nibble the character position on the line.
                       ; Example s5 = 2B will position the cursor on line 2 position 11
                       ;
                       ;Registers used s0, s1, s2, s3, s4
                       ;
           LCD_cursor: TEST s5, 10                         ;test for line 1
                       JUMP Z, set_line2
                       AND s5, 0F                          ;make address in range 80 to 8F for line 1
                       OR s5, 80
                       CALL LCD_write_inst8                ;instruction write to set cursor
                       RETURN
            set_line2: AND s5, 0F                          ;make address in range C0 to CF for line 2
                       OR s5, C0
                       CALL LCD_write_inst8                ;instruction write to set cursor
                       RETURN
                       ;
                       ;This routine will shift the complete display one position to the left.
                       ;The cursor position and LCD memory contents will not change.
                       ;
                       ;
                       ;Registers used s0, s1, s2, s3, s4, s5
                       ;
       LCD_shift_left: LOAD s5, 18                         ;shift display left
                       CALL LCD_write_inst8
                       RETURN
                       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -