📄 display.lst
字号:
__start:
__text_start:
0008 E5CF LDI R28,0x5F
0009 E0D2 LDI R29,2
000A BFCD OUT 0x3D,R28
000B BFDE OUT 0x3E,R29
000C 51C0 SUBI R28,0x10
000D 40D0 SBCI R29,0
000E EA0A LDI R16,0xAA
000F 8308 STD Y+0,R16
0010 2400 CLR R0
0011 E7E0 LDI R30,0x70
0012 E0F0 LDI R31,0
0013 E010 LDI R17,0
0014 37E2 CPI R30,0x72
0015 07F1 CPC R31,R17
0016 F011 BEQ 0x0019
0017 9201 ST R0,Z+
0018 CFFB RJMP 0x0014
0019 8300 STD Z+0,R16
001A E0E0 LDI R30,0
001B E0F0 LDI R31,0
001C E6A0 LDI R26,0x60
001D E0B0 LDI R27,0
001E E010 LDI R17,0
001F 31E0 CPI R30,0x10
0020 07F1 CPC R31,R17
0021 F021 BEQ 0x0026
0022 95C8 LPM
0023 9631 ADIW R30,1
0024 920D ST R0,X+
0025 CFF9 RJMP 0x001F
0026 D07D RCALL _main
_exit:
0027 CFFF RJMP _exit
_DelayMs:
j --> R20
i --> R16
0028 D0DF RCALL push_gset1
FILE: C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第二章\第二章程序\IO端口的C语言编程\数码管显示设计\Counter.C
(0001)
(0002) //******************************FileName: Counter.C**************************//
(0003) //******************************ICCAVR V6.30编译*****************************//
(0004)
(0005) #include <io8535v.h>
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008)
(0009) //数码管字型表,对应0,1,2,3,4,5,6,7,8,9//
(0010) uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0011) uchar Data[4]={0,0,0,0}; //显示初始值:0 0 0 0
(0012) uint CNT=0; //初始计数值:0
(0013) uchar Key_Up; //加计数按键标志
(0014) uchar Key_Down; //减计数按键标志
(0015)
(0016) void DelayMs(uint i) //Ms级延时,参数i为延时时间
(0017) {uint j;
(0018) for(;i!=0;i--)
0029 C00A RJMP 0x0034
(0019) {for(j=8000;j!=0;j--) {;}}
002A E440 LDI R20,0x40
002B E15F LDI R21,0x1F
002C C002 RJMP 0x002F
002D 5041 SUBI R20,1
002E 4050 SBCI R21,0
002F 3040 CPI R20,0
0030 0745 CPC R20,R21
0031 F7D9 BNE 0x002D
0032 5001 SUBI R16,1
0033 4010 SBCI R17,0
0034 3000 CPI R16,0
0035 0701 CPC R16,R17
0036 F799 BNE 0x002A
(0020) }
0037 D0D3 RCALL pop_gset1
0038 9508 RET
_Display:
sel --> R20
i --> R22
p --> R10
0039 D0E8 RCALL push_gset3
003A 2EA0 MOV R10,R16
003B 2EB1 MOV R11,R17
(0021)
(0022) void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
(0023) {uchar i,sel=0x01;
003C E041 LDI R20,1
(0024) for(i=0;i<4;i++)
003D 2766 CLR R22
003E C012 RJMP 0x0051
(0025) {PORTC=sel; //选通最右边的数码管
003F BB45 OUT 0x15,R20
(0026) PORTA=Table[p[i]]; //送字型码
0040 2FE6 MOV R30,R22
0041 27FF CLR R31
0042 0DEA ADD R30,R10
0043 1DFB ADC R31,R11
0044 81E0 LDD R30,Z+0
0045 27FF CLR R31
0046 E680 LDI R24,0x60
0047 E090 LDI R25,0
0048 0FE8 ADD R30,R24
0049 1FF9 ADC R31,R25
004A 8020 LDD R2,Z+0
004B BA2B OUT 0x1B,R2
(0027) DelayMs(2); //显示延时
004C E002 LDI R16,2
004D E010 LDI R17,0
004E DFD9 RCALL _DelayMs
(0028) sel=sel<<1; //移位以显示前一位
004F 0F44 LSL R20
0050 9563 INC R22
0051 3064 CPI R22,4
0052 F360 BCS 0x003F
(0029) }
(0030) }
0053 D0B2 RCALL pop_gset3
0054 9508 RET
_Process:
p --> R20
i --> R22
0055 D0C9 RCALL push_gset2
0056 2F42 MOV R20,R18
0057 2F53 MOV R21,R19
0058 2F60 MOV R22,R16
0059 2F71 MOV R23,R17
(0031)
(0032) //******************************计数值处理函数******************************//
(0033) //功能:此函数用于将计数值拆分为BCD码的千,百,十,一数据,用于查表显示//
(0034) //参数说明:参数i:计数值;参数p:处理数据存放的数组名//
(0035) void Process(uint i,uchar *p)
(0036) {p[0]=i/1000;
005A EE28 LDI R18,0xE8
005B E033 LDI R19,3
005C 2F06 MOV R16,R22
005D 2F17 MOV R17,R23
005E D08B RCALL div16u
005F 2FE4 MOV R30,R20
0060 2FF5 MOV R31,R21
0061 8300 STD Z+0,R16
(0037) i=i%1000;
0062 EE28 LDI R18,0xE8
0063 E033 LDI R19,3
0064 2F06 MOV R16,R22
0065 2F17 MOV R17,R23
0066 D081 RCALL mod16u
0067 2F60 MOV R22,R16
0068 2F71 MOV R23,R17
(0038) p[1]=i/100;
0069 E624 LDI R18,0x64
006A E030 LDI R19,0
006B D07E RCALL div16u
006C 2FE4 MOV R30,R20
006D 2FF5 MOV R31,R21
006E 8301 STD Z+1,R16
(0039) i=i%100;
006F E624 LDI R18,0x64
0070 E030 LDI R19,0
0071 2F06 MOV R16,R22
0072 2F17 MOV R17,R23
0073 D074 RCALL mod16u
0074 2F60 MOV R22,R16
0075 2F71 MOV R23,R17
(0040) p[2]=i/10;
0076 E02A LDI R18,0xA
0077 E030 LDI R19,0
0078 D071 RCALL div16u
0079 2FE4 MOV R30,R20
007A 2FF5 MOV R31,R21
007B 8302 STD Z+2,R16
(0041) i=i%10;
007C E02A LDI R18,0xA
007D E030 LDI R19,0
007E 2F06 MOV R16,R22
007F 2F17 MOV R17,R23
0080 D067 RCALL mod16u
0081 2F60 MOV R22,R16
0082 2F71 MOV R23,R17
(0042) p[3]=i;
0083 2FE4 MOV R30,R20
0084 2FF5 MOV R31,R21
0085 8363 STD Z+3,R22
(0043) }
0086 D07D RCALL pop_gset2
0087 9508 RET
(0044)
(0045) void Init_IO(void) //初始化I/O口
(0046) {DDRA=0xff; //设置A口为推挽1输出
_Init_IO:
0088 EF8F LDI R24,0xFF
0089 BB8A OUT 0x1A,R24
(0047) PORTA=0xff;
008A BB8B OUT 0x1B,R24
(0048) DDRB=0x00; //设置B口为不带上拉电阻输入
008B 2422 CLR R2
008C BA27 OUT 0x17,R2
(0049) PORTB=0x00;
008D BA28 OUT 0x18,R2
(0050) DDRC=0xff; //设置C口为推挽1输出;
008E BB84 OUT 0x14,R24
(0051) PORTC=0xff;
008F BB85 OUT 0x15,R24
(0052) }
0090 9508 RET
(0053)
(0054) void Get_Key(void) //按键扫描函数
(0055) {while((PINB&0x01)==0) //若S1按下,置位加计数标志;
_Get_Key:
0091 C006 RJMP 0x0098
(0056) {Key_Up=1;
0092 E081 LDI R24,1
0093 93800071 STS _Key_Up,R24
(0057) Display(Data);}
0095 E60A LDI R16,0x6A
0096 E010 LDI R17,0
0097 DFA1 RCALL _Display
0098 9BB0 SBIS 0x16,0
0099 CFF8 RJMP 0x0092
009A C006 RJMP 0x00A1
(0058) while((PINB&0x02)==0) //若S2按下,置位减计数标志;
(0059) {Key_Down=1;
009B E081 LDI R24,1
009C 93800070 STS _Key_Down,R24
(0060) Display(Data);}
009E E60A LDI R16,0x6A
009F E010 LDI R17,0
00A0 DF98 RCALL _Display
00A1 9BB1 SBIS 0x16,1
00A2 CFF8 RJMP 0x009B
(0061) }
00A3 9508 RET
(0062)
(0063) void main(void)
(0064) {uchar I;
(0065) Init_IO(); //初始化I/O口
_main:
I --> Y+1
00A4 DFE3 RCALL _Init_IO
(0066) PORTA=0xff; //点亮测试所有的数码管
00A5 EF8F LDI R24,0xFF
00A6 BB8B OUT 0x1B,R24
(0067) PORTC=0x00;
00A7 2422 CLR R2
00A8 BA25 OUT 0x15,R2
(0068) DelayMs(3000); //延时
00A9 EB08 LDI R16,0xB8
00AA E01B LDI R17,0xB
00AB DF7C RCALL _DelayMs
(0069) PORTC=0xff; //数码管熄灭,进入计数状态
00AC EF8F LDI R24,0xFF
00AD BB85 OUT 0x15,R24
00AE C037 RJMP 0x00E6
(0070) while(1)
(0071) {Get_Key(); //按键扫描
00AF DFE1 RCALL _Get_Key
(0072) if(Key_Up==1) //加计数处理
00B0 91800071 LDS R24,_Key_Up
00B2 3081 CPI R24,1
00B3 F481 BNE 0x00C4
(0073) {if(CNT!=9999) //条件判断是否计数到9999
00B4 9180006E LDS R24,0x6E
00B6 9190006F LDS R25,0x6F
00B8 308F CPI R24,0xF
00B9 E2E7 LDI R30,0x27
00BA 079E CPC R25,R30
00BB F041 BEQ 0x00C4
(0074) {CNT=CNT+1; //计数值加1
00BC 9601 ADIW R24,1
00BD 9390006F STS 0x6F,R25
00BF 9380006E STS 0x6E,R24
(0075) Key_Up=0;} //加计数标志复位
00C1 2422 CLR R2
00C2 92200071 STS _Key_Up,R2
(0076) }
(0077) if(Key_Down==1) //减计数处理
00C4 91800070 LDS R24,_Key_Down
00C6 3081 CPI R24,1
00C7 F4A1 BNE 0x00DC
(0078) {if(CNT!=0) //条件判断是否计数到0000
00C8 9020006E LDS R2,0x6E
00CA 9030006F LDS R3,0x6F
00CC 2022 TST R2
00CD F411 BNE 0x00D0
00CE 2033 TST R3
00CF F061 BEQ 0x00DC
(0079) {CNT=CNT-1; //计数值减一
00D0 9180006E LDS R24,0x6E
00D2 9190006F LDS R25,0x6F
00D4 9701 SBIW R24,1
00D5 9390006F STS 0x6F,R25
00D7 9380006E STS 0x6E,R24
(0080) Key_Down=0;} //减计数标志复位
00D9 2422 CLR R2
00DA 92200070 STS _Key_Down,R2
(0081) }
(0082) Process(CNT,Data); //计数值处理
00DC E62A LDI R18,0x6A
00DD E030 LDI R19,0
00DE 9100006E LDS R16,0x6E
00E0 9110006F LDS R17,0x6F
00E2 DF72 RCALL _Process
(0083) Display(Data); //动态扫描显示
00E3 E60A LDI R16,0x6A
00E4 E010 LDI R17,0
00E5 DF53 RCALL _Display
00E6 CFC8 RJMP 0x00AF
(0084) }
(0085) }
FILE: <library>
00E7 9508 RET
mod16u:
00E8 9468 BSET 6
00E9 C001 RJMP xdiv16u
div16u:
00EA 94E8 BCLR 6
xdiv16u:
00EB 92EA ST R14,-Y
00EC 92FA ST R15,-Y
00ED 938A ST R24,-Y
00EE 24EE CLR R14
00EF 24FF CLR R15
00F0 E180 LDI R24,0x10
00F1 0F00 LSL R16
00F2 1F11 ROL R17
00F3 1CEE ROL R14
00F4 1CFF ROL R15
00F5 16E2 CP R14,R18
00F6 06F3 CPC R15,R19
00F7 F018 BCS 0x00FB
00F8 1AE2 SUB R14,R18
00F9 0AF3 SBC R15,R19
00FA 9503 INC R16
00FB 958A DEC R24
00FC F7A1 BNE 0x00F1
00FD F416 BRTC 0x0100
00FE 2D0E MOV R16,R14
00FF 2D1F MOV R17,R15
0100 9189 LD R24,Y+
0101 90F9 LD R15,Y+
0102 90E9 LD R14,Y+
0103 9508 RET
pop_gset2:
0104 E0E2 LDI R30,2
0105 C006 RJMP pop
pop_gset3:
0106 E0E4 LDI R30,4
0107 C004 RJMP pop
push_gset1:
0108 935A ST R21,-Y
0109 934A ST R20,-Y
010A 9508 RET
pop_gset1:
010B E0E1 LDI R30,1
pop:
010C 9149 LD R20,Y+
010D 9159 LD R21,Y+
010E FDE0 SBRC R30,0
010F 9508 RET
0110 9169 LD R22,Y+
0111 9179 LD R23,Y+
0112 FDE1 SBRC R30,1
0113 9508 RET
0114 90A9 LD R10,Y+
0115 90B9 LD R11,Y+
0116 FDE2 SBRC R30,2
0117 9508 RET
0118 90C9 LD R12,Y+
0119 90D9 LD R13,Y+
011A FDE3 SBRC R30,3
011B 9508 RET
011C 90E9 LD R14,Y+
011D 90F9 LD R15,Y+
011E 9508 RET
push_gset2:
011F 937A ST R23,-Y
0120 936A ST R22,-Y
0121 CFE6 RJMP push_gset1
push_gset3:
0122 92BA ST R11,-Y
0123 92AA ST R10,-Y
0124 CFFA RJMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -