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

📄 led.lis

📁 1.利用PWM控制占空比实现LED的亮暗。 2.可以用UP DOWM键进行控制亮暗。
💻 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 + -