📄 cplcd.lst
字号:
.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 + -