?? led.lis
字號:
.module LED.c
.area text(rom, con, rel)
0000 .dbfile F:\AVR資料\臺燈\LED.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 13
0000 ; //ICC-AVR application builder // Target : M16
0000 ; // Crystal: 4.0000Mhz
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #define uchar unsigned char
0000 ; #define uint unsigned int
0000 ; void port_init(void);
0000 ; void timer0_init(void);
0000 ; void init_devices(void);
0000 ; void delay_short(uint t);
0000 ; uchar scan_key(void);
0000 ; void port_init(void)
0000 ; {
0000 .dbline 14
0000 ; PORTA = 0x00;
0000 2224 clr R2
0002 2BBA out 0x1b,R2
0004 .dbline 15
0004 ; DDRA = 0x00;
0004 2ABA out 0x1a,R2
0006 .dbline 16
0006 ; PORTB = BIT(PB3);
0006 88E0 ldi R24,8
0008 88BB out 0x18,R24
000A .dbline 17
000A ; DDRB = BIT(PB3);
000A 87BB out 0x17,R24
000C .dbline 18
000C ; PORTC = 0x00; //m103 output only
000C 25BA out 0x15,R2
000E .dbline 19
000E ; DDRC = 0x00;
000E 24BA out 0x14,R2
0010 .dbline 20
0010 ; PORTD = 0x07;
0010 87E0 ldi R24,7
0012 82BB out 0x12,R24
0014 .dbline 21
0014 ; DDRD = 0x00;
0014 21BA out 0x11,R2
0016 .dbline -2
0016 L1:
0016 .dbline 0 ; func end
0016 0895 ret
0018 .dbend
0018 .dbfunc e timer0_init _timer0_init fV
.even
0018 _timer0_init::
0018 .dbline -1
0018 .dbline 27
0018 ; }
0018 ; // WGM: PWM Phase correct
0018 ; // desired value: 1KHz
0018 ; // actual value: 0.980KHz (-2.0%)
0018 ; void timer0_init(void)
0018 ; {
0018 .dbline 28
0018 ; TCCR0 = 0x00; //stop
0018 2224 clr R2
001A 23BE out 0x33,R2
001C .dbline 29
001C ; TCNT0 = 0x01; //set count
001C 81E0 ldi R24,1
001E 82BF out 0x32,R24
0020 .dbline 30
0020 ; OCR0 = 0xFF; //set compare
0020 8FEF ldi R24,255
0022 8CBF out 0x3c,R24
0024 .dbline 31
0024 ; TCCR0 = 0x62; //start timer ; 相位修正, 8分頻
0024 82E6 ldi R24,98
0026 83BF out 0x33,R24
0028 .dbline -2
0028 L2:
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbend
002A .dbfunc e init_devices _init_devices fV
.even
002A _init_devices::
002A .dbline -1
002A .dbline 35
002A ; }
002A ; //call this routine to initialize all peripherals
002A ; void init_devices(void)
002A ; {
002A .dbline 37
002A ; //stop errant interrupts until set up
002A ; CLI(); //disable all interrupts
002A F894 cli
002C .dbline 38
002C ; port_init();
002C E9DF xcall _port_init
002E .dbline 39
002E ; timer0_init();
002E F4DF xcall _timer0_init
0030 .dbline 40
0030 ; MCUCR = 0x00;
0030 2224 clr R2
0032 25BE out 0x35,R2
0034 .dbline 41
0034 ; GICR = 0x00;
0034 2BBE out 0x3b,R2
0036 .dbline 42
0036 ; TIMSK = 0x00; //timer interrupt sources
0036 29BE out 0x39,R2
0038 .dbline 43
0038 ; SEI(); //re-enable interrupts
0038 7894 sei
003A .dbline -2
003A L3:
003A .dbline 0 ; func end
003A 0895 ret
003C .dbend
003C .dbfunc e delay_short _delay_short fV
003C ; i -> R20,R21
003C ; t -> R16,R17
.even
003C _delay_short::
003C 0E940000 xcall push_gset1
0040 .dbline -1
0040 .dbline 47
0040 ; //all peripherals are now initialized
0040 ; }
0040 ; void delay_short(uint t) // 短延時
0040 ; {
0040 .dbline 49
0040 4427 clr R20
0042 5527 clr R21
0044 02C0 xjmp L8
0046 L5:
0046 .dbline 49
0046 L6:
0046 .dbline 49
0046 4F5F subi R20,255 ; offset = 1
0048 5F4F sbci R21,255
004A L8:
004A .dbline 49
004A ; uint i;
004A ; for (i=0;i<t;i++);
004A 4017 cp R20,R16
004C 5107 cpc R21,R17
004E D8F3 brlo L5
0050 .dbline -2
0050 L4:
0050 0E940000 xcall pop_gset1
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbsym r i 20 i
0056 .dbsym r t 16 i
0056 .dbend
0056 .dbfunc e scan_key _scan_key fc
0056 ; v -> R20
.even
0056 _scan_key::
0056 0E940000 xcall push_gset1
005A .dbline -1
005A .dbline 52
005A ; }
005A ; uchar scan_key(void) // 按鍵掃瞄
005A ; {
005A .dbline 55
005A ; uchar v;
005A ;
005A ; v = 0;
005A 4427 clr R20
005C .dbline 57
005C ;
005C ; if ((PIND & 0x07) != 0x07)
005C 80B3 in R24,0x10
005E 8770 andi R24,7
0060 8730 cpi R24,7
0062 91F0 breq L19
0064 .dbline 58
0064 ; {
0064 .dbline 60
0064 ;
0064 ; if ((PIND & 0x01) == 0)
0064 8099 sbic 0x10,0
0066 04C0 rjmp L12
0068 .dbline 61
0068 ; {
0068 .dbline 62
0068 ; v = 1;
0068 41E0 ldi R20,1
006A .dbline 63
006A ; delay_short(1000);
006A 08EE ldi R16,1000
006C 13E0 ldi R17,3
006E E6DF xcall _delay_short
0070 .dbline 64
0070 ; }
0070 L12:
0070 .dbline 66
0070 ;
0070 ; if ((PIND & 0x2) == 0)
0070 8199 sbic 0x10,1
0072 04C0 rjmp L14
0074 .dbline 67
0074 ; {
0074 .dbline 68
0074 ; v = 2;
0074 42E0 ldi R20,2
0076 .dbline 69
0076 ; delay_short(1000);
0076 08EE ldi R16,1000
0078 13E0 ldi R17,3
007A E0DF xcall _delay_short
007C .dbline 70
007C ; }
007C L14:
007C .dbline 72
007C ;
007C ; if ((PIND & 0x4) == 0)
007C 8299 sbic 0x10,2
007E 04C0 rjmp L19
0080 .dbline 73
0080 ; {
0080 .dbline 74
0080 ; v = 3;
0080 43E0 ldi R20,3
0082 .dbline 75
0082 ; delay_short(1000);
0082 08EE ldi R16,1000
0084 13E0 ldi R17,3
0086 DADF xcall _delay_short
0088 .dbline 76
0088 ; }
0088 .dbline 77
0088 ; };
0088 .dbline 77
0088 L18:
0088 .dbline 78
0088 L19:
0088 .dbline 78
0088 ; while((PIND & 0x07) != 0x07); // 判斷按鍵是不是放開
0088 80B3 in R24,0x10
008A 8770 andi R24,7
008C 8730 cpi R24,7
008E E1F7 brne L18
0090 .dbline 79
0090 ; return v;
0090 042F mov R16,R20
0092 .dbline -2
0092 L9:
0092 0E940000 xcall pop_gset1
0096 .dbline 0 ; func end
0096 0895 ret
0098 .dbsym r v 20 c
0098 .dbend
0098 .dbfunc e main _main fV
0098 ; OCR0_V -> R20
0098 ; key -> R22
.even
0098 _main::
0098 .dbline -1
0098 .dbline 82
0098 ; }
0098 ; void main(void)
0098 ; {
0098 .dbline 85
0098 ; uchar key, OCR0_V;
0098 ;
0098 ; init_devices();
0098 C8DF xcall _init_devices
009A .dbline 86
009A ; OCR0_V = 0xff;
009A 4FEF ldi R20,255
009C 11C0 xjmp L23
009E L22:
009E .dbline 89
009E ;
009E ; while(1)
009E ; {
009E .dbline 90
009E ; key = scan_key();
009E DBDF xcall _scan_key
00A0 602F mov R22,R16
00A2 .dbline 92
00A2 ;
00A2 ; if (key > 0)
00A2 2224 clr R2
00A4 2016 cp R2,R16
00A6 60F4 brsh L25
00A8 .dbline 93
00A8 ; {
00A8 .dbline 94
00A8 ; if (key==1) // 減少佔空比
00A8 0130 cpi R16,1
00AA 11F4 brne L27
00AC .dbline 95
00AC ; {
00AC .dbline 96
00AC ; OCR0_V -= 10;
00AC 4A50 subi R20,10
00AE .dbline 97
00AE ; OCR0 = OCR0_V;
00AE 4CBF out 0x3c,R20
00B0 .dbline 98
00B0 L27:
00B0 .dbline 98
00B0 ; };
00B0 .dbline 100
00B0 ;
00B0 ; if (key==2) // 增加佔空比
00B0 6230 cpi R22,2
00B2 11F4 brne L29
00B4 .dbline 101
00B4 ; {
00B4 .dbline 102
00B4 ; OCR0_V += 10;
00B4 465F subi R20,246 ; addi 10
00B6 .dbline 103
00B6 ; OCR0 = OCR0_V;
00B6 4CBF out 0x3c,R20
00B8 .dbline 104
00B8 L29:
00B8 .dbline 104
00B8 ; };
00B8 .dbline 106
00B8 ;
00B8 ; if (key==3) // 全黑,佔空比為100%
00B8 6330 cpi R22,3
00BA 11F4 brne L31
00BC .dbline 107
00BC ; {
00BC .dbline 108
00BC ; OCR0_V = 0xff;
00BC 4FEF ldi R20,255
00BE .dbline 109
00BE ; OCR0 = OCR0_V;
00BE 4CBF out 0x3c,R20
00C0 .dbline 110
00C0 L31:
00C0 .dbline 110
00C0 ; };
00C0 .dbline 111
00C0 ; }
00C0 L25:
00C0 .dbline 112
00C0 L23:
00C0 .dbline 88
00C0 EECF xjmp L22
00C2 X0:
00C2 .dbline 112
00C2 ; };
00C2 .dbline -2
00C2 L21:
00C2 .dbline 0 ; func end
00C2 0895 ret
00C4 .dbsym r OCR0_V 20 c
00C4 .dbsym r key 22 c
00C4 .dbend
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -