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

📄 cplcd.lst

📁 使用ATMEGA8L+1602LCD写的万年历
💻 LST
📖 第 1 页 / 共 5 页
字号:
                 .equ	ADCCaddr	= 0x000e	; ADC Conversion Complete
                 .equ	ERDYaddr	= 0x000f	; EEPROM Ready
                 .equ	ACIaddr	= 0x0010	; Analog Comparator
                 .equ	TWIaddr	= 0x0011	; 2-wire Serial Interface
                 .equ	SPMRaddr	= 0x0012	; Store Program Memory Ready
                 
                 .equ	INT_VECTORS_SIZE	= 19	; size in words
                 
                 #pragma AVRPART CORE INSTRUCTIONS_NOT_SUPPORTED break
                 
                 #endif  /* _M8DEF_INC_ */
                 
                 ; ***** END OF FILE ******************************************************
                 .list
                 ;*
                 ;************************Register definition***************************
                 .def      int_temp  =  r14
                 .def      next_temp  =  r15
                 .def      temp = r16
                 .def      delay_temp  =  r17
                 .def      coodrinate_x  =  r18
                 .def      coodrinate_y  =  r19
                 .def      key  =  r20
                 .def      tempff  =  r13
                 .def      temp00  =  r12
                 .def      temp30  =  r21
                 .def      counter_temp = r22
                 .def      high_temp  =  r23
                 .def      low_temp  =  r24
                 ;*
                 ;************************I/O ports definition**************************
                 .equ      LCD_DATA_DDR  =  DDRD
                 .equ      LCD_DATA_PORT  =  PORTD
                 .equ      LCD_RS_DDR  =  DDRC
                 .equ      LCD_RS_PORT  =  PORTC
                 .equ      LCD_EN_DDR  =  DDRC
                 .equ      LCD_EN_PORT  =  PORTC
                 .equ      LCD_RW_DDR  =  DDRC
                 .equ      LCD_RW_PORT  =  PORTC
                 .equ      LCD_RS      =  0X05          ; PC5
                 .equ      LCD_EN      =  0X03          ; PC3
                 .equ      LCD_RW      =  0X04          ; PC4
                 .equ      COL1        =  0             ; PB0, 列扫描
                 .equ      COL2        =  1             ; PB1
                 .equ      COL3        =  2             ; PB2
                 .equ      COL4        =  3             ; PB3
                 .equ      ROW1        =  4             ; PB4, 行扫描
                 .equ      ROW2        =  5             ; PB5
                 .equ      ROW3        =  0             ; PC0
                 .equ      ROW4        =  1             ; PC1
                 ;*
                 ;***********************program address definition******************************
                 .equ    chatble_one   =  $0270
                 .equ    chatble_two   =  $0280
                 .equ    dtpnt         =  $0290
                 ;*
                 ;**********************program code*********************************************
                 .cseg
                 .org    $0000
000000 c01f            rjmp    reset           ; reset ports
000001 9518            reti                    ; INT0 ports( no useing )
000002 9518            reti                    ; INT1 ports( no useing )
000003 9518            reti                    ; Timer2 compare ports
000004 9518            reti                    ; Timer2 overflow
000005 9518            reti                    ; Timer1 capture ports(no useing )
000006 9518            reti                    ; Timer1 compare A ports( no useing )
000007 9518            reti                    ; Timer1 compare B ports
000008 c1f4            rjmp    Timer1_ovf      ; Timer1 overflow ports
000009 9518            reti                    ; Timer0 overflow ports
00000a 9518            reti                    ; SPI ports
00000b 9518            reti                    ; USART RX complete ports( no useing )
00000c 9518            reti                    ; USART Empty ports( no useing )
00000d 9518            reti                    ; USART TX complete ports( no useing )
00000e 9518            reti                    ; ADC ports
00000f 9518            reti                    ; EEPROM ready ports
000010 9518            reti                    ; Analog comparator ports( no useing )
000011 9518            reti                    ; TWI ports
000012 9518            reti                    ; Timer2 inturrupt ports
000013 9518            reti                    ; Timer0 compare ports
000014 9518            reti                    ; SPM_ready 
                 .org     $0020
                 reset:
000020 e50f            ldi    temp,  low(ramend)        ;set stack address
000021 bf0d            out    spl,  temp
000022 e004            ldi    temp,  high(ramend)
000023 bf0e            out    sph,  temp
000024 d0d8            rcall    write_data_x
000025 ef0f      	    ser    temp
000026 2ed0            mov    tempff,  temp
000027 24cc            clr    temp00
000028 2766            clr    counter_temp
000029 e350      	    ldi    temp30,  $30
00002a bac1            out    LCD_DATA_DDR,  temp00
00002b bac2            out    LCD_DATA_PORT,  temp00       ; set PD ports as input
00002c 9aa5            sbi    LCD_RS_DDR,  LCD_RS        ; set RS direction as output
00002d 9aa4            sbi    LCD_RW_DDR,  LCD_RW        ; set RW direction as output
00002e 9aa3            sbi    LCD_EN_DDR,  LCD_EN        ; set EN direction as output
00002f 98ab            cbi    LCD_EN_PORT,  LCD_EN             
000030 9aac            sbi    LCD_RW_PORT,  LCD_RW
000031 98ad            cbi    LCD_RS_PORT,  LCD_RS
                 
000032 e308            ldi    temp,  $38                  ; LCD system funtion set
000033 d18a            rcall    LCD_write_command         ; DL = 1, N = 1, F =0
000034 e00c            ldi    temp,  $0c                  ; LCD display ON/OFF set
000035 d188            rcall    LCD_write_command         ; D = 1, C = 0, B = 0
000036 e001            ldi    temp,  $01                  ; LCD display clear
000037 d186            rcall    LCD_write_command
000038 e006            ldi    temp,  $06                  ; LCD entry mode set
000039 d184            rcall    LCD_write_command         ; I/D = 1, S = 0
00003a e020            ldi    coodrinate_x,  0            ; col coodrinate X
00003b e030            ldi    coodrinate_y,  0            ; row coodrinate Y
00003c eee0            ldi    zl,  low(chatble_one*2)     ; set ROM address coursor
00003d e0f4            ldi    zh,  high(chatble_one*2)
00003e d19c            rcall    LCD_write_string          ; display character string 
00003f e020            ldi    coodrinate_x,  0
000040 e031            ldi    coodrinate_y,  1
000041 e0e0            ldi    zl,  low(chatble_two*2)     ; set ROM another address coursor
000042 e0f5            ldi    zh,  high(chatble_two*2)
000043 d197            rcall    LCD_write_string          ; display character string 
000044 d0c7            rcall    Read_data_x               ; tranfer display LCD data
                       ;ldi    coodrinate_x,  0            ; col coodrinate X
                       ;ldi    coodrinate_y,  0            ; row coodrinate Y
                       ;subi    coodrinate_y,  $80
                       ;mov    temp,  coodrinate_y
                       ;rcall    LCD_write_command
                       ;ldi    temp,  $02                  ; coursor return
                       ;rcall    LCD_write_command
                 
                 ;*
                 ;************************** key press scan program******************************
                 key_press_scan:
000045 e300            ldi    temp,   0x30            ; set PB4-PB5 ports as output
000046 bb07            out    ddrb,  temp             ; set PB0-PB3 ports as input 
000047 9aa0            sbi    ddrc,  0                
000048 9aa1            sbi    ddrc,  1                ; set PC0-PC1 ports as output
000049 e00f            ldi    temp,   0x0f
00004a bb08            out    portb,  temp
00004b 98a8            cbi    portc,  0
00004c 98a9            cbi    portc,  1
00004d e104            ldi    temp,   20              ; delay time 15us
                 col_scan_start:
00004e 950a            dec    temp
00004f f7f1            brne    col_scan_start
000050 9bb0            sbis    pinb,   COL1          ; estimate pb0 low voltage level ?
000051 c007            rjmp    col_scan_one          ; if pb0 low voltage level, turning to col_scan_one
000052 9bb1            sbis    pinb,   COL2
000053 c007            rjmp    col_scan_two
000054 9bb2            sbis    pinb,   COL3
000055 c007            rjmp    col_scan_three
000056 9bb3            sbis    pinb,   COL4
000057 c007            rjmp    col_scan_four
000058 cfec            rjmp    key_press_scan        ; if pb0-pb3 no press key,or turning to key_press_scan
                 col_scan_one:
000059 e04c            ldi    key,  12
00005a c005            rjmp    row_scan_prepare
                 col_scan_two:
00005b e048            ldi    key,  8
00005c c003            rjmp    row_scan_prepare
                 col_scan_three:
00005d e044            ldi    key,  4
00005e c001            rjmp    row_scan_prepare
                 col_scan_four:
00005f e040            ldi    key,  0
                 row_scan_prepare:
000060 e00f            ldi    temp,  0x0f            ; set pb0-pb3 as output
000061 bb07            out    ddrb,  temp            ; set pb4-pb5 as input
000062 98a0            cbi    ddrc,  0
000063 98a1            cbi    ddrc,  1               ; set pc0-pc1 as input
000064 e300            ldi    temp,  0x30
000065 bb08            out    portb,  temp
000066 9aa8            sbi    portc,  0
000067 9aa9            sbi    portc,  1
000068 e104            ldi    temp,  20              ; delay time 15us
                 row_scan_start:
000069 950a            dec    temp
00006a f7f1            brne    row_scan_start
00006b 9b99            sbis    pinc,  ROW4           ; estimate pb4 low voltage level ?
00006c c007            rjmp    row_scan_one          ; if pb4 low voltage level, turning to row_scan_one
00006d 9b98            sbis    pinc,  ROW3
00006e c007            rjmp    row_scan_two
00006f 9bb5            sbis    pinb,  ROW2
000070 c007            rjmp    row_scan_three
000071 9bb4            sbis    pinb,  ROW1
000072 c007            rjmp    row_scan_four
000073 cfd1            rjmp    key_press_scan        ; if pb4-pb5,pc0-pc1 no press key
                 row_scan_one:                       ; or turning to key_press_scan
000074 e000            ldi    temp,  0
000075 c005            rjmp   col_row_finish
                 row_scan_two:
000076 e001            ldi    temp,  1
000077 c003            rjmp    col_row_finish
                 row_scan_three:
000078 e002            ldi    temp,  2
000079 c001            rjmp    col_row_finish
                 row_scan_four:
00007a e003             ldi   temp,  3
                 ;*
                 ;**************************key deal program*************************************
                 col_row_finish:
00007b 0f40             add    key,  temp
00007c 304a             cpi    key,  10              ; compare key to 10, if key<10
00007d f0a0             brlo    one_nine_deal        ; turning to one_nine_deal
                       ;cpi    key,  10              ; compare key to 10, if key=10
                       ;breq    coursor_left_deal    ; turning to coursor_left_deal
                       ;cpi    key,  11              ; compare key to 11, if key=11
                      ; breq    coursor_right_deal   ; turning to coursor_right_deal
                      ; cpi    key,  12
                      ; breq    display_go_up_cell   ; 显示上一单元的内容
                      ; cpi    key,  13
                      ; breq    display_go_down_cell 
                      ; cpi    key,  14
                      ; breq    clear_display_LCD    ; LCD clear display
00007e 304f            cpi    key,  15
00007f f009            breq    start_timer           ; start_timer
000080 cfc4             rjmp    key_press_scan
                 ;*
                 ;**********************key ten deal program************************************
                 ;coursor_left_deal:
                       ; ldi    temp,  $10                ; set coursor left shift
                       ; rcall    LCD_write_command
                       ; rcall    delay_loop              ; delay about 25ms
                        ;rjmp    key_press_scan
                 ;*
                 ;************************ key eleven deal program *****************************
                 ;coursor_right_deal:
                       ; ldi    temp,  $14                ; set coursor right shift
                       ; rcall    LCD_write_command
                       ; rcall    delay_loop
                       ; rjmp    key_press_scan
                 ;* 
                 ;************************start timer program***********************************
                 start_timer:
000081 e002             ldi    temp,  $02
000082 bd0e             out    tccr1b,  temp             ; one/eight frequency
000083 e50e             ldi    temp,  $5e      ; 24315 = 65536*8-499973 = $5efb
000084 bd0d             out    tcnt1h,  temp
000085 ef0b             ldi    temp,  $fb
000086 bd0c             out    tcnt1l,  temp
000087 e004             ldi    temp,  $04      ; toie1 = 1
000088 bf09             out    timsk,  temp
000089 e008             ldi    temp,  8        ; interrupt degree
00008a 2ee0             mov    int_temp,  temp
00008b 9478             sei
                 here: 
00008c 0000             nop
00008d 94f8             cli
00008e d07d             rcall    Read_data_x
00008f 0000             nop

⌨️ 快捷键说明

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