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

📄 led.lis

📁 一个关于AVR单片机的例程
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module led.c
                        .area lit(rom, con, rel)
 0000           _led_data::
 0000 3F00              .word 63
 0002 0600              .word 6
 0004 5B00              .word 91
 0006 4F00              .word 79
 0008 6600              .word 102
 000A 6D00              .word 109
 000C 7D00              .word 125
 000E 0700              .word 7
 0010 7F00              .word 127
 0012 6F00              .word 111
 0014 7700              .word 119
 0016 7300              .word 115
 0018 3900              .word 57
 001A 6300              .word 99
 001C 7900              .word 121
 001E 0000              .byte 0,0
 0020                   .dbfile C:\DOCUME~1\administrator\桌面\教程\7断数码管\led.c
 0020                   .dbsym e led_data _led_data A[32:16]kI
                        .area text(rom, con, rel)
 0000                   .dbfile C:\DOCUME~1\administrator\桌面\教程\7断数码管\led.c
 0000                   .dbfunc e led_init _led_init fV
                        .even
 0000           _led_init::
 0000                   .dbline -1
 0000                   .dbline 20
 0000           ; /**********************************
 0000           ; ** file_name led.c             **
 0000           ; ** describe  七段数码管函数        **
 0000           ; ** auther    古欣 www.avrvi.com  **
 0000           ; ** Time      200-2-25           **
 0000           ; ** temp=(data*1000)%1; 这个式子中的%为取余数,temp为data的第三位小数,0.023(data) --> 3(temp) 
 0000           ; ***********************************/
 0000           ; #include "config.h"
 0000           ; 
 0000           ; 
 0000           ; //LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
 0000           ; const led_data[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x73,0x39,0x63,0x79};
 0000           ; 
 0000           ; /***********************
 0000           ; ** 初始化对应端口为输出 
 0000           ; ** ABCD 和 abcdefg dpi 共12个IO口
 0000           ; ** 默认为 PB(0123) 和 PA
 0000           ; ***********************/
 0000           ; void led_init(void)
 0000           ; {
 0000                   .dbline 21
 0000           ;  led_ddr = 0xFF; //abcdefg dpi 各位设为输出
 0000 8FEF              ldi R24,255
 0002 8ABB              out 0x1a,R24
 0004                   .dbline 22
 0004           ;  led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
 0004 87B3              in R24,0x17
 0006 8F60              ori R24,15
 0008 87BB              out 0x17,R24
 000A                   .dbline -2
 000A           L1:
 000A                   .dbline 0 ; func end
 000A 0895              ret
 000C                   .dbend
 000C                   .dbfunc e display_one _display_one fV
 000C           ;           data -> R22
 000C           ;          count -> R20
                        .even
 000C           _display_one::
 000C 0E940000          xcall push_gset2
 0010 622F              mov R22,R18
 0012 402F              mov R20,R16
 0014                   .dbline -1
 0014                   .dbline 34
 0014           ;  
 0014           ;  // 以下两句将会使LED全亮,如果立即更改状态,将看不出来效果
 0014           ;  // led_port = 0xFF;
 0014           ;  // led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
 0014           ; }
 0014           ; 
 0014           ; /***********************
 0014           ; ** 显示一位
 0014           ; ** 输入:count显示在第几位(3210),data 要显示的数(0~f)
 0014           ; ************************/
 0014           ; void display_one(uint8 count, uint8 data)
 0014           ; {
 0014                   .dbline 35
 0014           ;  led_port = led_data[data];    //显示的数
 0014 82E0              ldi R24,2
 0016 869F              mul R24,R22
 0018 F001              movw R30,R0
 001A 80E0              ldi R24,<_led_data
 001C 90E0              ldi R25,>_led_data
 001E E80F              add R30,R24
 0020 F91F              adc R31,R25
 0022 0590              lpm R0,Z+
 0024 1490              lpm R1,Z
 0026 F001              movw R30,R0
 0028 EBBB              out 0x1b,R30
 002A                   .dbline 36
 002A           ;  led_contrl_port |= (1<<count); //选中对应要显示的位,从右至左,0123
 002A 01E0              ldi R16,1
 002C 142F              mov R17,R20
 002E 0E940000          xcall lsl8
 0032 28B2              in R2,0x18
 0034 202A              or R2,R16
 0036 28BA              out 0x18,R2
 0038                   .dbline -2
 0038           L2:
 0038 0E940000          xcall pop_gset2
 003C                   .dbline 0 ; func end
 003C 0895              ret
 003E                   .dbsym r data 22 c
 003E                   .dbsym r count 20 c
 003E                   .dbend
 003E                   .dbfunc e display _display fV
 003E           ;           temp -> R20
 003E           ;           mode -> R10
 003E           ;           data -> R22,R23
                        .even
 003E           _display::
 003E 0E940000          xcall push_gset3
 0042 A22E              mov R10,R18
 0044 B801              movw R22,R16
 0046                   .dbline -1
 0046                   .dbline 46
 0046           ;  //如果对位进行了调整,就不在是0123,而是对应的值
 0046           ; }
 0046           ; 
 0046           ; /***********************
 0046           ; ** 显示四位整数
 0046           ; ** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
 0046           ; ** 说明:可以小于四位数,mode=1时 自动补零
 0046           ; ************************/
 0046           ; void display(uint16 data,uint8 mode)
 0046           ; {
 0046                   .dbline 49
 0046           ;  uint8 temp;
 0046           ;  //千位
 0046           ;  if(data>=1000)
 0046 683E              cpi R22,232
 0048 E3E0              ldi R30,3
 004A 7E07              cpc R23,R30
 004C 78F0              brlo L4
 004E                   .dbline 50
 004E           ;  {
 004E                   .dbline 51
 004E           ;   temp=data/1000;
 004E 28EE              ldi R18,1000
 0050 33E0              ldi R19,3
 0052 8B01              movw R16,R22
 0054 0E940000          xcall div16u
 0058 402F              mov R20,R16
 005A                   .dbline 52
 005A           ;   display_one(3,temp);
 005A 242F              mov R18,R20
 005C 03E0              ldi R16,3
 005E D6DF              xcall _display_one
 0060                   .dbline 53
 0060           ;   delay_ms(6);  //6ms 是个经验值,刚好无闪烁,并且亮度较高
 0060 06E0              ldi R16,6
 0062 10E0              ldi R17,0
 0064 0E940000          xcall _delay_ms
 0068                   .dbline 54
 0068           ;   led_contrl_port &=~ (1<<3);
 0068 C398              cbi 0x18,3
 006A                   .dbline 55
 006A           ;  }
 006A 0BC0              xjmp L5
 006C           L4:
 006C                   .dbline 57
 006C           ;  else
 006C           ;  {//补零
 006C                   .dbline 58
 006C           ;   if(mode==1)
 006C 8A2D              mov R24,R10
 006E 8130              cpi R24,1
 0070 41F4              brne L6
 0072                   .dbline 59
 0072           ;   {
 0072                   .dbline 60
 0072           ;   display_one(3,0);
 0072 2227              clr R18
 0074 03E0              ldi R16,3
 0076 CADF              xcall _display_one
 0078                   .dbline 61
 0078           ;   delay_ms(6);
 0078 06E0              ldi R16,6
 007A 10E0              ldi R17,0
 007C 0E940000          xcall _delay_ms
 0080                   .dbline 62
 0080           ;   led_contrl_port &=~ (1<<3);
 0080 C398              cbi 0x18,3
 0082                   .dbline 63
 0082           ;   }
 0082           L6:
 0082                   .dbline 64
 0082           ;  }
 0082           L5:
 0082                   .dbline 66
 0082           ;  //百位
 0082           ;  if(data>=100)
 0082 6436              cpi R22,100
 0084 E0E0              ldi R30,0
 0086 7E07              cpc R23,R30
 0088 98F0              brlo L8
 008A                   .dbline 67
 008A           ;  {
 008A                   .dbline 68
 008A           ;   temp=(data%1000)/100;
 008A 28EE              ldi R18,1000
 008C 33E0              ldi R19,3
 008E 8B01              movw R16,R22
 0090 0E940000          xcall mod16u
 0094 24E6              ldi R18,100
 0096 30E0              ldi R19,0
 0098 0E940000          xcall div16u
 009C 402F              mov R20,R16
 009E                   .dbline 69
 009E           ;   display_one(2,temp);
 009E 242F              mov R18,R20
 00A0 02E0              ldi R16,2
 00A2 B4DF              xcall _display_one
 00A4                   .dbline 70
 00A4           ;   delay_ms(6);
 00A4 06E0              ldi R16,6
 00A6 10E0              ldi R17,0
 00A8 0E940000          xcall _delay_ms
 00AC                   .dbline 71
 00AC           ;   led_contrl_port &=~ (1<<2);
 00AC C298              cbi 0x18,2
 00AE                   .dbline 72
 00AE           ;  }
 00AE 0BC0              xjmp L9
 00B0           L8:
 00B0                   .dbline 74
 00B0           ;  else
 00B0           ;  {
 00B0                   .dbline 75
 00B0           ;   if(mode==1)
 00B0 8A2D              mov R24,R10
 00B2 8130              cpi R24,1
 00B4 41F4              brne L10
 00B6                   .dbline 76
 00B6           ;   {
 00B6                   .dbline 77
 00B6           ;   display_one(2,0);
 00B6 2227              clr R18
 00B8 02E0              ldi R16,2
 00BA A8DF              xcall _display_one
 00BC                   .dbline 78
 00BC           ;   delay_ms(6);
 00BC 06E0              ldi R16,6
 00BE 10E0              ldi R17,0
 00C0 0E940000          xcall _delay_ms
 00C4                   .dbline 79
 00C4           ;   led_contrl_port &=~ (1<<2);
 00C4 C298              cbi 0x18,2
 00C6                   .dbline 80
 00C6           ;   }
 00C6           L10:
 00C6                   .dbline 81
 00C6           ;  }
 00C6           L9:
 00C6                   .dbline 83
 00C6           ;  //十位
 00C6           ;  if(data>=10)
 00C6 6A30              cpi R22,10
 00C8 E0E0              ldi R30,0
 00CA 7E07              cpc R23,R30
 00CC 98F0              brlo L12
 00CE                   .dbline 84
 00CE           ;  {
 00CE                   .dbline 85
 00CE           ;   temp=(data%100)/10;
 00CE 24E6              ldi R18,100
 00D0 30E0              ldi R19,0
 00D2 8B01              movw R16,R22
 00D4 0E940000          xcall mod16u
 00D8 2AE0              ldi R18,10
 00DA 30E0              ldi R19,0
 00DC 0E940000          xcall div16u
 00E0 402F              mov R20,R16
 00E2                   .dbline 86
 00E2           ;   display_one(1,temp);
 00E2 242F              mov R18,R20
 00E4 01E0              ldi R16,1
 00E6 92DF              xcall _display_one
 00E8                   .dbline 87
 00E8           ;   delay_ms(6);
 00E8 06E0              ldi R16,6
 00EA 10E0              ldi R17,0
 00EC 0E940000          xcall _delay_ms
 00F0                   .dbline 88
 00F0           ;   led_contrl_port &=~ (1<<1);
 00F0 C198              cbi 0x18,1
 00F2                   .dbline 89
 00F2           ;  }
 00F2 0BC0              xjmp L13
 00F4           L12:
 00F4                   .dbline 91
 00F4           ;  else
 00F4           ;  {
 00F4                   .dbline 92
 00F4           ;   if(mode==1)
 00F4 8A2D              mov R24,R10
 00F6 8130              cpi R24,1
 00F8 41F4              brne L14
 00FA                   .dbline 93
 00FA           ;   {
 00FA                   .dbline 94
 00FA           ;   display_one(1,0);
 00FA 2227              clr R18
 00FC 01E0              ldi R16,1
 00FE 86DF              xcall _display_one
 0100                   .dbline 95
 0100           ;   delay_ms(6);
 0100 06E0              ldi R16,6
 0102 10E0              ldi R17,0
 0104 0E940000          xcall _delay_ms
 0108                   .dbline 96
 0108           ;   led_contrl_port &=~ (1<<1);
 0108 C198              cbi 0x18,1
 010A                   .dbline 97
 010A           ;   }
 010A           L14:
 010A                   .dbline 98
 010A           ;  }
 010A           L13:
 010A                   .dbline 100
 010A           ;  //个位
 010A           ;   temp=data%10;
 010A 2AE0              ldi R18,10
 010C 30E0              ldi R19,0
 010E 8B01              movw R16,R22
 0110 0E940000          xcall mod16u
 0114 402F              mov R20,R16
 0116                   .dbline 101
 0116           ;   display_one(0,temp);
 0116 242F              mov R18,R20
 0118 0027              clr R16
 011A 78DF              xcall _display_one
 011C                   .dbline 102
 011C           ;   delay_ms(6);
 011C 06E0              ldi R16,6
 011E 10E0              ldi R17,0
 0120 0E940000          xcall _delay_ms
 0124                   .dbline 103
 0124           ;   led_contrl_port &=~ (1<<0);
 0124 C098              cbi 0x18,0
 0126                   .dbline -2
 0126           L3:
 0126 0E940000          xcall pop_gset3
 012A                   .dbline 0 ; func end
 012A 0895              ret
 012C                   .dbsym r temp 20 c
 012C                   .dbsym r mode 10 c

⌨️ 快捷键说明

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