📄 led.lis
字号:
.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 + -