📄 数码管.lst
字号:
__start:
__text_start:
0031 E5CF LDI R28,0x5F
0032 E0D4 LDI R29,4
0033 BFCD OUT 0x3D,R28
0034 BFDE OUT 0x3E,R29
0035 51C0 SUBI R28,0x10
0036 40D0 SBCI R29,0
0037 EA0A LDI R16,0xAA
0038 8308 STD Y+0,R16
0039 2400 CLR R0
003A E6EE LDI R30,0x6E
003B E0F0 LDI R31,0
003C E010 LDI R17,0
003D 36EE CPI R30,0x6E
003E 07F1 CPC R31,R17
003F F011 BEQ 0x0042
0040 9201 ST R0,Z+
0041 CFFB RJMP 0x003D
0042 8300 STD Z+0,R16
0043 E5E4 LDI R30,0x54
0044 E0F0 LDI R31,0
0045 E6A0 LDI R26,0x60
0046 E0B0 LDI R27,0
0047 E010 LDI R17,0
0048 36E2 CPI R30,0x62
0049 07F1 CPC R31,R17
004A F021 BEQ 0x004F
004B 95C8 LPM
004C 9631 ADIW R30,1
004D 920D ST R0,X+
004E CFF9 RJMP 0x0048
004F 940E00D6 CALL _main
_exit:
0051 CFFF RJMP _exit
FILE: D:\avr\+++精华+++\数码管\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007) #ifndef __delay_h
(0008) #define __delay_h
(0009) void delay_nus(unsigned int n);
(0010) void delay_nms(unsigned int n);
(0011) void delay_1us(void);
(0012) void delay_1ms(void) ;
(0013)
(0014) void delay_1us(void) //1us延时函数
(0015) {
(0016) asm("nop");
_delay_1us:
0052 0000 NOP
0053 9508 RET
_delay_nus:
i --> R20
n --> R22
0054 940E0104 CALL push_gset2
0056 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nus(unsigned int n) //N us延时函数
(0020) {
(0021) unsigned int i=0;
0057 2744 CLR R20
0058 2755 CLR R21
(0022) for (i=0;i<n;i++)
0059 C003 RJMP 0x005D
(0023) delay_1us();
005A DFF7 RCALL _delay_1us
005B 5F4F SUBI R20,0xFF
005C 4F5F SBCI R21,0xFF
005D 1746 CP R20,R22
005E 0757 CPC R21,R23
005F F3D0 BCS 0x005A
0060 940E00F8 CALL pop_gset2
0062 9508 RET
(0024) }
(0025)
(0026) void delay_1ms(void) //1ms延时函数
(0027) {
(0028) unsigned int i;
(0029) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
0063 2700 CLR R16
0064 2711 CLR R17
0065 C002 RJMP 0x0068
0066 5F0F SUBI R16,0xFF
0067 4F1F SBCI R17,0xFF
0068 3704 CPI R16,0x74
0069 E0E4 LDI R30,4
006A 071E CPC R17,R30
006B F3D0 BCS 0x0066
006C 9508 RET
_delay_nms:
i --> R20
n --> R22
006D 940E0104 CALL push_gset2
006F 01B8 MOVW R22,R16
(0030) }
(0031)
(0032) void delay_nms(unsigned int n) //N ms延时函数
(0033) {
(0034) unsigned int i=0;
0070 2744 CLR R20
0071 2755 CLR R21
(0035) for (i=0;i<n;i++)
0072 C003 RJMP 0x0076
(0036) delay_1ms();
0073 DFEF RCALL _delay_1ms
0074 5F4F SUBI R20,0xFF
0075 4F5F SBCI R21,0xFF
0076 1746 CP R20,R22
0077 0757 CPC R21,R23
0078 F3D0 BCS 0x0073
0079 940E00F8 CALL pop_gset2
007B 9508 RET
_LED_process:
p --> R20
i --> R22
007C 940E0104 CALL push_gset2
007E 01A9 MOVW R20,R18
007F 01B8 MOVW R22,R16
FILE: D:\avr\+++精华+++\数码管\led.h
(0001) #include "delay.h"
(0002) //-----------------端口设置----------------
(0003) //使用本驱动需要修改这里以及下面的显示函数中的共阴共阳设置
(0004) #define LED_SEL PORTA
(0005) #define LED_DDR_SEL DDRA
(0006) #define LED_DATA PORTB
(0007) #define LED_DDR_DATA DDRB
(0008) //----------------------------------------
(0009) //数码管字型表,对应的是:0,1,2,3,4,5,6,7,8,9
(0010) unsigned char LED_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6f,0x7d,0x07,0x7f,0x6f};
(0011) unsigned char LED_dp[4]={0,0,0,0};//显示的初始值:0,0,0,0
(0012)
(0013) //********计数值处理函数******************//
(0014) void LED_process(unsigned int i,unsigned char *p)
(0015) {p[0]=i/1000;//千位
0080 EE28 LDI R18,0xE8
0081 E033 LDI R19,3
0082 018B MOVW R16,R22
0083 940E00DE CALL div16u
0085 01FA MOVW R30,R20
0086 8300 STD Z+0,R16
(0016) p[1]=i/100%10;//百位
0087 E624 LDI R18,0x64
0088 E030 LDI R19,0
0089 018B MOVW R16,R22
008A 940E00DE CALL div16u
008C E02A LDI R18,0xA
008D E030 LDI R19,0
008E 940E00DC CALL mod16u
0090 01FA MOVW R30,R20
0091 8301 STD Z+1,R16
(0017) p[2]=i/10%10;//十位
0092 E02A LDI R18,0xA
0093 E030 LDI R19,0
0094 018B MOVW R16,R22
0095 940E00DE CALL div16u
0097 E02A LDI R18,0xA
0098 E030 LDI R19,0
0099 940E00DC CALL mod16u
009B 01FA MOVW R30,R20
009C 8302 STD Z+2,R16
(0018) p[3]=i%10;//个位
009D E02A LDI R18,0xA
009E E030 LDI R19,0
009F 018B MOVW R16,R22
00A0 940E00DC CALL mod16u
00A2 01FA MOVW R30,R20
00A3 8303 STD Z+3,R16
00A4 940E00F8 CALL pop_gset2
00A6 9508 RET
_LED_display:
sel --> R20
i --> R22
p --> R10
00A7 940E0102 CALL push_gset3
00A9 0158 MOVW R10,R16
(0019)
(0020) }
(0021)
(0022)
(0023) //**********动态显示函数,参数p为待显示的数组名**********//
(0024) void LED_display(unsigned char *p)
(0025) {unsigned char i,sel=0x01;//低位:0x01高位:0x10
00AA E041 LDI R20,1
(0026) LED_DDR_SEL=0x0f;//低位:0x0f高位:0xf0
00AB E08F LDI R24,0xF
00AC BB8A OUT 0x1A,R24
(0027) LED_DDR_DATA=0xff;
00AD EF8F LDI R24,0xFF
00AE BB87 OUT 0x17,R24
(0028) for (i=0;i<4;i++)
00AF 2766 CLR R22
00B0 C013 RJMP 0x00C4
(0029) {LED_SEL=sel;//PA为位选,共阳:LED_SEL=sel;共阴:LED_SEL=~sel;
00B1 BB4B OUT 0x1B,R20
(0030) LED_DATA=~LED_table[p[i]];
00B2 2FE6 MOV R30,R22
00B3 27FF CLR R31
00B4 0DEA ADD R30,R10
00B5 1DFB ADC R31,R11
00B6 81E0 LDD R30,Z+0
00B7 27FF CLR R31
00B8 E680 LDI R24,0x60
00B9 E090 LDI R25,0
00BA 0FE8 ADD R30,R24
00BB 1FF9 ADC R31,R25
00BC 8020 LDD R2,Z+0
00BD 9420 COM R2
00BE BA28 OUT 0x18,R2
(0031) //字型表,共阳:LED_DATA=~LED_table[p[i]];共阴:LED_DATA=LED_table[p[i]];
(0032) delay_nms(2);
00BF E002 LDI R16,2
00C0 E010 LDI R17,0
00C1 DFAB RCALL _delay_nms
(0033) sel=sel<<1;
00C2 0F44 LSL R20
00C3 9563 INC R22
00C4 3064 CPI R22,4
00C5 F358 BCS 0x00B1
00C6 940E00FB CALL pop_gset3
00C8 9508 RET
_LED:
i --> R20
00C9 940E0106 CALL push_gset1
00CB 01A8 MOVW R20,R16
(0034) }
(0035) }
(0036)
(0037) //**********数码管初始化函数**********/
(0038) /*
(0039) void LED_init(void)
(0040) {LED_SEL|=0x0f;
(0041) LED_DDR_SEL|=0x0f;
(0042) }
(0043) */
(0044)
(0045) //**********数码管显示调用函数**********//
(0046) void LED(unsigned int i)
(0047) {
(0048) LED_process(i,LED_dp);
00CC E62A LDI R18,0x6A
00CD E030 LDI R19,0
00CE 018A MOVW R16,R20
00CF DFAC RCALL _LED_process
(0049) LED_display(LED_dp);
00D0 E60A LDI R16,0x6A
00D1 E010 LDI R17,0
00D2 DFD4 RCALL _LED_display
00D3 940E0109 CALL pop_gset1
00D5 9508 RET
FILE: D:\avr\+++精华+++\数码管\main.c
(0001) /*****************************************
(0002) * 数码管演示程序 *
(0003) * 功 能:数码管 *
(0004) * 时钟频率:内部1M *
(0005) * 设 计:莫锦攀 *
(0006) * 修改日期:2007年05月30日 *
(0007) * 编译环境:ICC-AVR6.31 *
(0008) * 实验环境:M16学习板 *
(0009) * 使用端口:PA0~PA3 ,PB0~PB7 *
(0010) *****************************************/
(0011) #include <iom16v.h>
(0012) #include <macros.h>
(0013) #include "delay.h"
(0014) #include "led.h"
(0015)
(0016) #define uchar unsigned char
(0017) #define uint unsigned int
(0018)
(0019)
(0020)
(0021)
(0022)
(0023)
(0024)
(0025)
(0026)
(0027) void main(void)
(0028) {
_main:
00D6 C003 RJMP 0x00DA
(0029) while(1)
(0030) {
(0031) LED(1234);
FILE: <library>
00D7 ED02 LDI R16,0xD2
00D8 E014 LDI R17,4
00D9 DFEF RCALL _LED
00DA CFFC RJMP 0x00D7
00DB 9508 RET
mod16u:
00DC 9468 BSET 6
00DD C001 RJMP xdiv16u
div16u:
00DE 94E8 BCLR 6
xdiv16u:
00DF 92EA ST R14,-Y
00E0 92FA ST R15,-Y
00E1 938A ST R24,-Y
00E2 24EE CLR R14
00E3 24FF CLR R15
00E4 E180 LDI R24,0x10
00E5 0F00 LSL R16
00E6 1F11 ROL R17
00E7 1CEE ROL R14
00E8 1CFF ROL R15
00E9 16E2 CP R14,R18
00EA 06F3 CPC R15,R19
00EB F018 BCS 0x00EF
00EC 1AE2 SUB R14,R18
00ED 0AF3 SBC R15,R19
00EE 9503 INC R16
00EF 958A DEC R24
00F0 F7A1 BNE 0x00E5
00F1 F416 BRTC 0x00F4
00F2 2D0E MOV R16,R14
00F3 2D1F MOV R17,R15
00F4 9189 LD R24,Y+
00F5 90F9 LD R15,Y+
00F6 90E9 LD R14,Y+
00F7 9508 RET
pop_gset2:
00F8 E0E2 LDI R30,2
00F9 940C010A JMP pop
pop_gset3:
00FB E0E4 LDI R30,4
00FC 940C010A JMP pop
push_gset5:
00FE 92FA ST R15,-Y
00FF 92EA ST R14,-Y
push_gset4:
0100 92DA ST R13,-Y
0101 92CA ST R12,-Y
push_gset3:
0102 92BA ST R11,-Y
0103 92AA ST R10,-Y
push_gset2:
0104 937A ST R23,-Y
0105 936A ST R22,-Y
push_gset1:
0106 935A ST R21,-Y
0107 934A ST R20,-Y
0108 9508 RET
pop_gset1:
0109 E0E1 LDI R30,1
pop:
010A 9149 LD R20,Y+
010B 9159 LD R21,Y+
010C FDE0 SBRC R30,0
010D 9508 RET
010E 9169 LD R22,Y+
010F 9179 LD R23,Y+
0110 FDE1 SBRC R30,1
0111 9508 RET
0112 90A9 LD R10,Y+
0113 90B9 LD R11,Y+
0114 FDE2 SBRC R30,2
0115 9508 RET
0116 90C9 LD R12,Y+
0117 90D9 LD R13,Y+
0118 FDE3 SBRC R30,3
0119 9508 RET
011A 90E9 LD R14,Y+
011B 90F9 LD R15,Y+
011C 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -