数码管.lst
来自「AVR之ATMega16」· LST 代码 · 共 246 行
LST
246 行
__text_start:
__start:
0036 E5CF LDI R28,0x5F
0037 E0D4 LDI R29,4
0038 BFCD OUT 0x3D,R28
0039 BFDE OUT 0x3E,R29
003A 51C0 SUBI R28,0x10
003B 40D0 SBCI R29,0
003C EA0A LDI R16,0xAA
003D 8308 STD Y+0,R16
003E 2400 CLR R0
003F E7E8 LDI R30,0x78
0040 E0F0 LDI R31,0
0041 E010 LDI R17,0
0042 37E8 CPI R30,0x78
0043 07F1 CPC R31,R17
0044 F011 BEQ 0x0047
0045 9201 ST R0,Z+
0046 CFFB RJMP 0x0042
0047 8300 STD Z+0,R16
0048 E5E4 LDI R30,0x54
0049 E0F0 LDI R31,0
004A E6A0 LDI R26,0x60
004B E0B0 LDI R27,0
004C E010 LDI R17,0
004D 36EC CPI R30,0x6C
004E 07F1 CPC R31,R17
004F F021 BEQ 0x0054
0050 95C8 LPM
0051 9631 ADIW R30,1
0052 920D ST R0,X+
0053 CFF9 RJMP 0x004D
0054 940E0089 CALL _main
_exit:
0056 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\AVRMega16\数码管\delay.h
(0001) #define xtal 8 //8MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
0057 C002 RJMP 0x005A
(0010) while(time>1)
(0011) time--;
0058 5001 SUBI R16,1
0059 4010 SBCI R17,0
005A E081 LDI R24,1
005B E090 LDI R25,0
005C 1780 CP R24,R16
005D 0791 CPC R25,R17
005E F3C8 BCS 0x0058
005F 9508 RET
_DelayMS:
i --> R20
time --> R16
0060 940E00B5 CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
0062 C009 RJMP 0x006C
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
0063 E041 LDI R20,1
0064 E050 LDI R21,0
0065 C002 RJMP 0x0068
0066 5F4F SUBI R20,0xFF
0067 4F5F SBCI R21,0xFF
0068 3746 CPI R20,0x76
0069 E0E4 LDI R30,4
006A 075E CPC R21,R30
006B F3D0 BCS 0x0066
006C 0118 MOVW R2,R16
006D 5001 SUBI R16,1
006E 4010 SBCI R17,0
006F 2022 TST R2
0070 F791 BNE 0x0063
0071 2033 TST R3
0072 F781 BNE 0x0063
0073 940E00B8 CALL pop_gset1
0075 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\AVRMega16\数码管\数码管.c
(0001) //内部晶振 8M
(0002) //包含所需头文件
(0003) #include <ioM16v.h>
(0004) #include <macros.h>
(0005) #include"delay.h"
(0006)
(0007)
(0008)
(0009) /*------宏定义------*/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) uchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
(0014) uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
(0015) //端口初始化
(0016) void port_init(void)
(0017) {
(0018) PORTA = 0x00;//A口数据置0
_port_init:
0076 2422 CLR R2
0077 BA2B OUT 0x1B,R2
(0019) DDRA = 0xFF;//A口方向设为输出
0078 EF8F LDI R24,0xFF
0079 BB8A OUT 0x1A,R24
(0020) PORTB = 0xFF;//B口数据置1
007A BB88 OUT 0x18,R24
(0021) DDRB = 0xFF;//B口方向设为输出
007B BB87 OUT 0x17,R24
(0022) PORTC = 0x00;
007C BA25 OUT 0x15,R2
(0023) DDRC = 0x00;
007D BA24 OUT 0x14,R2
(0024) PORTD = 0x00;
007E BA22 OUT 0x12,R2
(0025) DDRD = 0x00;
007F BA21 OUT 0x11,R2
0080 9508 RET
(0026) }
(0027)
(0028)
(0029) void init_devices(void)
(0030) {
(0031) CLI(); //禁止所有中断
_init_devices:
0081 94F8 BCLR 7
(0032) MCUCR = 0x00;//外部中断触发方式
0082 2422 CLR R2
0083 BE25 OUT 0x35,R2
(0033) MCUCSR = 0x80;//禁止JTAG
0084 E880 LDI R24,0x80
0085 BF84 OUT 0x34,R24
(0034) GICR = 0x00;//外部中断使能
0086 BE2B OUT 0x3B,R2
(0035) port_init();
0087 DFEE RCALL _port_init
0088 9508 RET
(0036) //SEI();//开全局中断
(0037) }
(0038) //主函数
(0039) void main(void)
(0040) {
(0041) uchar j=0,i=0;
_main:
j --> R20
i --> R22
0089 2744 CLR R20
008A 2766 CLR R22
(0042) init_devices();
008B DFF5 RCALL _init_devices
008C C01E RJMP 0x00AB
(0043) while(1)
(0044) {
(0045) for(j=0;j<8;j++)
008D 2744 CLR R20
008E C01A RJMP 0x00A9
(0046) {
(0047) PORTB=led_seg[j];//设置数码管选通位段
008F E780 LDI R24,0x70
0090 E090 LDI R25,0
0091 2FE4 MOV R30,R20
0092 27FF CLR R31
0093 0FE8 ADD R30,R24
0094 1FF9 ADC R31,R25
0095 8020 LDD R2,Z+0
0096 BA28 OUT 0x18,R2
(0048) for(i=0;i<16;i++)
0097 2766 CLR R22
0098 C00D RJMP 0x00A6
(0049) {
(0050) PORTA=led_date[i]&0x7F;//设置数码管数据
0099 E680 LDI R24,0x60
009A E090 LDI R25,0
009B 2FE6 MOV R30,R22
009C 27FF CLR R31
009D 0FE8 ADD R30,R24
009E 1FF9 ADC R31,R25
009F 8180 LDD R24,Z+0
00A0 778F ANDI R24,0x7F
00A1 BB8B OUT 0x1B,R24
(0051) DelayMS(300);//延迟
FILE: <library>
00A2 E20C LDI R16,0x2C
00A3 E011 LDI R17,1
00A4 DFBB RCALL _DelayMS
00A5 9563 INC R22
00A6 3160 CPI R22,0x10
00A7 F388 BCS 0x0099
00A8 9543 INC R20
00A9 3048 CPI R20,0x8
00AA F320 BCS 0x008F
00AB CFE1 RJMP 0x008D
00AC 9508 RET
push_gset5:
00AD 92FA ST R15,-Y
00AE 92EA ST R14,-Y
push_gset4:
00AF 92DA ST R13,-Y
00B0 92CA ST R12,-Y
push_gset3:
00B1 92BA ST R11,-Y
00B2 92AA ST R10,-Y
push_gset2:
00B3 937A ST R23,-Y
00B4 936A ST R22,-Y
push_gset1:
00B5 935A ST R21,-Y
00B6 934A ST R20,-Y
00B7 9508 RET
pop_gset1:
00B8 E0E1 LDI R30,1
pop:
00B9 9149 LD R20,Y+
00BA 9159 LD R21,Y+
00BB FDE0 SBRC R30,0
00BC 9508 RET
00BD 9169 LD R22,Y+
00BE 9179 LD R23,Y+
00BF FDE1 SBRC R30,1
00C0 9508 RET
00C1 90A9 LD R10,Y+
00C2 90B9 LD R11,Y+
00C3 FDE2 SBRC R30,2
00C4 9508 RET
00C5 90C9 LD R12,Y+
00C6 90D9 LD R13,Y+
00C7 FDE3 SBRC R30,3
00C8 9508 RET
00C9 90E9 LD R14,Y+
00CA 90F9 LD R15,Y+
00CB 9508 RET
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?