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

📄 control.psm

📁 介绍了SP3实验板的系统结构和布局,用户指南.
💻 PSM
📖 第 1 页 / 共 3 页
字号:
                  ;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
                  ;
                  ;
                  ;
                  ;
                  ;Read 8-bit data from LCD display.
                  ;
                  ;The 8-bit data will be read from the current LCD memory address
                  ;and will be returned in register s5.
                  ;It is advisable to set the LCD address (cursor position) before
                  ;using the data read for the first time otherwise the display may
                  ;generate invalid data on the first read.
                  ;
                  ;Data bytes are read using the following sequence
                  ; Upper nibble
                  ; wait >1us
                  ; Lower nibble
                  ; wait >40us
                  ;
                  ;Registers used s0, s1, s4, s5
                  ;
  LCD_read_data8: LOAD s4, 0E                         ;Enable=1 RS=1 Data, RW=1 Read, E=0
                  OUTPUT s4, LCD_output_port          ;set up RS and RW >40ns before enable pulse
                  XOR s4, LCD_E                       ;E=1
                  OUTPUT s4, LCD_output_port
                  CALL delay_1us                      ;wait >260ns to access data
                  INPUT s5, LCD_input_port            ;read upper nibble
                  XOR s4, LCD_E                       ;E=0
                  OUTPUT s4, LCD_output_port
                  CALL delay_1us                      ;wait >1us
                  XOR s4, LCD_E                       ;E=1
                  OUTPUT s4, LCD_output_port
                  CALL delay_1us                      ;wait >260ns to access data
                  INPUT s0, LCD_input_port            ;read lower nibble
                  XOR s4, LCD_E                       ;E=0
                  OUTPUT s4, LCD_output_port
                  AND s5, F0                          ;merge upper and lower nibbles
                  SR0 s0
                  SR0 s0
                  SR0 s0
                  SR0 s0
                  OR s5, s0
                  LOAD s4, 04                         ;Enable=0 RS=1 Data, RW=0 Write, E=0
                  OUTPUT s4, LCD_output_port          ;Stop reading 5V device and release master enable
                  CALL delay_40us                     ;wait >40us
                  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
                  ;  0C = '00001' Display control, '1' display on, '0' 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, 0C                         ;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
                  ;
                  ;**************************************************************************************
                  ;Interrupt Service Routine (ISR)
                  ;**************************************************************************************
                  ;
                  ;Interrupts occur when the rotary control has been moved.
                  ;
                  ;The ISR captures the state of the direction which it writes to scratch pad memory (SPM).
                  ;The most significant bit is also set at this location to provide a 'flag' to the
                  ;main body of the program.
                  ;
                  ;If the main program is not in rotation mode then the ISR effectively ignores the
                  ;event although the hardware interface will be cleared by the interrupt_ack signal.
                  ;This prevents a rotation event which has been made during normal switch and button
                  ;mode from having any effect.
                  ;
             ISR: STORE s0, ISR_preserve_s0           ;preserve s0
                  FETCH s0, mode                      ;test operation mode
                  COMPARE s0, 00                      ;ignore events under normal mode
                  JUMP Z, end_ISR
                  INPUT s0, rotary_port               ;read rotary encoder
                  OR s0, 80                           ;set flag
                  STORE s0, rotary_status             ;put result in SCM
         end_ISR: FETCH s0, ISR_preserve_s0           ;restore s0
                  RETURNI ENABLE
                  ;
                  ;
                  ;**************************************************************************************
                  ;Interrupt Vector
                  ;**************************************************************************************
                  ;
                  ADDRESS 3FF
                  JUMP ISR
                  ;
                  ;

⌨️ 快捷键说明

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