📄 clock.lst
字号:
__text_start:
__start:
001A E5CF LDI R28,0x5F
001B E0D2 LDI R29,2
001C BFCD OUT P3D,R28
001D BFDE OUT P3E,R29
001E 51C0 SUBI R28,0x10
001F 40D0 SBCI R29,0
0020 EA0A LDI R16,0xAA
0021 8308 STD R16,0+Y
0022 2400 CLR R0
0023 E6EA LDI R30,0x6A
0024 E0F0 LDI R31,0
0025 E010 LDI R17,0
0026 36EA CPI R30,0x6A
0027 07F1 CPC R31,R17
0028 F011 BEQ 0x002B
0029 9201 ST R0,Z+
002A CFFB RJMP 0x0026
002B 8300 STD R16,0+Z
002C E2EA LDI R30,0x2A
002D E0F0 LDI R31,0
002E E6A0 LDI R26,0x60
002F E0B0 LDI R27,0
0030 E010 LDI R17,0
0031 33E4 CPI R30,0x34
0032 07F1 CPC R31,R17
0033 F021 BEQ 0x0038
0034 95C8 LPM
0035 9631 ADIW R30,1
0036 920D ST R0,X+
0037 CFF9 RJMP 0x0031
0038 D125 RCALL _main
_exit:
0039 CFFF RJMP _exit
FILE: clock.c
(0000) /**********************************************
(0001) http://www.sl.com.cn
(0002) 双龙电子公司----电脑时钟演示程序(ICCAVR)
(0003) 作者:詹卫前
(0004) 1、学习定时器T1溢出中断的使用
(0005) 2、学习电脑时钟的编程方法
(0006) 3、在程序运行时按SHIFT进行校时
(0007) 使用注意:1、应包含头文件slavr.h
(0008) 2、在工程选项中的Additional Lib中填入slavr
(0009) 使用编译器使用附加库文件libslavr.a
(0010) ***********************************************/
(0011) #include <io8515.h>
(0012) #include <macros.h>
(0013) #include <slavr.h>
(0014) #pragma interrupt_handler timer1:7
(0015) #pragma data:code
(0016) /* 七段译码字形表 */
(0017) const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0018) #pragma data:data
(0019) /* 显示缓冲区 */
(0020) unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
(0021) unsigned char time[3]={0,0,0};
(0022) unsigned char flag=0;
(0023) /*****************************************
(0024) 初始化
(0025) *****************************************/
(0026) void port_init(void)
(0027) {
(0028) DDRD=0x3f;
_port_init:
003A E38F LDI R24,0x3F
003B BB81 OUT P11,R24
(0029) DDRB=0xff;
003C EF8F LDI R24,0xFF
003D BB87 OUT P17,R24
(0030) PORTD=0xff;
003E BB82 OUT P12,R24
(0031) PORTB=0xff;
003F BB88 OUT P18,R24
(0032) TIMSK=0x80;//开放T1溢出中断
0040 E880 LDI R24,0x80
0041 BF89 OUT P39,R24
(0033) TCCR1A=0x00;
0042 2422 CLR R2
0043 BC2F OUT P2F,R2
(0034) TCCR1B=0x04;
0044 E084 LDI R24,4
0045 BD8E OUT P2E,R24
(0035) TCNT1=0x85ee;
0046 EE8E LDI R24,0xEE
0047 E895 LDI R25,0x85
0048 9390004D STS R25,0x4D
004A 9380004C STS R24,0x4C
(0036) SEI();
004C 9478 BSET 7
(0037) }
004D 9508 RET
_hextobcd:
temp --> R20
i --> R22
004E D23E RCALL push_gset2
(0038) /*****************************************
(0039) 刷新LED显示缓冲区
(0040) *****************************************/
(0041) void hextobcd (void)
(0042) {
(0043) unsigned char i,temp;
(0044) for (i=0;i<3;i++)
004F 2766 CLR R22
0050 C04C RJMP 0x009D
(0045) {
(0046) temp=time[i]/10;
0051 E686 LDI R24,0x66
0052 E090 LDI R25,0
0053 2FE6 MOV R30,R22
0054 27FF CLR R31
0055 0FE8 ADD R30,R24
0056 1FF9 ADC R31,R25
0057 8100 LDD R16,0+Z
0058 E01A LDI R17,0xA
0059 D209 RCALL div8u
005A 2F40 MOV R20,R16
(0047) temp=temp%10;
005B E01A LDI R17,0xA
005C D204 RCALL mod8u
005D 2F40 MOV R20,R16
(0048) ledbuff[5-2*i]=tabel[temp];
005E 2E26 MOV R2,R22
005F 2433 CLR R3
0060 0C22 LSL R2
0061 1C33 ROL R3
0062 E0E5 LDI R30,5
0063 E0F0 LDI R31,0
0064 19E2 SUB R30,R2
0065 09F3 SBC R31,R3
0066 E680 LDI R24,0x60
0067 E090 LDI R25,0
0068 0FE8 ADD R30,R24
0069 1FF9 ADC R31,R25
006A E18A LDI R24,0x1A
006B E090 LDI R25,0
006C 2E24 MOV R2,R20
006D 2433 CLR R3
006E 0E28 ADD R2,R24
006F 1E39 ADC R3,R25
0070 93FA ST R31,-Y
0071 93EA ST R30,-Y
0072 2DE2 MOV R30,R2
0073 2DF3 MOV R31,R3
0074 95C8 LPM
0075 91E9 LD R30,Y+
0076 91F9 LD R31,Y+
0077 8200 STD R0,0+Z
(0049) temp=time[i]%10;
0078 E686 LDI R24,0x66
0079 E090 LDI R25,0
007A 2FE6 MOV R30,R22
007B 27FF CLR R31
007C 0FE8 ADD R30,R24
007D 1FF9 ADC R31,R25
007E 8100 LDD R16,0+Z
007F E01A LDI R17,0xA
0080 D1E0 RCALL mod8u
0081 2F40 MOV R20,R16
(0050) ledbuff[4-2*i]=tabel[temp];
0082 2E26 MOV R2,R22
0083 2433 CLR R3
0084 0C22 LSL R2
0085 1C33 ROL R3
0086 E0E4 LDI R30,4
0087 E0F0 LDI R31,0
0088 19E2 SUB R30,R2
0089 09F3 SBC R31,R3
008A E680 LDI R24,0x60
008B E090 LDI R25,0
008C 0FE8 ADD R30,R24
008D 1FF9 ADC R31,R25
008E E18A LDI R24,0x1A
008F E090 LDI R25,0
0090 2E24 MOV R2,R20
0091 2433 CLR R3
0092 0E28 ADD R2,R24
0093 1E39 ADC R3,R25
0094 93FA ST R31,-Y
0095 93EA ST R30,-Y
0096 2DE2 MOV R30,R2
0097 2DF3 MOV R31,R3
0098 95C8 LPM
0099 91E9 LD R30,Y+
009A 91F9 LD R31,Y+
009B 8200 STD R0,0+Z
(0051) }
009C 9563 INC R22
009D 3063 CPI R22,3
009E F408 BCC 0x00A0
009F CFB1 RJMP 0x0051
(0052) }
00A0 D1F5 RCALL pop_gset2
00A1 9508 RET
_display:
i --> R20
00A2 D1D3 RCALL push_gset1
(0053) /*****************************************
(0054) 六路动态扫描显示电路
(0055) *****************************************/
(0056) void display(void)
(0057) {
(0058) unsigned char i;
(0059) for (i=0;i<6;i++)
00A3 2744 CLR R20
00A4 C016 RJMP 0x00BB
(0060) {
(0061) PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
00A5 E680 LDI R24,0x60
00A6 E090 LDI R25,0
00A7 2FE4 MOV R30,R20
00A8 27FF CLR R31
00A9 0FE8 ADD R30,R24
00AA 1FF9 ADC R31,R25
00AB 8020 LDD R2,0+Z
00AC BA28 OUT P18,R2
(0062) PORTD=~(1<<i); //开始显示
00AD E001 LDI R16,1
00AE 2F14 MOV R17,R20
00AF D1EC RCALL lsl8
00B0 2E20 MOV R2,R16
00B1 9420 COM R2
00B2 BA22 OUT P12,R2
(0063) delay_1ms(); //每一位显示保持一定时间
00B3 D107 RCALL _delay_1ms
(0064) PORTD|=(1<<i); //关闭显示
00B4 E001 LDI R16,1
00B5 2F14 MOV R17,R20
00B6 D1E5 RCALL lsl8
00B7 B222 IN R2,P12
00B8 2A20 OR R2,R16
00B9 BA22 OUT P12,R2
(0065) }
00BA 9543 INC R20
00BB 3046 CPI R20,6
00BC F340 BCS 0x00A5
(0066) }
00BD D1BB RCALL pop_gset1
00BE 9508 RET
_settime:
t1 --> R20
t3 --> R22
t2 --> R10
00BF D1D0 RCALL push_gset3
(0067) /*****************************************
(0068) 设定校时时间
(0069) *****************************************/
(0070) void settime(void)
(0071) {
(0072) unsigned char t1,t2,t3;
(0073) for (t1=0;t1<3;t1++)
00C0 2744 CLR R20
00C1 C097 RJMP 0x0159
(0074) {
(0075) ledbuff[5-2*t1]|=0x80;
00C2 2E24 MOV R2,R20
00C3 2433 CLR R3
00C4 0C22 LSL R2
00C5 1C33 ROL R3
00C6 E085 LDI R24,5
00C7 E090 LDI R25,0
00C8 1982 SUB R24,R2
00C9 0993 SBC R25,R3
00CA E6E0 LDI R30,0x60
00CB E0F0 LDI R31,0
00CC 0F8E ADD R24,R30
00CD 1F9F ADC R25,R31
00CE 2E28 MOV R2,R24
00CF 2E39 MOV R3,R25
00D0 2DE2 MOV R30,R2
00D1 2DF3 MOV R31,R3
00D2 8180 LDD R24,0+Z
00D3 6880 ORI R24,0x80
00D4 8380 STD R24,0+Z
(0076) do
(0077) {
(0078) t2=scan_key();
00D5 D0FD RCALL _scan_key
00D6 2E20 MOV R2,R16
00D7 2E31 MOV R3,R17
00D8 2CA2 MOV R10,R2
(0079) display();
00D9 DFC8 RCALL _display
(0080) }
(0081) while(t2==0x7f);
00DA 2D8A MOV R24,R10
00DB 378F CPI R24,0x7F
00DC F3C1 BEQ 0x00D5
(0082) do
(0083) {
(0084) t3=scan_key();
00DD D0F5 RCALL _scan_key
00DE 2E20 MOV R2,R16
00DF 2E31 MOV R3,R17
00E0 2D62 MOV R22,R2
(0085) display();
00E1 DFC0 RCALL _display
(0086) }
(0087) while (t2==t3);
00E2 16A6 CP R10,R22
00E3 F3C9 BEQ 0x00DD
(0088) time[t1]=time[t1]%10+t2*10;
00E4 E686 LDI R24,0x66
00E5 E090 LDI R25,0
00E6 2E24 MOV R2,R20
00E7 2433 CLR R3
00E8 0E28 ADD R2,R24
00E9 1E39 ADC R3,R25
00EA E00A LDI R16,0xA
00EB 2D1A MOV R17,R10
00EC D168 RCALL mpy8s
00ED 2E40 MOV R4,R16
00EE E01A LDI R17,0xA
00EF 2DE2 MOV R30,R2
00F0 2DF3 MOV R31,R3
00F1 8100 LDD R16,0+Z
00F2 D16E RCALL mod8u
00F3 2E50 MOV R5,R16
00F4 0C54 ADD R5,R4
00F5 2DE2 MOV R30,R2
00F6 2DF3 MOV R31,R3
00F7 8250 STD R5,0+Z
(0089) hextobcd();
00F8 DF55 RCALL _hextobcd
(0090) ledbuff[5-2*t1]&=0x7f;
00F9 2E24 MOV R2,R20
00FA 2433 CLR R3
00FB 0C22 LSL R2
00FC 1C33 ROL R3
00FD E085 LDI R24,5
00FE E090 LDI R25,0
00FF 1982 SUB R24,R2
0100 0993 SBC R25,R3
0101 E6E0 LDI R30,0x60
0102 E0F0 LDI R31,0
0103 0F8E ADD R24,R30
0104 1F9F ADC R25,R31
0105 2E28 MOV R2,R24
0106 2E39 MOV R3,R25
0107 2DE2 MOV R30,R2
0108 2DF3 MOV R31,R3
0109 8180 LDD R24,0+Z
010A 778F ANDI R24,0x7F
010B 8380 STD R24,0+Z
(0091) ledbuff[4-2*t1]|=0x80;
010C 2E24 MOV R2,R20
010D 2433 CLR R3
010E 0C22 LSL R2
010F 1C33 ROL R3
0110 E084 LDI R24,4
0111 E090 LDI R25,0
0112 1982 SUB R24,R2
0113 0993 SBC R25,R3
0114 E6E0 LDI R30,0x60
0115 E0F0 LDI R31,0
0116 0F8E ADD R24,R30
0117 1F9F ADC R25,R31
0118 2E28 MOV R2,R24
0119 2E39 MOV R3,R25
011A 2DE2 MOV R30,R2
011B 2DF3 MOV R31,R3
011C 8180 LDD R24,0+Z
011D 6880 ORI R24,0x80
011E 8380 STD R24,0+Z
(0092) do
(0093) {
(0094) t2=scan_key();
011F D0B3 RCALL _scan_key
0120 2E20 MOV R2,R16
0121 2E31 MOV R3,R17
0122 2CA2 MOV R10,R2
(0095) display();
0123 DF7E RCALL _display
(0096) }
(0097) while(t2==0x7f);
0124 2D8A MOV R24,R10
0125 378F CPI R24,0x7F
0126 F3C1 BEQ 0x011F
(0098) do
(0099) {
(0100) t3=scan_key();
0127 D0AB RCALL _scan_key
0128 2E20 MOV R2,R16
0129 2E31 MOV R3,R17
012A 2D62 MOV R22,R2
(0101) display();
012B DF76 RCALL _display
(0102) }
(0103) while (t2==t3);
012C 16A6 CP R10,R22
012D F3C9 BEQ 0x0127
(0104) t3=time[t1]/10;
012E E686 LDI R24,0x66
012F E090 LDI R25,0
0130 2FE4 MOV R30,R20
0131 27FF CLR R31
0132 0FE8 ADD R30,R24
0133 1FF9 ADC R31,R25
0134 8100 LDD R16,0+Z
0135 E01A LDI R17,0xA
0136 D12C RCALL div8u
0137 2F60 MOV R22,R16
(0105) time[t1]=t3*10+t2;
0138 E00A LDI R16,0xA
0139 2F16 MOV R17,R22
013A D11A RCALL mpy8s
013B 2E20 MOV R2,R16
013C 0C2A ADD R2,R10
013D E686 LDI R24,0x66
013E E090 LDI R25,0
013F 2FE4 MOV R30,R20
0140 27FF CLR R31
0141 0FE8 ADD R30,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -