📄 wnl.lst
字号:
__start:
__text_start:
0065 EFCF LDI R28,0xFF
0066 E1D0 LDI R29,0x10
0067 BFCD OUT 0x3D,R28
0068 BFDE OUT 0x3E,R29
0069 51C0 SUBI R28,0x10
006A 40D0 SBCI R29,0
006B EA0A LDI R16,0xAA
006C 8308 STD Y+0,R16
006D 2400 CLR R0
006E E1E6 LDI R30,0x16
006F E0F1 LDI R31,1
0070 E011 LDI R17,1
0071 31E6 CPI R30,0x16
0072 07F1 CPC R31,R17
0073 F011 BEQ 0x0076
0074 9201 ST R0,Z+
0075 CFFB RJMP 0x0071
0076 8300 STD Z+0,R16
0077 EBE4 LDI R30,0xB4
0078 E0F0 LDI R31,0
0079 E0A0 LDI R26,0
007A E0B1 LDI R27,1
007B E010 LDI R17,0
007C 3CEA CPI R30,0xCA
007D 07F1 CPC R31,R17
007E F021 BEQ 0x0083
007F 95C8 LPM
0080 9631 ADIW R30,1
0081 920D ST R0,X+
0082 CFF9 RJMP 0x007C
0083 940E0554 CALL _main
_exit:
0085 CFFF RJMP _exit
_delay:
k --> R20
x --> R16
0086 940E067C CALL push_gset1
FILE: E:\ATMEGA~1\万年历实验\2.c
(0001) //李伟于9月3号完成
(0002) #include<iom128v.h>
(0003) /*定义OCMJ4X8端口*/
(0004) //DATA_PORT=PORTA
(0005) #define data_port PORTA
(0006) //ASK=PORTE.6
(0007) #define ask (PINE&0x40)
(0008) //ANSWER=PORTE.7
(0009) #define set_answer asm("sbi 0x03,7")
(0010) #define clr_answer asm("cbi 0x03,7")
(0011) //RESTE=PORTC.3
(0012) #define set_reset asm("sbi 0x15,3")
(0013) #define clr_reset asm("cbi 0x15,3")
(0014) #define wait asm("nop\n nop")
(0015) unsigned char second=0,minute=0,hour=0,day=4,days=11,month=8;
(0016) unsigned int year=2005;
(0017) unsigned char flag=0;
(0018) unsigned char lcd_buff[4]={0,0,0,0};//放小时,分钟
(0019) unsigned char lcd_buff1[9]={0,0,0,0,0,0,0,0,0};//相当与一个地址,存放月,日
(0020) const unsigned char biao1[]={50,22,40,43,46,33,40,48,38,36,52,40};
(0021) const unsigned char biao2[]={27,94,93,36,69,89,53,39,58,74,34,53};
(0022) const unsigned char table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
(0023) void delay(unsigned int x)
(0024) {
(0025) unsigned int k;
(0026) for(k=0;k<x;k++)
0088 2744 CLR R20
0089 2755 CLR R21
008A C002 RJMP 0x008D
008B 5F4F SUBI R20,0xFF
008C 4F5F SBCI R21,0xFF
008D 1740 CP R20,R16
008E 0751 CPC R21,R17
008F F3D8 BCS 0x008B
0090 940E067F CALL pop_gset1
0092 9508 RET
(0027) ;
(0028) }
(0029) void ocmj_init(void)
(0030) {
(0031) MCUCR=0;
_ocmj_init:
0093 2422 CLR R2
0094 BE25 OUT 0x35,R2
(0032) DDRA=0xff;
0095 EF8F LDI R24,0xFF
0096 BB8A OUT 0x1A,R24
(0033) PORTA=0xff;
0097 BB8B OUT 0x1B,R24
(0034) DDRE=0b10000000;
0098 E880 LDI R24,0x80
0099 B982 OUT 0x02,R24
(0035) PORTE=0xff;
009A EF8F LDI R24,0xFF
009B B983 OUT 0x03,R24
(0036) clr_reset;//LCD复位
009C 98AB CBI 0x15,3
(0037) delay(10);
009D E00A LDI R16,0xA
009E E010 LDI R17,0
009F DFE6 RCALL _delay
(0038) set_reset;
00A0 9AAB SBI 0x15,3
(0039) clr_answer;
00A1 981F CBI 0x03,7
(0040) delay(2);
00A2 E002 LDI R16,2
00A3 E010 LDI R17,0
00A4 DFE1 RCALL _delay
00A5 9508 RET
(0041) }
(0042) /**********************************************/
(0043) /* 写数据到LCD */
(0044) /**********************************************/
(0045) void ocmj_write(unsigned char data)
(0046) {
(0047) while(ask!=0)
_ocmj_write:
data --> R16
00A6 990E SBIC 0x01,6
00A7 CFFE RJMP _ocmj_write
(0048) ;
(0049) data_port=data;
00A8 BB0B OUT 0x1B,R16
(0050) wait;
00A9 0000 NOP
00AA 0000 NOP
(0051) set_answer;
00AB 9A1F SBI 0x03,7
(0052) wait;
00AC 0000 NOP
00AD 0000 NOP
(0053) while(ask==0)
00AE 9B0E SBIS 0x01,6
00AF CFFE RJMP 0x00AE
(0054) ;
(0055) clr_answer;
00B0 981F CBI 0x03,7
00B1 9508 RET
_write_ASCII:
data --> Y+6
yy --> Y+4
xx --> R20
type --> R22
00B2 940E067A CALL push_gset2
00B4 01A9 MOVW R20,R18
00B5 01B8 MOVW R22,R16
(0056) }
(0057) /**********************************************/
(0058) /* 写ASCII码初始化 */
(0059) /**********************************************/
(0060) void write_ASCII(unsigned type,unsigned xx,unsigned yy,unsigned data)
(0061) {
(0062) ocmj_write(type);
00B6 2F06 MOV R16,R22
00B7 DFEE RCALL _ocmj_write
(0063) ocmj_write(xx);
00B8 2F04 MOV R16,R20
00B9 DFEC RCALL _ocmj_write
(0064) ocmj_write(yy);
00BA 810C LDD R16,Y+4
00BB 811D LDD R17,Y+5
00BC DFE9 RCALL _ocmj_write
(0065) ocmj_write(data);
00BD 810E LDD R16,Y+6
00BE 811F LDD R17,Y+7
00BF DFE6 RCALL _ocmj_write
00C0 940E066E CALL pop_gset2
00C2 9508 RET
_write_hazi:
data2 --> Y+6
data1 --> Y+4
yy --> R20
xx --> R22
00C3 940E067A CALL push_gset2
00C5 01A9 MOVW R20,R18
00C6 01B8 MOVW R22,R16
(0066) }
(0067) /**********************************************/
(0068) /* 写汉字初始化 */
(0069) /**********************************************/
(0070) void write_hazi(unsigned xx,unsigned yy,unsigned data1,unsigned data2)
(0071) {
(0072) ocmj_write(0xf0);
00C7 EF00 LDI R16,0xF0
00C8 DFDD RCALL _ocmj_write
(0073) ocmj_write(xx);
00C9 2F06 MOV R16,R22
00CA DFDB RCALL _ocmj_write
(0074) ocmj_write(yy);
00CB 2F04 MOV R16,R20
00CC DFD9 RCALL _ocmj_write
(0075) ocmj_write(data1);
00CD 810C LDD R16,Y+4
00CE 811D LDD R17,Y+5
00CF DFD6 RCALL _ocmj_write
(0076) ocmj_write(data2);
00D0 810E LDD R16,Y+6
00D1 811F LDD R17,Y+7
00D2 DFD3 RCALL _ocmj_write
00D3 940E066E CALL pop_gset2
00D5 9508 RET
_scan_key:
i --> R22
temp --> R10
00D6 940E0678 CALL push_gset3
(0077) }
(0078) /**********************************************/
(0079) /* 键盘子程序 */
(0080) /**********************************************/
(0081) unsigned char scan_key(void)
(0082) {
(0083) unsigned char i,temp;
(0084) DDRB=0x0f;
00D8 E08F LDI R24,0xF
00D9 BB87 OUT 0x17,R24
(0085) PORTB=0xff;
00DA EF8F LDI R24,0xFF
00DB BB88 OUT 0x18,R24
(0086) for(i=0;i<4;i++)
00DC 2766 CLR R22
00DD C05A RJMP 0x0138
(0087) {
(0088) PORTB=~(1<<i); //键盘线扫描
00DE E001 LDI R16,1
00DF 2F16 MOV R17,R22
00E0 940E06C1 CALL lsl8
00E2 2E20 MOV R2,R16
00E3 9420 COM R2
00E4 BA28 OUT 0x18,R2
(0089) delay(30); //等待低电平稳定
00E5 E10E LDI R16,0x1E
00E6 E010 LDI R17,0
00E7 DF9E RCALL _delay
(0090) temp=PINB&0xf0;//读取键盘扫描信号,屏蔽低四位
00E8 B386 IN R24,0x16
00E9 7F80 ANDI R24,0xF0
00EA 2EA8 MOV R10,R24
(0091) if (temp!=0xf0)//如果有键按下,延时10ms消抖
00EB 3F80 CPI R24,0xF0
00EC F409 BNE 0x00EE
00ED C049 RJMP 0x0137
(0092) { //本程序用display代替10ms延时,
(0093) delay(3000); //可消除显示抖动
00EE EB08 LDI R16,0xB8
00EF E01B LDI R17,0xB
00F0 DF95 RCALL _delay
(0094) temp=PINB&0xf0;//再读键盘
00F1 B386 IN R24,0x16
00F2 7F80 ANDI R24,0xF0
00F3 2EA8 MOV R10,R24
(0095) if (temp!=0xf0)
00F4 3F80 CPI R24,0xF0
00F5 F409 BNE 0x00F7
00F6 C040 RJMP 0x0137
(0096) {
(0097) temp&=0xf0;
00F7 7F80 ANDI R24,0xF0
00F8 2EA8 MOV R10,R24
(0098) switch(temp) //计算键值
00F9 2F48 MOV R20,R24
00FA 2755 CLR R21
00FB 3B40 CPI R20,0xB0
00FC E0E0 LDI R30,0
00FD 075E CPC R21,R30
00FE F0F9 BEQ 0x011E
00FF EB80 LDI R24,0xB0
0100 E090 LDI R25,0
0101 1784 CP R24,R20
0102 0795 CPC R25,R21
0103 F02C BLT 0x0109
0104 3740 CPI R20,0x70
0105 E0E0 LDI R30,0
0106 075E CPC R21,R30
0107 F071 BEQ 0x0116
0108 C02C RJMP 0x0135
0109 3D40 CPI R20,0xD0
010A E0E0 LDI R30,0
010B 075E CPC R21,R30
010C F0C9 BEQ 0x0126
010D 3D40 CPI R20,0xD0
010E E0E0 LDI R30,0
010F 075E CPC R21,R30
0110 F124 BLT 0x0135
0111 3E40 CPI R20,0xE0
0112 E0E0 LDI R30,0
0113 075E CPC R21,R30
0114 F0C9 BEQ 0x012E
0115 C01F RJMP 0x0135
(0099) {
(0100) case 0x70:temp=15-(3-i)*4;break;
0116 E013 LDI R17,3
0117 1B16 SUB R17,R22
0118 E004 LDI R16,4
0119 0201 MULS R16,R17
011A E08F LDI R24,0xF
011B 2EA8 MOV R10,R24
011C 18A0 SUB R10,R0
011D C017 RJMP 0x0135
(0101) case 0xb0:temp=14-(3-i)*4;break;
011E E013 LDI R17,3
011F 1B16 SUB R17,R22
0120 E004 LDI R16,4
0121 0201 MULS R16,R17
0122 E08E LDI R24,0xE
0123 2EA8 MOV R10,R24
0124 18A0 SUB R10,R0
0125 C00F RJMP 0x0135
(0102) case 0xd0:temp=13-(3-i)*4;break;
0126 E013 LDI R17,3
0127 1B16 SUB R17,R22
0128 E004 LDI R16,4
0129 0201 MULS R16,R17
012A E08D LDI R24,0xD
012B 2EA8 MOV R10,R24
012C 18A0 SUB R10,R0
012D C007 RJMP 0x0135
(0103) case 0xe0:temp=12-(3-i)*4;break;
012E E013 LDI R17,3
012F 1B16 SUB R17,R22
0130 E004 LDI R16,4
0131 0201 MULS R16,R17
0132 E08C LDI R24,0xC
0133 2EA8 MOV R10,R24
0134 18A0 SUB R10,R0
(0104) default:break;
(0105) }
(0106) return temp;
0135 2D0A MOV R16,R10
0136 C005 RJMP 0x013C
0137 9563 INC R22
0138 3064 CPI R22,4
0139 F408 BCC 0x013B
013A CFA3 RJMP 0x00DE
(0107) }
(0108) }
(0109) }
(0110) return 0x00;//无键按下
013B 2700 CLR R16
013C 940E0671 CALL pop_gset3
013E 9508 RET
_time_display:
013F 9724 SBIW R28,4
(0111) }
(0112) /**********************************************/
(0113) /* LCD显示小时分钟秒*/
(0114) /**********************************************/
(0115) void time_display(void)
(0116) {
(0117) write_ASCII(0xf9,4,0,table[hour/10]);//小时高位
0140 E02A LDI R18,0xA
0141 E030 LDI R19,0
0142 91000102 LDS R16,hour
0144 2711 CLR R17
0145 940E0628 CALL div16s
0147 01F8 MOVW R30,R16
0148 EA84 LDI R24,0xA4
0149 E090 LDI R25,0
014A 0FE8 ADD R30,R24
014B 1FF9 ADC R31,R25
014C 9024 LPM R2,0(Z)
014D 2433 CLR R3
014E 823B STD Y+3,R3
014F 822A STD Y+2,R2
0150 2422 CLR R2
0151 8239 STD Y+1,R3
0152 8228 STD Y+0,R2
0153 E024 LDI R18,4
0154 E030 LDI R19,0
0155 EF09 LDI R16,0xF9
0156 E010 LDI R17,0
0157 DF5A RCALL _write_ASCII
(0118) write_ASCII(0xf9,5,0,table[hour%10]);//小时地位
0158 E02A LDI R18,0xA
0159 E030 LDI R19,0
015A 91000102 LDS R16,hour
015C 2711 CLR R17
015D 940E0624 CALL mod16s
015F 01F8 MOVW R30,R16
0160 EA84 LDI R24,0xA4
0161 E090 LDI R25,0
0162 0FE8 ADD R30,R24
0163 1FF9 ADC R31,R25
0164 9024 LPM R2,0(Z)
0165 2433 CLR R3
0166 823B STD Y+3,R3
0167 822A STD Y+2,R2
0168 2422 CLR R2
0169 8239 STD Y+1,R3
016A 8228 STD Y+0,R2
016B E025 LDI R18,5
016C E030 LDI R19,0
016D EF09 LDI R16,0xF9
016E E010 LDI R17,0
016F DF42 RCALL _write_ASCII
(0119) write_ASCII(0xf9,6,0,58); //:
0170 E38A LDI R24,0x3A
0171 E090 LDI R25,0
0172 839B STD Y+3,R25
0173 838A STD Y+2,R24
0174 2422 CLR R2
0175 2433 CLR R3
0176 8239 STD Y+1,R3
0177 8228 STD Y+0,R2
0178 E026 LDI R18,6
0179 E030 LDI R19,0
017A EF09 LDI R16,0xF9
017B E010 LDI R17,0
017C DF35 RCALL _write_ASCII
(0120) write_ASCII(0xf9,7,0,table[minute/10]);//分钟高位
017D E02A LDI R18,0xA
017E E030 LDI R19,0
017F 91000101 LDS R16,minute
0181 2711 CLR R17
0182 940E0628 CALL div16s
0184 01F8 MOVW R30,R16
0185 EA84 LDI R24,0xA4
0186 E090 LDI R25,0
0187 0FE8 ADD R30,R24
0188 1FF9 ADC R31,R25
0189 9024 LPM R2,0(Z)
018A 2433 CLR R3
018B 823B STD Y+3,R3
018C 822A STD Y+2,R2
018D 2422 CLR R2
018E 8239 STD Y+1,R3
018F 8228 STD Y+0,R2
0190 E027 LDI R18,7
0191 E030 LDI R19,0
0192 EF09 LDI R16,0xF9
0193 E010 LDI R17,0
0194 DF1D RCALL _write_ASCII
(0121) write_ASCII(0xf9,8,0,table[minute%10]);//分钟地位
0195 E02A LDI R18,0xA
0196 E030 LDI R19,0
0197 91000101 LDS R16,minute
0199 2711 CLR R17
019A 940E0624 CALL mod16s
019C 01F8 MOVW R30,R16
019D EA84 LDI R24,0xA4
019E E090 LDI R25,0
019F 0FE8 ADD R30,R24
01A0 1FF9 ADC R31,R25
01A1 9024 LPM R2,0(Z)
01A2 2433 CLR R3
01A3 823B STD Y+3,R3
01A4 822A STD Y+2,R2
01A5 2422 CLR R2
01A6 8239 STD Y+1,R3
01A7 8228 STD Y+0,R2
01A8 E028 LDI R18,0x8
01A9 E030 LDI R19,0
01AA EF09 LDI R16,0xF9
01AB E010 LDI R17,0
01AC DF05 RCALL _write_ASCII
(0122) write_ASCII(0xf9,9,0,58); //:
01AD E38A LDI R24,0x3A
01AE E090 LDI R25,0
01AF 839B STD Y+3,R25
01B0 838A STD Y+2,R24
01B1 2422 CLR R2
01B2 2433 CLR R3
01B3 8239 STD Y+1,R3
01B4 8228 STD Y+0,R2
01B5 E029 LDI R18,0x9
01B6 E030 LDI R19,0
01B7 EF09 LDI R16,0xF9
01B8 E010 LDI R17,0
01B9 DEF8 RCALL _write_ASCII
(0123) write_ASCII(0xf9,10,0,table[second/10]);//秒钟高位
01BA E02A LDI R18,0xA
01BB E030 LDI R19,0
01BC 91000100 LDS R16,second
01BE 2711 CLR R17
01BF 940E0628 CALL div16s
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -