📄 clock.lst
字号:
__text_start:
__start:
0016 E5CF LDI R28,0x5F
0017 E0D2 LDI R29,2
0018 BFCD OUT P3D,R28
0019 BFDE OUT P3E,R29
001A 51C0 SUBI R28,0x10
001B 40D0 SBCI R29,0
001C EA0A LDI R16,0xAA
001D 8308 STD R16,0+Y
001E 2400 CLR R0
001F E6E2 LDI R30,0x62
0020 E0F0 LDI R31,0
0021 E010 LDI R17,0
0022 36E7 CPI R30,0x67
0023 07F1 CPC R31,R17
0024 F011 BEQ 0x0027
0025 9201 ST R0,Z+
0026 CFFB RJMP 0x0022
0027 8300 STD R16,0+Z
0028 E2EA LDI R30,0x2A
0029 E0F0 LDI R31,0
002A E6A0 LDI R26,0x60
002B E0B0 LDI R27,0
002C E010 LDI R17,0
002D 32EC CPI R30,0x2C
002E 07F1 CPC R31,R17
002F F021 BEQ 0x0034
0030 95C8 LPM
0031 9631 ADIW R30,1
0032 920D ST R0,X+
0033 CFF9 RJMP 0x002D
0034 D1CC RCALL _main
_exit:
0035 CFFF RJMP _exit
_receive_byte:
i --> R20
temp --> R22
0036 D2CB RCALL push_gset2
FILE: D:\sl279\8515\clock.c
(0000) /************************************************************/
(0001) /* 广州天河双龙电子有限公司 */
(0002) /* http://www.sl.com.cn */
(0003) /* 电脑时钟演示程序(ICCAVR版本) */
(0004) /* 程序作者:詹卫前 */
(0005) /*接线方式:CS=PORTC.4 CLK=PORTC.3 DATA=PORTC.2 KEY=PORTC.1 */
(0006) /* 处理器:AT90S8515 晶振频率:8MHZ */
(0007) /* SL279 晶振频率:12MHZ 使用SLAVR库 */
(0008) /************************************************************/
(0009) #include<io8515.h>
(0010) #include<slavr.h>
(0011) #pragma interrupt_handler timer1_ovf:7
(0012) #pragma interrupt_handler timer0_ovf:8
(0013) #define setcs PORTC|=0x10;
(0014) unsigned char flag=0;//时间刷新标志
(0015) unsigned char dflag=0;//计数方向标志
(0016) /* 定义结构体time */
(0017) struct time
(0018) {
(0019) signed char second;
(0020) signed char minute;
(0021) signed char hour;
(0022) } time;
(0023) /* 字节接收函数 */
(0024) unsigned char receive_byte(void)
(0025) {
(0026) unsigned char i,temp=0;
0037 2766 CLR R22
(0027) DDRC&=0xfb;
0038 B384 IN R24,P14
0039 7F8B ANDI R24,0xFB
003A BB84 OUT P14,R24
(0028) delay_us(90);
003B E50A LDI R16,0x5A
003C E010 LDI R17,0
003D D260 RCALL _delay_us
(0029) for(i=0;i<8;i++)
003E 2744 CLR R20
003F C00B RJMP 0x004B
(0030) {
(0031) temp=temp<<1;
0040 0F66 LSL R22
(0032) PORTC|=0x08;//clk=1
0041 9AAB SBI P15,3
(0033) delay_us(10);
0042 E00A LDI R16,0xA
0043 E010 LDI R17,0
0044 D259 RCALL _delay_us
(0034) if((PINC&0x04)!=0)
0045 9B9A SBIS P13,2
0046 C001 RJMP 0x0048
(0035) temp|=0x01;
0047 6061 ORI R22,1
(0036) PORTC&=0xf7;//clk=0
0048 D2DE RCALL 0x0327
(0037) delay_us(10);
0049 D254 RCALL _delay_us
(0038) }
004A 9543 INC R20
004B 3048 CPI R20,0x8
004C F398 BCS 0x0040
(0039) DDRC|=0x04;
004D 9AA2 SBI P14,2
(0040) return temp;
004E 2F06 MOV R16,R22
004F 2711 CLR R17
0050 D2BD RCALL pop_gset2
0051 9508 RET
_send_byte:
i --> R20
para --> R22
0052 D2AF RCALL push_gset2
0053 2F60 MOV R22,R16
(0041) }
(0042) /* 字节发送函数 */
(0043) void send_byte(unsigned char para)
(0044) {
(0045) unsigned char i;
(0046) PORTC&=0xef;//cs=0
0054 B385 IN R24,P15
0055 7E8F ANDI R24,0xEF
0056 BB85 OUT P15,R24
(0047) delay_us(90);
0057 E50A LDI R16,0x5A
0058 E010 LDI R17,0
0059 D244 RCALL _delay_us
(0048) for(i=0;i<8;i++)
005A 2744 CLR R20
005B C011 RJMP 0x006D
(0049) {
(0050) if((para&0x80)==0x80)
005C 2F86 MOV R24,R22
005D 7880 ANDI R24,0x80
005E 3880 CPI R24,0x80
005F F411 BNE 0x0062
(0051) PORTC|=0x04;//data=1
0060 9AAA SBI P15,2
0061 C003 RJMP 0x0065
(0052) else
(0053) PORTC&=0xfb;//data=0
0062 B385 IN R24,P15
0063 7F8B ANDI R24,0xFB
0064 BB85 OUT P15,R24
(0054) PORTC|=0x08;//clk=1
0065 9AAB SBI P15,3
(0055) delay_us(10);
0066 E00A LDI R16,0xA
0067 E010 LDI R17,0
0068 D235 RCALL _delay_us
0069 D2BD RCALL 0x0327
(0056) PORTC&=0xf7;//clk=0
(0057) delay_us(10);
006A D233 RCALL _delay_us
(0058) para=para<<1;
006B 0F66 LSL R22
(0059) }
006C 9543 INC R20
006D 3048 CPI R20,0x8
006E F368 BCS 0x005C
(0060) }
006F D29E RCALL pop_gset2
0070 9508 RET
_write279:
cmd2 --> R20
cmd1 --> R22
0071 D290 RCALL push_gset2
0072 2F42 MOV R20,R18
0073 2F60 MOV R22,R16
(0061) /* 写sl279双字节命令 */
(0062) void write279(unsigned char cmd1, unsigned char cmd2)
(0063) {
(0064) send_byte (cmd1);
0074 2F06 MOV R16,R22
0075 DFDC RCALL _send_byte
(0065) send_byte (cmd2);
0076 2F04 MOV R16,R20
0077 DFDA RCALL _send_byte
(0066) PORTC|=0x10;
0078 9AAC SBI P15,4
(0067) }
0079 D294 RCALL pop_gset2
007A 9508 RET
_initdis:
i --> R10
key --> R20
007B D28F RCALL push_gset5
(0068) /*在启动时设置时间,按shift键后进入计时状态*/
(0069) void initdis()
(0070) {
(0071) unsigned char i=7;
007C E087 LDI R24,7
007D 2EA8 MOV R10,R24
(0072) unsigned char key=0;
007E 2744 CLR R20
(0073) write279(0xc8,0);
007F 2722 CLR R18
0080 EC08 LDI R16,0xC8
0081 DFEF RCALL _write279
(0074) write279(0xc9,0);
0082 2722 CLR R18
0083 EC09 LDI R16,0xC9
0084 DFEC RCALL _write279
(0075) write279(0x92,1);
0085 E021 LDI R18,1
0086 E902 LDI R16,0x92
0087 DFE9 RCALL _write279
(0076) write279(0xcb,0);
0088 2722 CLR R18
0089 EC0B LDI R16,0xCB
008A DFE6 RCALL _write279
(0077) write279(0xcc,0);
008B 2722 CLR R18
008C EC0C LDI R16,0xCC
008D DFE3 RCALL _write279
(0078) write279(0x95,1);
008E E021 LDI R18,1
008F E905 LDI R16,0x95
0090 DFE0 RCALL _write279
(0079) write279(0xce,0);
0091 2722 CLR R18
0092 EC0E LDI R16,0xCE
0093 DFDD RCALL _write279
(0080) write279(0xcf,0);
0094 2722 CLR R18
0095 EC0F LDI R16,0xCF
0096 DFDA RCALL _write279
(0081) write279(0x88,0x7f);
0097 E72F LDI R18,0x7F
0098 E808 LDI R16,0x88
0099 DFD7 RCALL _write279
(0082) do
(0083) {
(0084) while((PINC&0x02)!=0)
(0085) ;
009A 9999 SBIC P13,1
009B CFFE RJMP 0x009A
(0086) send_byte(0x15);
009C E105 LDI R16,0x15
009D DFB4 RCALL _send_byte
(0087) key=receive_byte();
009E DF97 RCALL _receive_byte
009F 2E20 MOV R2,R16
00A0 2E31 MOV R3,R17
00A1 2D42 MOV R20,R2
(0088) setcs;
00A2 9AAC SBI P15,4
(0089) switch (i)
00A3 2D6A MOV R22,R10
00A4 2777 CLR R23
00A5 3060 CPI R22,0
00A6 E0E0 LDI R30,0
00A7 077E CPC R23,R30
00A8 F40C BGE 0x00AA
00A9 C0BC RJMP 0x0166
00AA E087 LDI R24,7
00AB E090 LDI R25,0
00AC 1786 CP R24,R22
00AD 0797 CPC R25,R23
00AE F40C BGE 0x00B0
00AF C0B6 RJMP 0x0166
00B0 E18A LDI R24,0x1A
00B1 E090 LDI R25,0
00B2 2F06 MOV R16,R22
00B3 2F17 MOV R17,R23
00B4 0F00 LSL R16
00B5 1F11 ROL R17
00B6 0F08 ADD R16,R24
00B7 1F19 ADC R17,R25
00B8 D259 RCALL lpm16
00B9 2FE0 MOV R30,R16
00BA 2FF1 MOV R31,R17
00BB 9409 IJMP
(0090) {
(0091) case 7:{
(0092) if(key<3)
00BC 3043 CPI R20,3
00BD F008 BCS 0x00BF
00BE C0A7 RJMP 0x0166
(0093) {
(0094) write279(0xc8+i,key);
00BF 2F24 MOV R18,R20
00C0 2D0A MOV R16,R10
00C1 5308 SUBI R16,0x38
00C2 DFAE RCALL _write279
(0095) i--;
00C3 94AA DEC R10
(0096) write279(0x88,0xbf);
00C4 EB2F LDI R18,0xBF
00C5 E808 LDI R16,0x88
00C6 DFAA RCALL _write279
(0097) time.hour=time.hour%10+key*10;
00C7 E00A LDI R16,0xA
00C8 2F14 MOV R17,R20
00C9 D1F4 RCALL mpy8s
00CA 2E20 MOV R2,R16
00CB E01A LDI R17,0xA
00CC 91000066 LDS R16,_time+2
00CE D1FB RCALL mod8s
00CF 2E30 MOV R3,R16
00D0 0C32 ADD R3,R2
00D1 92300066 STS R3,_time+2
(0098) }
(0099) break;
00D3 C092 RJMP 0x0166
(0100) }
(0101) case 6:{
(0102) if(key<10)
00D4 304A CPI R20,0xA
00D5 F008 BCS 0x00D7
00D6 C08F RJMP 0x0166
(0103) {
(0104) if((time.hour<20)|(key<4))
00D7 91800066 LDS R24,_time+2
00D9 3184 CPI R24,0x14
00DA F42C BGE 0x00E0
00DB E081 LDI R24,1
00DC E090 LDI R25,0
00DD 2EE8 MOV R14,R24
00DE 2EF9 MOV R15,R25
00DF C002 RJMP 0x00E2
00E0 24EE CLR R14
00E1 24FF CLR R15
00E2 3044 CPI R20,4
00E3 F428 BCC 0x00E9
00E4 E081 LDI R24,1
00E5 E090 LDI R25,0
00E6 2EC8 MOV R12,R24
00E7 2ED9 MOV R13,R25
00E8 C002 RJMP 0x00EB
00E9 24CC CLR R12
00EA 24DD CLR R13
00EB 2C2E MOV R2,R14
00EC 2C3F MOV R3,R15
00ED 282C OR R2,R12
00EE 283D OR R3,R13
00EF 2022 TST R2
00F0 F419 BNE 0x00F4
00F1 2033 TST R3
00F2 F409 BNE 0x00F4
00F3 C072 RJMP 0x0166
(0105) {
(0106) write279(0xc8+i,key);
00F4 2F24 MOV R18,R20
00F5 2D0A MOV R16,R10
00F6 5308 SUBI R16,0x38
00F7 DF79 RCALL _write279
(0107) i--;
00F8 94AA DEC R10
(0108) i--;
00F9 94AA DEC R10
(0109) write279(0x88,0xef);
00FA EE2F LDI R18,0xEF
00FB E808 LDI R16,0x88
00FC DF74 RCALL _write279
(0110) time.hour=(time.hour/10)*10+key;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -