📄 no3.lst
字号:
.equ ADEN =7
.equ ADSC =6
.equ ADFR =5
.equ ADIF =4
.equ ADIE =3
.equ ADPS2 =2
.equ ADPS1 =1
.equ ADPS0 =0
.def XL =r26
.def XH =r27
.def YL =r28
.def YH =r29
.def ZL =r30
.def ZH =r31
.equ RAMEND =$25F ;Last On-Chip SRAM location
.equ XRAMEND =$25F
.equ E2END =$1FF
.equ FLASHEND=$FFF
.equ INT0addr=$001 ;External Interrupt0 Vector Address
.equ INT1addr=$002 ;External Interrupt1 Vector Address
.equ OC2addr =$003 ;Timer2 compare match Vector Address
.equ OVF2addr=$004 ;Timer2 overflow Vector Address
.equ ICP1addr=$005 ;Timer1 Input Capture Vector Address
.equ OC1Aaddr=$006 ;Timer1 Output Compare A Interrupt Vector Address
.equ OC1Baddr=$007 ;Timer1 Output Compare B Interrupt Vector Address
.equ OVF1addr=$008 ;Overflow1 Interrupt Vector Address
.equ OVF0addr=$009 ;Overflow0 Interrupt Vector Address
.equ SPIaddr =$00A ;SPI Interrupt Vector Address
.equ URXCaddr=$00B ;UART Receive Complete Interrupt Vector Address
.equ UDREaddr=$00C ;UART Data Register Empty Interrupt Vector Address
.equ UTXCaddr=$00D ;UART Transmit Complete Interrupt Vector Address
.equ ADCCaddr=$00E ;ADC Conversion Complete Interrupt Vector Address
.equ ERDYaddr=$00F ;EEPROM Write Complete Interrupt Vector Address
.equ ACIaddr =$010 ;Analog Comparator Interrupt Vector Address
.def temp = r19 ;十六进制转换暂存器
.def count = r8 ;十六进制转换计数器
.def res1 = r4
.def res2 = r5 ;res1、res2存放结果的十六进制
.def cnt1d = r6
.def cnt2d = r7 ;cnt1、dcnt2d存放结果的十进制
.org 0x00
.equ label=$0200
000000 c01f rjmp RESET ;
;.org 0x01 ;通用中断
;INTT0: RJMP GINT ;
;.org 0x06 ;timerl
;INTTT: RJMP TINT ;
.org 0x020 ;
RESET:
000020 e50f SYS: ldi R16,low(RAMEND) ;设置堆栈
000021 bf0d out SPL,R16
000022 e002 ldi R16,high(RAMEND)
000023 bf0e out SPH,R16
000024 e208 ldi r16,$28 ;8279写控制寄存器
000025 bb02 out portd,r16
000026 ed01 ldi r16,$d1
000027 bb08 out portb,r16
000028 9a94 sbi portd,4
; ldi r20,0X30
; rcall Delay
;wdr ;看门狗复位
;ldi R16,$0F ;0b00001111
;out WDTCR,R16 ;狗周期2048MS
000029 ef08 ldi R16,$F8 ;0B11111000
00002a bb0a out DDRA,R16 ;A口0~2输入,3~7输出
00002b 9ada sbi porta,2
00002c ef0a ldi R16,$FA ;0B11111110
00002d bb01 out DDRD,R16 ;D口0/2输入,1/3~7输出
00002e ef0f ldi R16,$FF ;0B11111111
00002f bb04 out DDRC,R16 ;C口输出
000030 bb07 out DDRB,R16 ;B口输出
000031 e805 ldi R16,$85 ;设置ADC转换,中断触发,ADC为单次模式且32M分频
000032 b906 out adcsr,R16
000033 2700 clr R16
000034 b907 out admux,R16 ;ADC 0通道
000035 9a36 sbi adcsr,6 ;启动ADC
000036 e908 ldi r16,$98 ;初始化COM
000037 b90a out ucr,r16 ;设置UART控制寄存器---UCR
000038 e109 ldi r16,25
000039 b909 out ubrr,r16 ;设置UART波特率
;ldi r16,$40 ;INT0可用,INT1屏蔽
;out GIMSK,R16
;ldi r16,$3 ;INT0上升沿触发
;out mcucr,r16
00003a 9894 cbi portd,4
00003b e000 ldi r16,$00 ;8279键盘显示方式初始
00003c bb08 out portb,r16
00003d 9a94 sbi portd,4
00003e 0000 nop
00003f 9894 cbi portd,4
000040 e202 ldi r16,$22 ;8279时钟分频=2
000041 bb08 out portb,r16
000042 9a94 sbi portd,4
000043 2711 clr r17 ;ADIN 4051地址计数
000044 d027 main: rcall ADC1
000045 2c42 mov res1,r2
000046 2c53 mov res2,r3
000047 d058 rcall htd3 ;16进制转10进制
000048 d078 rcall display ;调用显示子程序
000049 3017 cpi r17,$07
00004a f439 brne addre1 ;不等于7则跳转
00004b 2711 clr r17 ;等于7
00004c 9938 sbic admux,0 ;内地址
00004d c002 rjmp addre2 ;如果admux=1则置0
00004e 9a38 sbi admux,0 ;如果admux=0则置1
00004f c003 rjmp addre3
000050 9838 addre2: cbi admux,0
000051 c001 rjmp addre3
000052 9513 addre1: inc r17
000053 2f21 addre3: mov r18,r17
000054 7021 andi r18,$01
000055 3021 cpi r18,$01
000056 f411 brne addre4
000057 9adb sbi porta,3
000058 c001 rjmp addre5
000059 98db addre4: cbi porta,3
00005a 2f21 addre5: mov r18,r17
00005b 7022 andi r18,$02
00005c 3022 cpi r18,$02
00005d f411 brne addre6
00005e 9adc sbi porta,4
00005f c001 rjmp addre7
000060 98dc addre6: cbi porta,4
000061 2f21 addre7: mov r18,r17
000062 7024 andi r18,$04
000063 3024 cpi r18,$04
000064 f411 brne addre8
000065 9add sbi porta,5
000066 c001 rjmp addre9
000067 98dd addre8: cbi porta,5
000068 e546 addre9: ldi r20,0X56 ;延时1秒
000069 d07d rcall Delay
00006a 9a36 sbi adcsr,6 ;启动ADC
00006b cfd8 rjmp main ;
;**** 子程序
00006c 9936 ADC1: sbic adcsr,adsc ;转换结束跳行否则等待
00006d cffe rjmp ADC1
00006e b024 in r2,adcl ;把转换结果送r2,r3
00006f b035 in r3,adch
000070 99ca sbic pina,2 ;读开关量
000071 e020 ldi r18,$0 ;开关量关
000072 e021 ldi r18,$1 ;开关量开
000073 e0b1 ldi r27,$01 ;传数据到SRAM 0100 处
000074 2fa1 mov r26,r17
000075 932c st x,r18 ;传开关量到 0100
000076 9938 sbic admux,0
000077 c002 rjmp admux1
000078 9650 adiw r26,$10 ;传A0数据到SRAM 0110 处
000079 c001 rjmp chuan
00007a 9690 admux1: adiw r26,$20 ;传A1数据到SRAM 0120 处
00007b 922d chuan: st x+,r2 ;传低位数据
00007c 923c st x,r3 ;传高位数据
00007d 9508 ret
;**** 16位无符号乘法
.def mc16uL =r9 ;被乘数低字节
.def mc16uH =r10 ;被乘数高字节
.def mp16uL =r11 ;乘数低字节
.def mp16uH =r12 ;乘数高字节
.def m16ua =r11 ;结果 字节 0 (LSB)
.def m16ub =r12 ;结果 字节 1
.def m16u2 =r13 ;结果 字节 2
.def m16u3 =r14 ;结果 字节 3 (MSB)
.def mcnt16u =r21 ;循环计数
00007e 24ee mpy16u: clr m16u3 ;清2.3
00007f 24dd clr m16u2
000080 e150 ldi mcnt16u,16 ;
000081 94c6 lsr mp16uH
000082 94b7 ror mp16uL
000083 f410 m16u_1: brcc noad8 ;C清零转
000084 0cd9 add m16u2,mc16uL ;加被乘数到2
000085 1cea adc m16u3,mc16uH ;加被乘数到3
000086 94e7 noad8: ror m16u3 ;带进位右循环
000087 94d7 ror m16u2 ;带进位右循环
000088 94c7 ror m16ub ;带进位右循环
000089 94b7 ror m16ua ;带进位右循环
00008a 955a dec mcnt16u ;计数减1
00008b f7b9 brne m16u_1 ;不为零转
00008c 9508 ret
;***** 16位无符号除法
.def drem16uL=r13 ;余数 低位
.def drem16uH=r14 ;余数 高位
.def dres16uL=r11 ; 商 低位
.def dres16uH=r12 ; 商 高位
.def dd16uL =r11 ;被除数 低位
.def dd16uH =r12 ;被除数 高位
.def dv16uL =r9 ;除数 低位
.def dv16uH =r10 ;除数 高位
.def dcnt16u =r21
00008d 24dd div16u: clr drem16uL ;清除余数低位
00008e 18ee sub drem16uH,drem16uH ;清除余数高位
00008f e151 ldi dcnt16u,17 ;循环计数
000090 1cbb d16u_1: rol dd16uL ;带进位左移
000091 1ccc rol dd16uH
000092 955a dec dcnt16u ;decrement counter
000093 f409 brne d16u_2 ;不为0转
000094 9508 ret ;return
000095 1cdd d16u_2: rol drem16uL ;shift dividend into remainder
000096 1cee rol drem16uH
000097 18d9 sub drem16uL,dv16uL ;remainder = remainder - divisor
000098 08ea sbc drem16uH,dv16uH ;
000099 f420 brcc d16u_3 ;if result negative
00009a 0cd9 add drem16uL,dv16uL ;restore remainder
00009b 1cea adc drem16uH,dv16uH
00009c 9488 clc ;clear carry to be shifted into result
00009d cff2 rjmp d16u_1 ;else
00009e 9408 d16u_3: sec ;set carry to be shifted into result
00009f cff0 rjmp d16u_1
htd3: ;16转10子程序
0000a0 e130 ldi temp,16
0000a1 2e83 mov count,temp
0000a2 2733 clr temp
0000a3 2466 clr cnt1d
0000a4 2477 clr cnt2d
0000a5 9488 clc
loopd:
0000a6 1c44 rol res1
0000a7 1c55 rol res2
0000a8 1c66 rol cnt1d
0000a9 1c77 rol cnt2d
0000aa 948a dec count
0000ab f409 brne c
0000ac 9508 ret
0000ad d001 c: rcall adjn
0000ae cff7 rjmp loopd
adjn:
0000af 928f push count
0000b0 2c86 mov count,cnt1d
0000b1 d006 rcall adjd1
0000b2 2c68 mov cnt1d,count
0000b3 2c87 mov count,cnt2d
0000b4 d003 rcall adjd1
0000b5 2c78 mov cnt2d,count
0000b6 908f pop count
0000b7 9508 ret
adjd1:
0000b8 e033 ldi temp,3
0000b9 0d38 add temp,count
0000ba fd33 sbrc temp,3
0000bb 2e83 mov count,temp
0000bc e330 ldi temp,$30
0000bd 0d38 add temp,count
0000be fd37 sbrc temp,7
0000bf 2e83 mov count,temp
0000c0 9508 ret
0000c1 9a95 display:sbi portd,5 ;初始化8279控制字
0000c2 9894 cbi portd,4
0000c3 e970 ldi r23,$90
0000c4 bb78 out portb,r23
0000c5 9a94 sbi portd,4
0000c6 9895 cbi portd,5
0000c7 e0f4 ldi zh,high(label*2) ;0~15通道号切换
0000c8 2fe1 mov zl,r17
0000c9 9938 sbic admux,0
0000ca c001 rjmp dis1
0000cb c001 rjmp dis0
0000cc 9638 dis1: adiw zl,$08
0000cd 95c8 dis0: lpm
0000ce ba08 out portb,r0
0000cf 9894 cbi portd,4
0000d0 0000 nop
0000d1 9a94 sbi portd,4
0000d2 2d07 mov r16,cnt2d
0000d3 9502 swap r16
0000d4 d009 rcall outpd
0000d5 2d07 mov r16,cnt2d
0000d6 d007 rcall outpd
0000d7 2d06 mov r16,cnt1d
0000d8 9502 swap r16
0000d9 d004 rcall outpd
0000da 2d06 mov r16,cnt1d
0000db d002 rcall outpd
0000dc 9a95 sbi portd,5 ;向8279传送数据结束
0000dd 9508 ret
0000de e0e0 outpd: ldi zl,low(label*2)
0000df 700f andi r16,$0f
0000e0 0fe0 add zl,r16
0000e1 95c8 lpm
0000e2 ba08 out portb,r0
0000e3 9894 cbi portd,4
0000e4 0000 nop
0000e5 9a94 sbi portd,4
0000e6 9508 ret
0000e7 934f delay: push r20 ;2t延时子程序
0000e8 934f l0: push r20 ;2t
0000e9 934f l1: push r20 ;2t
0000ea 934f l2: push r20 ;2t
0000eb 954a l3: dec r20 ;1t
0000ec f7f1 brne l3 ;1t/2t
0000ed 914f pop r20 ;2t
0000ee 954a dec r20 ;1t
0000ef f7d1 brne l2 ;1t/2t
0000f0 914f pop r20 ;2t
0000f1 954a dec r20 ;1t
0000f2 f7b1 brne l1 ;1t/2t
0000f3 914f pop r20 ;2t
0000f4 954a dec r20 ;1t
0000f5 f791 brne l0 ;1T/2T
0000f6 914f pop r20 ;2t
0000f7 9508 ret ;4t
.cseg
.org $0200
.dw 0x063f,0x4f5b,0x6d66,0x077d
000200 063f
000201 4f5b
000202 6d66
000203 077d
.dw 0x6f7f,0x7c77,0x5e39,0x7179000204 6f7f
000205 7c77
000206 5e39
000207 7179
Assembly complete with no errors.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -