📄 led.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 37E6 CPI R30,0x76
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 940E00F8 CALL _main
_exit:
0051 CFFF RJMP _exit
FILE: E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
(0001) /****************************************Copyright (c)**************************************************
(0002) ** ADEmbed Development Co.,LTD.
(0003) ** http://www.adembed.com
(0004) **--------------File Info-------------------------------------------------------------------------------
(0005) ** File name: main.c
(0006) ** Last modified Date: 2008-12-13
(0007) ** Last Version: 1.0
(0008) ** Descriptions: Nixie Light Test.
(0009) **
(0010) **------------------------------------------------------------------------------------------------------
(0011) ** Created by: junbolu
(0012) ** Created date: 2008-12-13
(0013) ** Version: 1.0
(0014) ** Descriptions:
(0015) **
(0016) **------------------------------------------------------------------------------------------------------
(0017) ** Modified by:
(0018) ** Modified date:
(0019) ** Version:
(0020) ** Descriptions:
(0021) **
(0022) **------------------------------------------------------------------------------------------------------
(0023) **ICC-AVR application builder : 2008-12-13
(0024) **Target : M16
(0025) **Crystal: 7.3728Mhz
(0026) **PA0~PA7口接LED的段码
(0027) **PB0~PB3口接LED的位选
(0028) **描述:这是一个秒表实验,最大支持99.99秒。由按键K0完成启动计时和停止计时。
(0029) **涉及知识点:
(0030) ** T/C0的CTC工作模式
(0031) ** INT0的下降沿中断工作模式
(0032) *******************************************************************************************************/
(0033) #include<iom16v.h>
(0034) #include<macros.h>
(0035)
(0036) #define fose 7372800
(0037)
(0038) #define START 0
(0039) #define STOP 1
(0040) #define CLEAR 3
(0041) unsigned char Nixie_State;
(0042) unsigned int time_10ms;
(0043) unsigned char DISP_NUM; //显示的位数
(0044) unsigned char BitTab[]={0xFE,0xFD,0xFB,0xF7}; //三位位选码
(0045) unsigned char DispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //LED字形码
(0046) unsigned char DISP_DATA[4]; //显示的数字
(0047)
(0048) void Display(void);
(0049)
(0050) void INT0_Init()
(0051) {
(0052) GIFR |=0X40; //清楚标志位
_INT0_Init:
0052 B78A IN R24,0x3A
0053 6480 ORI R24,0x40
0054 BF8A OUT 0x3A,R24
(0053) //MCUCR|=0X03; //上升沿触发中断
(0054) MCUCR|=0X02;MCUCR&=~0X01; //下降沿触发中断
0055 B785 IN R24,0x35
0056 6082 ORI R24,2
0057 BF85 OUT 0x35,R24
0058 B785 IN R24,0x35
0059 7F8E ANDI R24,0xFE
005A BF85 OUT 0x35,R24
(0055) GICR |=0X40; //使能外部中断0
005B B78B IN R24,0x3B
005C 6480 ORI R24,0x40
005D BF8B OUT 0x3B,R24
005E 9508 RET
_int0_isr:
005F 922A ST R2,-Y
0060 923A ST R3,-Y
0061 938A ST R24,-Y
0062 B62F IN R2,0x3F
0063 922A ST R2,-Y
(0056) }
(0057)
(0058) #pragma interrupt_handler int0_isr:2
(0059) void int0_isr(void)
(0060) {
(0061)
(0062) if((PIND&0x04)!=0x00) //读取按键状态
0064 9B82 SBIS 0x10,2
0065 C001 RJMP 0x0067
(0063) {
(0064) return;
0066 C010 RJMP 0x0077
(0065) }
(0066) if(Nixie_State ==STOP)
0067 91800075 LDS R24,Nixie_State
0069 3081 CPI R24,1
006A F449 BNE 0x0074
(0067) {
(0068) time_10ms = 0;
006B 2422 CLR R2
006C 2433 CLR R3
006D 92300074 STS time_10ms+1,R3
006F 92200073 STS time_10ms,R2
(0069) Nixie_State = START;
0071 92200075 STS Nixie_State,R2
(0070) }
0073 C003 RJMP 0x0077
(0071) else
(0072) {
(0073) Nixie_State = STOP;
0074 E081 LDI R24,1
0075 93800075 STS Nixie_State,R24
(0074) }
0077 9029 LD R2,Y+
0078 BE2F OUT 0x3F,R2
0079 9189 LD R24,Y+
007A 9039 LD R3,Y+
007B 9029 LD R2,Y+
007C 9518 RETI
(0075)
(0076) }
(0077)
(0078) //显示函数,DISP_NUM决定显示哪个LED
(0079) //采用共阴LED动态显示方法,定时中断函数里面调用
(0080) void Display(void)
(0081) {
(0082) PORTA=0x00; //清除显示再位选
_Display:
007D 2422 CLR R2
007E BA2B OUT 0x1B,R2
(0083) PORTB=BitTab[DISP_NUM]; //PB口接位选
007F E680 LDI R24,0x60
0080 E090 LDI R25,0
0081 91E00072 LDS R30,DISP_NUM
0083 27FF CLR R31
0084 0FE8 ADD R30,R24
0085 1FF9 ADC R31,R25
0086 8020 LDD R2,Z+0
0087 BA28 OUT 0x18,R2
(0084) PORTA=DispTab[DISP_DATA[DISP_NUM]]; //PA口接LED的段码
0088 E68E LDI R24,0x6E
0089 E090 LDI R25,0
008A 91E00072 LDS R30,DISP_NUM
008C 27FF CLR R31
008D 0FE8 ADD R30,R24
008E 1FF9 ADC R31,R25
008F 81E0 LDD R30,Z+0
0090 27FF CLR R31
0091 E684 LDI R24,0x64
0092 E090 LDI R25,0
0093 0FE8 ADD R30,R24
0094 1FF9 ADC R31,R25
0095 8020 LDD R2,Z+0
0096 BA2B OUT 0x1B,R2
(0085)
(0086) if(DISP_NUM==1)
0097 91800072 LDS R24,DISP_NUM
0099 3081 CPI R24,1
009A F409 BNE 0x009C
(0087) PORTA|=0x80; //PA口接LED的段码
009B 9ADF SBI 0x1B,7
(0088)
(0089) DISP_NUM++; //先显示低位,再显示高位
009C 91800072 LDS R24,DISP_NUM
009E 5F8F SUBI R24,0xFF
009F 93800072 STS DISP_NUM,R24
(0090) if(DISP_NUM==4)
00A1 3084 CPI R24,4
00A2 F419 BNE 0x00A6
(0091) DISP_NUM=0;
00A3 2422 CLR R2
00A4 92200072 STS DISP_NUM,R2
00A6 9508 RET
_timer0comp:
00A7 940E0131 CALL push_lset
(0092) }
(0093)
(0094) #pragma interrupt_handler timer0comp:20
(0095) void timer0comp (void)
(0096) {
(0097) if(Nixie_State == START)
00A9 90200075 LDS R2,Nixie_State
00AB 2022 TST R2
00AC F469 BNE 0x00BA
(0098) {
(0099) if(time_10ms<9999)
00AD 91800073 LDS R24,time_10ms
00AF 91900074 LDS R25,time_10ms+1
00B1 308F CPI R24,0xF
00B2 E2E7 LDI R30,0x27
00B3 079E CPC R25,R30
00B4 F428 BCC 0x00BA
(0100) {
(0101) time_10ms++;
00B5 9601 ADIW R24,1
00B6 93900074 STS time_10ms+1,R25
00B8 93800073 STS time_10ms,R24
(0102) }
(0103) }
(0104)
(0105)
(0106)
(0107) DISP_DATA[0]=time_10ms/1000;
00BA EE28 LDI R18,0xE8
00BB E033 LDI R19,3
00BC 91000073 LDS R16,time_10ms
00BE 91100074 LDS R17,time_10ms+1
00C0 940E0117 CALL div16u
00C2 9300006E STS DISP_DATA,R16
(0108) DISP_DATA[1]=(time_10ms/100)-(DISP_DATA[0]*10);
00C4 2E20 MOV R2,R16
00C5 E08A LDI R24,0xA
00C6 9D82 MUL R24,R2
00C7 0110 MOVW R2,R0
00C8 E624 LDI R18,0x64
00C9 E030 LDI R19,0
00CA 91000073 LDS R16,time_10ms
00CC 91100074 LDS R17,time_10ms+1
00CE 940E0117 CALL div16u
00D0 0128 MOVW R4,R16
00D1 1842 SUB R4,R2
00D2 0853 SBC R5,R3
00D3 9240006F STS DISP_DATA+1,R4
(0109) DISP_DATA[3]=time_10ms%10;
00D5 E02A LDI R18,0xA
00D6 E030 LDI R19,0
00D7 91000073 LDS R16,time_10ms
00D9 91100074 LDS R17,time_10ms+1
00DB 940E0115 CALL mod16u
00DD 93000071 STS DISP_DATA+3,R16
(0110) DISP_DATA[2]=((time_10ms%100)-DISP_DATA[3])/10;
00DF E624 LDI R18,0x64
00E0 E030 LDI R19,0
00E1 91000073 LDS R16,time_10ms
00E3 91100074 LDS R17,time_10ms+1
00E5 940E0115 CALL mod16u
00E7 0118 MOVW R2,R16
00E8 90400071 LDS R4,DISP_DATA+3
00EA 2455 CLR R5
00EB 1824 SUB R2,R4
00EC 0835 SBC R3,R5
00ED E02A LDI R18,0xA
00EE E030 LDI R19,0
00EF 0181 MOVW R16,R2
00F0 940E0117 CALL div16u
00F2 93000070 STS DISP_DATA+2,R16
(0111)
(0112) Display();
00F4 DF88 RCALL _Display
00F5 940E0148 CALL pop_lset
00F7 9518 RETI
(0113) }
(0114)
(0115) void main(void)
(0116) {
(0117) DDRA=0XFF;
_main:
00F8 EF8F LDI R24,0xFF
00F9 BB8A OUT 0x1A,R24
(0118) PORTA=0X00;
00FA 2422 CLR R2
00FB BA2B OUT 0x1B,R2
(0119) DDRB=0X0F;
00FC E08F LDI R24,0xF
00FD BB87 OUT 0x17,R24
(0120) PORTB=0X00;
00FE BA28 OUT 0x18,R2
(0121)
(0122) //按键0端口初始化
(0123) DDRD &=~0x04; //设置PD2为输入
00FF 988A CBI 0x11,2
(0124) PORTD|=0x04; //设置PD2为上拉
0100 9A92 SBI 0x12,2
(0125)
(0126) INT0_Init(); //TART初始化
0101 DF50 RCALL _INT0_Init
(0127)
(0128) //t/c0初始化(10ms)
(0129) TCCR0=0X0d;
0102 E08D LDI R24,0xD
0103 BF83 OUT 0x33,R24
(0130) TCNT0=0X00;
0104 2422 CLR R2
0105 BE22 OUT 0x32,R2
(0131) OCR0=0X48;
0106 E488 LDI R24,0x48
0107 BF8C OUT 0x3C,R24
(0132) TIMSK=0X02;
0108 E082 LDI R24,2
0109 BF89 OUT 0x39,R24
(0133)
(0134) time_10ms=0;
010A 2433 CLR R3
010B 92300074 STS time_10ms+1,R3
010D 92200073 STS time_10ms,R2
(0135)
(0136) //asm("sei");
(0137) SEI(); //全局中断使能
010F 9478 BSET 7
(0138)
(0139) Nixie_State = STOP;
0110 E081 LDI R24,1
0111 93800075 STS Nixie_State,R24
(0140) for(;;)
FILE: <library>
0113 CFFF RJMP 0x0113
0114 9508 RET
mod16u:
0115 9468 BSET 6
0116 C001 RJMP xdiv16u
div16u:
0117 94E8 BCLR 6
xdiv16u:
0118 92EA ST R14,-Y
0119 92FA ST R15,-Y
011A 938A ST R24,-Y
011B 24EE CLR R14
011C 24FF CLR R15
011D E180 LDI R24,0x10
011E 0F00 LSL R16
011F 1F11 ROL R17
0120 1CEE ROL R14
0121 1CFF ROL R15
0122 16E2 CP R14,R18
0123 06F3 CPC R15,R19
0124 F018 BCS 0x0128
0125 1AE2 SUB R14,R18
0126 0AF3 SBC R15,R19
0127 9503 INC R16
0128 958A DEC R24
0129 F7A1 BNE 0x011E
012A F416 BRTC 0x012D
012B 2D0E MOV R16,R14
012C 2D1F MOV R17,R15
012D 9189 LD R24,Y+
012E 90F9 LD R15,Y+
012F 90E9 LD R14,Y+
0130 9508 RET
push_lset:
0131 93FA ST R31,-Y
0132 93EA ST R30,-Y
0133 93BA ST R27,-Y
0134 93AA ST R26,-Y
0135 939A ST R25,-Y
0136 938A ST R24,-Y
0137 933A ST R19,-Y
0138 932A ST R18,-Y
0139 931A ST R17,-Y
013A 930A ST R16,-Y
013B 929A ST R9,-Y
013C 928A ST R8,-Y
013D 927A ST R7,-Y
013E 926A ST R6,-Y
013F 925A ST R5,-Y
0140 924A ST R4,-Y
0141 923A ST R3,-Y
0142 922A ST R2,-Y
0143 921A ST R1,-Y
0144 920A ST R0,-Y
0145 B60F IN R0,0x3F
0146 920A ST R0,-Y
0147 9508 RET
pop_lset:
0148 9009 LD R0,Y+
0149 BE0F OUT 0x3F,R0
014A 9009 LD R0,Y+
014B 9019 LD R1,Y+
014C 9029 LD R2,Y+
014D 9039 LD R3,Y+
014E 9049 LD R4,Y+
014F 9059 LD R5,Y+
0150 9069 LD R6,Y+
0151 9079 LD R7,Y+
0152 9089 LD R8,Y+
0153 9099 LD R9,Y+
0154 9109 LD R16,Y+
0155 9119 LD R17,Y+
0156 9129 LD R18,Y+
0157 9139 LD R19,Y+
0158 9189 LD R24,Y+
0159 9199 LD R25,Y+
015A 91A9 LD R26,Y+
015B 91B9 LD R27,Y+
015C 91E9 LD R30,Y+
015D 91F9 LD R31,Y+
015E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -