📄 led.lis
字号:
.module led.c
.area lit(rom, con, rel)
0000 _led_data::
0000 C000 .word 192
0002 F900 .word 249
0004 A400 .word 164
0006 B000 .word 176
0008 9900 .word 153
000A 9200 .word 146
000C 8200 .word 130
000E F800 .word 248
0010 8000 .word 128
0012 9000 .word 144
0014 8800 .word 136
0016 8300 .word 131
0018 C600 .word 198
001A A100 .word 161
001C 8600 .word 134
001E 8E00 .word 142
0020 .dbfile F:\芯生光盘资料\范例代码\ADC\4led\led.c
0020 .dbsym e led_data _led_data A[32:16]kI
.area text(rom, con, rel)
0000 .dbfile F:\芯生光盘资料\范例代码\ADC\4led\led.c
0000 .dbfunc e delay_1ms _delay_1ms fV
0000 ; i -> R16,R17
.even
0000 _delay_1ms::
0000 .dbline -1
0000 .dbline 25
0000 ; /**********************************
0000 ; ** file_name led.c **
0000 ; ** describe 七段数码管函数 **
0000 ; ** auther 芯生 **
0000 ; ** Time 2007-12-14 **
0000 ; ***********************************/
0000 ;
0000 ; #include <iom128v.h>
0000 ; #include <macros.h>
0000 ; #include "stdtypes.h"
0000 ; #include "led.h"
0000 ;
0000 ; //共阳极,LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
0000 ; const led_data[16]={
0000 ; 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0000 ; 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
0000 ; };
0000 ;
0000 ; /***********************
0000 ; **8M时为 1000.25us
0000 ; **4M时为 999.5us
0000 ; **xtal 为晶振频率,单位为Mhz
0000 ; ************************/
0000 ; void delay_1ms(void)
0000 ; {
0000 .dbline 27
0000 ; unsigned int i;
0000 ; for(i=200;i>0;i--)
0000 08EC ldi R16,200
0002 10E0 ldi R17,0
0004 02C0 xjmp L5
0006 L2:
0006 .dbline 28
0006 L3:
0006 .dbline 27
0006 0150 subi R16,1
0008 1040 sbci R17,0
000A L5:
000A .dbline 27
000A 0030 cpi R16,0
000C 0107 cpc R16,R17
000E D9F7 brne L2
0010 X0:
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbsym r i 16 i
0012 .dbend
0012 .dbfunc e delay_ms _delay_ms fV
0012 ; i -> R20,R21
0012 ; n -> R22,R23
.even
0012 _delay_ms::
0012 0E940000 xcall push_gset2
0016 B801 movw R22,R16
0018 .dbline -1
0018 .dbline 34
0018 ; ;
0018 ; }
0018 ; /***********************
0018 ; **毫秒级延时
0018 ; ************************/
0018 ; void delay_ms(unsigned int n)
0018 ; {
0018 .dbline 36
0018 ; unsigned int i;
0018 ; for(i=n;i>0;i--)
0018 AB01 movw R20,R22
001A 03C0 xjmp L10
001C L7:
001C .dbline 37
001C F1DF xcall _delay_1ms
001E L8:
001E .dbline 36
001E 4150 subi R20,1
0020 5040 sbci R21,0
0022 L10:
0022 .dbline 36
0022 4030 cpi R20,0
0024 4507 cpc R20,R21
0026 D1F7 brne L7
0028 X1:
0028 .dbline -2
0028 L6:
0028 0E940000 xcall pop_gset2
002C .dbline 0 ; func end
002C 0895 ret
002E .dbsym r i 20 i
002E .dbsym r n 22 i
002E .dbend
002E .dbfunc e led_init _led_init fV
.even
002E _led_init::
002E .dbline -1
002E .dbline 46
002E ; delay_1ms();
002E ; }
002E ;
002E ; /***********************
002E ; ** 初始化对应端口为输出
002E ; ** ABCD 和 abcdefg dpi 共12个IO口
002E ; ** 默认为 PD(4567) 和 PA(012345678)
002E ; ***********************/
002E ; void led_init(void)
002E ; {
002E .dbline 47
002E ; led_ddr = 0xFF; //abcdefg dpi 各位设为输出
002E 8FEF ldi R24,255
0030 8ABB out 0x1a,R24
0032 .dbline 48
0032 ; led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
0032 81B3 in R24,0x11
0034 806F ori R24,240
0036 81BB out 0x11,R24
0038 .dbline 51
0038 ;
0038 ; //初始化全灭
0038 ; led_port = 0xFF;
0038 8FEF ldi R24,255
003A 8BBB out 0x1b,R24
003C .dbline 52
003C ; led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
003C 82B3 in R24,0x12
003E 806F ori R24,240
0040 82BB out 0x12,R24
0042 .dbline -2
0042 L11:
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbend
0044 .dbfunc e display_one _display_one fV
0044 ; data -> R20
0044 ; count -> R22
.even
0044 _display_one::
0044 0E940000 xcall push_gset2
0048 422F mov R20,R18
004A 602F mov R22,R16
004C .dbline -1
004C .dbline 60
004C ; }
004C ;
004C ; /***********************
004C ; ** 显示一位
004C ; ** 输入:count显示在第几位(3210),data 要显示的数(0~f)
004C ; ************************/
004C ; void display_one(UNS8 count, UNS8 data)
004C ; {
004C .dbline 62
004C ;
004C ; led_contrl_port &= ~(1<<count); //选中对应要显示的位,从右至左,4567
004C 01E0 ldi R16,1
004E 162F mov R17,R22
0050 0E940000 xcall lsl8
0054 202E mov R2,R16
0056 2094 com R2
0058 32B2 in R3,0x12
005A 3220 and R3,R2
005C 32BA out 0x12,R3
005E .dbline 63
005E ; led_port = led_data[data]; //显示的数
005E 82E0 ldi R24,2
0060 849F mul R24,R20
0062 F001 movw R30,R0
0064 80E0 ldi R24,<_led_data
0066 90E0 ldi R25,>_led_data
0068 E80F add R30,R24
006A F91F adc R31,R25
006C 0590 lpm R0,Z+
006E 1490 lpm R1,Z
0070 F001 movw R30,R0
0072 EBBB out 0x1b,R30
0074 .dbline -2
0074 L12:
0074 0E940000 xcall pop_gset2
0078 .dbline 0 ; func end
0078 0895 ret
007A .dbsym r data 20 c
007A .dbsym r count 22 c
007A .dbend
007A .dbfunc e display _display fV
007A ; temp -> R20
007A ; mode -> R10
007A ; data -> R22,R23
.even
007A _display::
007A 0E940000 xcall push_gset3
007E A22E mov R10,R18
0080 B801 movw R22,R16
0082 .dbline -1
0082 .dbline 74
0082 ;
0082 ; //如果对位进行了调整,就不在是4567,而是对应的值
0082 ; }
0082 ;
0082 ; /***********************
0082 ; ** 显示四位整数
0082 ; ** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
0082 ; ** 说明:可以小于四位数,mode=1时 自动补零
0082 ; ************************/
0082 ; void display(UNS16 data,UNS8 mode)
0082 ; {
0082 .dbline 77
0082 ; UNS8 temp;
0082 ; //千位
0082 ; if(data>=1000)
0082 683E cpi R22,232
0084 E3E0 ldi R30,3
0086 7E07 cpc R23,R30
0088 70F0 brlo L14
008A .dbline 78
008A ; {//补零
008A .dbline 79
008A ; temp=data/1000;
008A 28EE ldi R18,1000
008C 33E0 ldi R19,3
008E 8B01 movw R16,R22
0090 0E940000 xcall div16u
0094 402F mov R20,R16
0096 .dbline 80
0096 ; display_one(7,temp);
0096 242F mov R18,R20
0098 07E0 ldi R16,7
009A D4DF xcall _display_one
009C .dbline 81
009C ; delay_ms(6); //6ms 是个经验值,刚好无闪烁,并且亮度较高
009C 06E0 ldi R16,6
009E 10E0 ldi R17,0
00A0 B8DF xcall _delay_ms
00A2 .dbline 82
00A2 ; led_contrl_port |= (1<<7);
00A2 979A sbi 0x12,7
00A4 .dbline 84
00A4 ;
00A4 ; }
00A4 0AC0 xjmp L15
00A6 L14:
00A6 .dbline 86
00A6 ; else
00A6 ; { if(mode==1)
00A6 .dbline 86
00A6 8A2D mov R24,R10
00A8 8130 cpi R24,1
00AA 39F4 brne L16
00AC .dbline 87
00AC ; {
00AC .dbline 88
00AC ; display_one(7,0);
00AC 2227 clr R18
00AE 07E0 ldi R16,7
00B0 C9DF xcall _display_one
00B2 .dbline 89
00B2 ; delay_ms(6);
00B2 06E0 ldi R16,6
00B4 10E0 ldi R17,0
00B6 ADDF xcall _delay_ms
00B8 .dbline 90
00B8 ; led_contrl_port |= (1<<7);
00B8 979A sbi 0x12,7
00BA .dbline 91
00BA ; }
00BA L16:
00BA .dbline 92
00BA ; }
00BA L15:
00BA .dbline 95
00BA ;
00BA ; //百位
00BA ; if(data>=100)
00BA 6436 cpi R22,100
00BC E0E0 ldi R30,0
00BE 7E07 cpc R23,R30
00C0 90F0 brlo L18
00C2 .dbline 96
00C2 ; {
00C2 .dbline 97
00C2 ; temp=(data%1000)/100;
00C2 28EE ldi R18,1000
00C4 33E0 ldi R19,3
00C6 8B01 movw R16,R22
00C8 0E940000 xcall mod16u
00CC 24E6 ldi R18,100
00CE 30E0 ldi R19,0
00D0 0E940000 xcall div16u
00D4 402F mov R20,R16
00D6 .dbline 98
00D6 ; display_one(6,temp);
00D6 242F mov R18,R20
00D8 06E0 ldi R16,6
00DA B4DF xcall _display_one
00DC .dbline 99
00DC ; delay_ms(6);
00DC 06E0 ldi R16,6
00DE 10E0 ldi R17,0
00E0 98DF xcall _delay_ms
00E2 .dbline 100
00E2 ; led_contrl_port |= (1<<6);
00E2 969A sbi 0x12,6
00E4 .dbline 101
00E4 ; }
00E4 0AC0 xjmp L19
00E6 L18:
00E6 .dbline 103
00E6 ; else
00E6 ; {
00E6 .dbline 104
00E6 ; if(mode==1)
00E6 8A2D mov R24,R10
00E8 8130 cpi R24,1
00EA 39F4 brne L20
00EC .dbline 105
00EC ; {
00EC .dbline 106
00EC ; display_one(6,0);
00EC 2227 clr R18
00EE 06E0 ldi R16,6
00F0 A9DF xcall _display_one
00F2 .dbline 107
00F2 ; delay_ms(6);
00F2 06E0 ldi R16,6
00F4 10E0 ldi R17,0
00F6 8DDF xcall _delay_ms
00F8 .dbline 108
00F8 ; led_contrl_port |= (1<<6);
00F8 969A sbi 0x12,6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -