📄 display.lst
字号:
__start:
__text_start:
000D E5CF LDI R28,0x5F
000E E0D2 LDI R29,2
000F BFCD OUT 0x3D,R28
0010 BFDE OUT 0x3E,R29
0011 51C0 SUBI R28,0x10
0012 40D0 SBCI R29,0
0013 EA0A LDI R16,0xAA
0014 8308 STD Y+0,R16
0015 2400 CLR R0
0016 E6E6 LDI R30,0x66
0017 E0F0 LDI R31,0
0018 E010 LDI R17,0
0019 36E6 CPI R30,0x66
001A 07F1 CPC R31,R17
001B F011 BEQ 0x001E
001C 9201 ST R0,Z+
001D CFFB RJMP 0x0019
001E 8300 STD Z+0,R16
001F E1E4 LDI R30,0x14
0020 E0F0 LDI R31,0
0021 E6A0 LDI R26,0x60
0022 E0B0 LDI R27,0
0023 E010 LDI R17,0
0024 31EA CPI R30,0x1A
0025 07F1 CPC R31,R17
0026 F021 BEQ 0x002B
0027 95C8 LPM
0028 9631 ADIW R30,1
0029 920D ST R0,X+
002A CFF9 RJMP 0x0024
002B D025 RCALL _main
_exit:
002C CFFF RJMP _exit
FILE: display.c
(0001) /*********************************************
(0002) HTTP://WWW.SL.COM.CN
(0003) 双龙电子
(0004) 六路动态扫描显示程序
(0005) **********************************************/
(0006) #include <iom16v.h>
(0007) extern void delay_ms(unsigned int n);//引用外部函数
(0008) extern void delay_1ms(void);
(0009) /* 七段译码字形表 */
(0010) const unsigned char tabel[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
(0011) /* 显示缓冲区 */
(0012) unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
(0013) void port_init(void)//端口初始化
(0014) {
(0015) DDRD=0x3f;
_port_init:
002D E38F LDI R24,0x3F
002E BB81 OUT 0x11,R24
(0016) DDRB=0xff;
002F EF8F LDI R24,0xFF
0030 BB87 OUT 0x17,R24
(0017) PORTD=0xff;
0031 BB82 OUT 0x12,R24
(0018) PORTB=0xff;
0032 BB88 OUT 0x18,R24
0033 9508 RET
_display:
i --> R20
0034 D065 RCALL push_gset1
(0019) }
(0020) void display(void)//六路动态扫描显示电路
(0021) {
(0022) unsigned char i;
(0023) for (i=0;i<6;i++)
0035 2744 CLR R20
0036 C016 RJMP 0x004D
(0024) {
(0025) PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
0037 E680 LDI R24,0x60
0038 E090 LDI R25,0
0039 2FE4 MOV R30,R20
003A 27FF CLR R31
003B 0FE8 ADD R30,R24
003C 1FF9 ADC R31,R25
003D 8020 LDD R2,Z+0
003E BA28 OUT 0x18,R2
(0026) PORTD=~(1<<i); //开始显示
003F E001 LDI R16,1
0040 2F14 MOV R17,R20
0041 D06F RCALL lsl8
0042 2E20 MOV R2,R16
0043 9420 COM R2
0044 BA22 OUT 0x12,R2
(0027) delay_1ms(); //每一位显示保持一定时间
0045 D031 RCALL _delay_1ms
(0028) PORTD|=(1<<i); //关闭显示
0046 E001 LDI R16,1
0047 2F14 MOV R17,R20
0048 D068 RCALL lsl8
0049 B222 IN R2,0x12
004A 2A20 OR R2,R16
004B BA22 OUT 0x12,R2
004C 9543 INC R20
004D 3046 CPI R20,6
004E F340 BCS 0x0037
004F D04D RCALL pop_gset1
0050 9508 RET
(0029) }
(0030) }
(0031) /*主程序功能:演示了一个多路动态扫描程序的工作过程*/
(0032) void main(void)
(0033) {
(0034) unsigned char i,j;
(0035) MCUCR=0;
_main:
i --> R20
j --> R22
0051 2422 CLR R2
0052 BE25 OUT 0x35,R2
(0036) port_init(); //端口初始化
0053 DFD9 RCALL _port_init
0054 C020 RJMP 0x0075
(0037) while(1)
(0038) {
(0039) for(i=0;i<0x10;i++)
0055 2744 CLR R20
0056 C01C RJMP 0x0073
(0040) {
(0041) for(j=0;j<6;j++)
0057 2766 CLR R22
0058 C011 RJMP 0x006A
(0042) ledbuff[j]=tabel[i] ;//更换显示字形
0059 E084 LDI R24,4
005A E090 LDI R25,0
005B 2E24 MOV R2,R20
005C 2433 CLR R3
005D 0E28 ADD R2,R24
005E 1E39 ADC R3,R25
005F 2DE2 MOV R30,R2
0060 2DF3 MOV R31,R3
0061 95C8 LPM
0062 E680 LDI R24,0x60
0063 E090 LDI R25,0
0064 2FE6 MOV R30,R22
0065 27FF CLR R31
0066 0FE8 ADD R30,R24
0067 1FF9 ADC R31,R25
0068 8200 STD Z+0,R0
0069 9563 INC R22
006A 3066 CPI R22,6
006B F368 BCS 0x0059
(0043) for (j=0;j<200;j++)
006C 2766 CLR R22
006D C002 RJMP 0x0070
(0044) display(); //循环显示200次
006E DFC5 RCALL _display
006F 9563 INC R22
0070 3C68 CPI R22,0xC8
0071 F3E0 BCS 0x006E
0072 9543 INC R20
0073 3140 CPI R20,0x10
0074 F310 BCS 0x0057
0075 CFDF RJMP 0x0055
0076 9508 RET
(0045) }
(0046) }
(0047) }
(0048)
(0049) #define xtal 8
(0050) void delay_1ms(void)
(0051) { unsigned int i;
(0052) for(i=1;i<(unsigned int)(xtal*143-2);i++)
_delay_1ms:
i --> R16
0077 E001 LDI R16,1
0078 E010 LDI R17,0
0079 C002 RJMP 0x007C
007A 5F0F SUBI R16,0xFF
007B 4F1F SBCI R17,0xFF
007C E786 LDI R24,0x76
007D E094 LDI R25,4
007E 1708 CP R16,R24
007F 0719 CPC R17,R25
0080 F3C8 BCS 0x007A
0081 9508 RET
_delay_ms:
i --> R20
n --> R22
0082 D015 RCALL push_gset2
0083 2F60 MOV R22,R16
0084 2F71 MOV R23,R17
(0053) ;
(0054) }
(0055) void delay_ms(unsigned int n)
(0056) {
(0057) unsigned int i=0;
0085 2744 CLR R20
0086 2755 CLR R21
0087 C003 RJMP 0x008B
(0058) while(i<n)
(0059) {delay_1ms();
0088 DFEE RCALL _delay_1ms
(0060) i++;
FILE: <library>
0089 5F4F SUBI R20,0xFF
008A 4F5F SBCI R21,0xFF
008B 1746 CP R20,R22
008C 0757 CPC R21,R23
008D F3D0 BCS 0x0088
008E D001 RCALL pop_gset2
008F 9508 RET
pop_gset2:
0090 E0E2 LDI R30,2
0091 C00C RJMP pop
push_gset5:
0092 92FA ST R15,-Y
0093 92EA ST R14,-Y
push_gset4:
0094 92DA ST R13,-Y
0095 92CA ST R12,-Y
push_gset3:
0096 92BA ST R11,-Y
0097 92AA ST R10,-Y
push_gset2:
0098 937A ST R23,-Y
0099 936A ST R22,-Y
push_gset1:
009A 935A ST R21,-Y
009B 934A ST R20,-Y
009C 9508 RET
pop_gset1:
009D E0E1 LDI R30,1
pop:
009E 9149 LD R20,Y+
009F 9159 LD R21,Y+
00A0 FDE0 SBRC R30,0
00A1 9508 RET
00A2 9169 LD R22,Y+
00A3 9179 LD R23,Y+
00A4 FDE1 SBRC R30,1
00A5 9508 RET
00A6 90A9 LD R10,Y+
00A7 90B9 LD R11,Y+
00A8 FDE2 SBRC R30,2
00A9 9508 RET
00AA 90C9 LD R12,Y+
00AB 90D9 LD R13,Y+
00AC FDE3 SBRC R30,3
00AD 9508 RET
00AE 90E9 LD R14,Y+
00AF 90F9 LD R15,Y+
00B0 9508 RET
lsl8:
00B1 2311 TST R17
00B2 F019 BEQ 0x00B6
00B3 0F00 LSL R16
00B4 951A DEC R17
00B5 CFFB RJMP lsl8
00B6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -