📄 emd.lst
字号:
__text_start:
__start:
002B EFCF LDI R28,0xFF
002C E0D4 LDI R29,4
002D BFCD OUT 0x3D,R28
002E BFDE OUT 0x3E,R29
002F 51C0 SUBI R28,0x10
0030 40D0 SBCI R29,0
0031 EA0A LDI R16,0xAA
0032 8308 STD Y+0,R16
0033 2400 CLR R0
0034 E1E3 LDI R30,0x13
0035 E0F1 LDI R31,1
0036 E011 LDI R17,1
0037 33E8 CPI R30,0x38
0038 07F1 CPC R31,R17
0039 F011 BEQ 0x003C
003A 9201 ST R0,Z+
003B CFFB RJMP 0x0037
003C 8300 STD Z+0,R16
003D E4E3 LDI R30,0x43
003E E0F0 LDI R31,0
003F E0A0 LDI R26,0
0040 E0B1 LDI R27,1
0041 E010 LDI R17,0
0042 35E6 CPI R30,0x56
0043 07F1 CPC R31,R17
0044 F021 BEQ 0x0049
0045 95C8 LPM
0046 9631 ADIW R30,1
0047 920D ST R0,X+
0048 CFF9 RJMP 0x0042
0049 D400 RCALL _main
_exit:
004A CFFF RJMP _exit
FILE: E:\abol\file\EMD\programme\main.c
(0001) /********************************************************/
(0002) /* ABOL */
(0003) /* 868MHZ数码管显示接收器 */
(0004) /* 作者:于朝晖 2008-5-24 9:30:00 */
(0005) /* 目标MCU:MEGA48 晶振:INT RC 8MHZ */
(0006) /* 文件名称:main.c 主函数 */
(0007) /* 编译:ICC-AVR application builder */
(0008) /* 当前版本: 1.0 */
(0009) /* 修改日期: 2008.5.24 */
(0010) /********************************************************/
(0011)
(0012) #include <iom88v.h>
(0013) #include <macros.h>
(0014) #include "eeprom.h"
(0015) #include "delay.h"
(0016) #include "main.h"
(0017) #include "init.h"
(0018) #include "key.h"
(0019) #define uchar unsigned char
(0020) #define unit unsigned int
(0021) #define ulong unsigned long
(0022) #define bitset(var, bitno) ((var) |= (1 << (bitno)))
(0023) #define bitclr(var, bitno) ((var) &= ~(1 << (bitno)))
(0024)
(0025)
(0026)
(0027)
(0028) void init_pin(void)
(0029) {
(0030) flag=0;
_init_pin:
004B 2422 CLR R2
004C 92200102 STS flag,R2
(0031) flagl=0;
004E 92200134 STS flagl,R2
(0032) flagh &=~BIT(0);
0050 91800103 LDS R24,flagh
0052 7F8E ANDI R24,0xFE
0053 93800103 STS flagh,R24
0055 9508 RET
_indat:
i --> R20
data --> R16
0056 DA24 RCALL push_gset1
(0033) }
(0034) //发送一个字节至TM1620
(0035) void indat(unsigned char data)
(0036) {
(0037) unsigned char i;
(0038) CLR_STB; //将STB至低,等待CLK为低
0057 9828 CBI 0x05,0
(0039) for(i=0;i<8;i++)
0058 2744 CLR R20
0059 C009 RJMP 0x0063
(0040) {
(0041) CLR_CLK; //CLK为低
005A 9829 CBI 0x05,1
(0042) if((data&0x01)!=0)
005B FF00 SBRS R16,0
005C C002 RJMP 0x005F
(0043) {
(0044) SET_DIN; //数据I位为1
005D 9A2A SBI 0x05,2
(0045) }
005E C001 RJMP 0x0060
(0046) else
(0047) {
(0048) CLR_DIN;//数据I位为0
005F 982A CBI 0x05,2
(0049) }
(0050) SET_CLK; //CLK为高
0060 9A29 SBI 0x05,1
(0051) data>>=1;
0061 9506 LSR R16
0062 9543 INC R20
0063 3048 CPI R20,0x8
0064 F3A8 BCS 0x005A
0065 DA18 RCALL pop_gset1
0066 9508 RET
_display:
i --> Y+1
disa --> R20
0067 DA13 RCALL push_gset1
0068 2F40 MOV R20,R16
(0052) }
(0053) }
(0054)
(0055) void display (unsigned char disa)
(0056) {
(0057) unsigned char i;
(0058) SET_DIN;
0069 9A2A SBI 0x05,2
(0059) SET_CLK;
006A 9A29 SBI 0x05,1
(0060) SET_STB;
006B 9A28 SBI 0x05,0
(0061) indat(0x02);
006C E002 LDI R16,2
006D DFE8 RCALL _indat
006E DA0F RCALL pop_gset1
006F 9508 RET
(0062)
(0063) }
(0064) //显示初始化
(0065) void init_tm1620 (void)
(0066) {
(0067) unsigned char i;
(0068) //TM1620模式设定
(0069) SET_STB;
_init_tm1620:
i --> Y+1
0070 9A28 SBI 0x05,0
(0070) indat(0x02);
0071 E002 LDI R16,2
0072 DFE3 RCALL _indat
(0071) SET_STB;
0073 9A28 SBI 0x05,0
(0072) //数据写设定
(0073) indat(0x40);
0074 E400 LDI R16,0x40
0075 DFE0 RCALL _indat
(0074) SET_STB;
0076 9A28 SBI 0x05,0
(0075) //地址模式设定
(0076) indat(0xc0);
0077 EC00 LDI R16,0xC0
0078 DFDD RCALL _indat
(0077) SET_STB;
0079 9A28 SBI 0x05,0
(0078) indat(0x3f);
007A E30F LDI R16,0x3F
007B DFDA RCALL _indat
(0079) indat(0x3f);
007C E30F LDI R16,0x3F
007D DFD8 RCALL _indat
(0080) indat(0x3f);
007E E30F LDI R16,0x3F
007F DFD6 RCALL _indat
(0081) indat(0x3f);
0080 E30F LDI R16,0x3F
0081 DFD4 RCALL _indat
(0082) indat(0x3f);
0082 E30F LDI R16,0x3F
0083 DFD2 RCALL _indat
(0083) indat(0x3f);
0084 E30F LDI R16,0x3F
0085 DFD0 RCALL _indat
(0084) indat(0x3f);
0086 E30F LDI R16,0x3F
0087 DFCE RCALL _indat
(0085) indat(0x3f);
0088 E30F LDI R16,0x3F
0089 DFCC RCALL _indat
(0086) indat(0x3f);
008A E30F LDI R16,0x3F
008B DFCA RCALL _indat
(0087) indat(0x3f);
008C E30F LDI R16,0x3F
008D DFC8 RCALL _indat
(0088) indat(0x3f);
008E E30F LDI R16,0x3F
008F DFC6 RCALL _indat
(0089) indat(0x3f);
0090 E30F LDI R16,0x3F
0091 DFC4 RCALL _indat
(0090) indat(0x3f);
0092 E30F LDI R16,0x3F
0093 DFC2 RCALL _indat
(0091) indat(0x3f);
0094 E30F LDI R16,0x3F
0095 DFC0 RCALL _indat
(0092) //开显示
(0093) SET_STB;
0096 9A28 SBI 0x05,0
(0094) indat(0x8f);
0097 E80F LDI R16,0x8F
0098 DFBD RCALL _indat
0099 9508 RET
(0095) }
(0096) //数据刷新
(0097) void tm1620 (void)
(0098) {
(0099) unsigned char i;
(0100) //TM1620模式设定
(0101) SET_STB;
_tm1620:
i --> Y+1
009A 9A28 SBI 0x05,0
(0102) //地址模式设定
(0103) indat(0xc0);
009B EC00 LDI R16,0xC0
009C DFB9 RCALL _indat
(0104) SET_STB;
009D 9A28 SBI 0x05,0
(0105) WDR();
009E 95A8 WDR
(0106) if((flagh&0x04)==0)
009F 90200103 LDS R2,flagh
00A1 FC22 SBRC R2,2
00A2 C020 RJMP 0x00C3
(0107) {
(0108) indat(0x3f);
00A3 E30F LDI R16,0x3F
00A4 DFB1 RCALL _indat
(0109) indat(dipdata[0]);
00A5 9100011E LDS R16,dipdata
00A7 DFAE RCALL _indat
(0110) indat(0x06);
00A8 E006 LDI R16,6
00A9 DFAC RCALL _indat
(0111) indat(dipdata[1]);
00AA 9100011F LDS R16,dipdata+1
00AC DFA9 RCALL _indat
(0112) indat(0x5b);
00AD E50B LDI R16,0x5B
00AE DFA7 RCALL _indat
(0113) indat(dipdata[2]);
00AF 91000120 LDS R16,dipdata+2
00B1 DFA4 RCALL _indat
(0114) indat(0x4f);
00B2 E40F LDI R16,0x4F
00B3 DFA2 RCALL _indat
(0115) indat(dipdata[3]);
00B4 91000121 LDS R16,dipdata+3
00B6 DF9F RCALL _indat
(0116) indat(0x66);
00B7 E606 LDI R16,0x66
00B8 DF9D RCALL _indat
(0117) indat(dipdata[4]);
00B9 91000122 LDS R16,0x122
00BB DF9A RCALL _indat
(0118) indat(0x6d);
00BC E60D LDI R16,0x6D
00BD DF98 RCALL _indat
(0119) indat(dipdata[5]);
00BE 91000123 LDS R16,0x123
00C0 DF95 RCALL _indat
(0120) SET_STB;
00C1 9A28 SBI 0x05,0
(0121) }
00C2 C043 RJMP 0x0106
(0122) else //开了闪烁位的显示
(0123) {
(0124) indat(0x3f);
00C3 E30F LDI R16,0x3F
00C4 DF91 RCALL _indat
(0125) if(D1FC==0)
00C5 90200130 LDS R2,D1FC
00C7 2022 TST R2
00C8 F471 BNE 0x00D7
(0126) {
(0127) indat(dipdata[0]);
00C9 9100011E LDS R16,dipdata
00CB DF8A RCALL _indat
(0128) indat(0x06);
00CC E006 LDI R16,6
00CD DF88 RCALL _indat
(0129) indat(dipdata[1]);
00CE 9100011F LDS R16,dipdata+1
00D0 DF85 RCALL _indat
(0130) indat(0x5b);
00D1 E50B LDI R16,0x5B
00D2 DF83 RCALL _indat
(0131) indat(dipdata[2]);
00D3 91000120 LDS R16,dipdata+2
00D5 DF80 RCALL _indat
(0132) }
00D6 C00A RJMP 0x00E1
(0133) else
(0134) {
(0135) indat(0);
00D7 2700 CLR R16
00D8 DF7D RCALL _indat
(0136) indat(0);
00D9 2700 CLR R16
00DA DF7B RCALL _indat
(0137) indat(0);
00DB 2700 CLR R16
00DC DF79 RCALL _indat
(0138) indat(0);
00DD 2700 CLR R16
00DE DF77 RCALL _indat
(0139) indat(0);
00DF 2700 CLR R16
00E0 DF75 RCALL _indat
(0140) }
(0141) indat(0x4f);
00E1 E40F LDI R16,0x4F
00E2 DF73 RCALL _indat
(0142) if(D3FC==0) indat(dipdata[3]);
00E3 9020012E LDS R2,D3FC
00E5 2022 TST R2
00E6 F421 BNE 0x00EB
00E7 91000121 LDS R16,dipdata+3
00E9 DF6C RCALL _indat
00EA C002 RJMP 0x00ED
(0143) else indat(0);
00EB 2700 CLR R16
00EC DF69 RCALL _indat
(0144) indat(0x66);
00ED E606 LDI R16,0x66
00EE DF67 RCALL _indat
(0145) if(D4FC==0) indat(dipdata[4]);
00EF 9020012D LDS R2,D4FC
00F1 2022 TST R2
00F2 F421 BNE 0x00F7
00F3 91000122 LDS R16,0x122
00F5 DF60 RCALL _indat
00F6 C002 RJMP 0x00F9
(0146) else indat(0);
00F7 2700 CLR R16
00F8 DF5D RCALL _indat
(0147) indat(0x6d);
00F9 E60D LDI R16,0x6D
00FA DF5B RCALL _indat
(0148) if(D5FC==0) indat(dipdata[5]);
00FB 9020012C LDS R2,D5FC
00FD 2022 TST R2
00FE F421 BNE 0x0103
00FF 91000123 LDS R16,0x123
0101 DF54 RCALL _indat
0102 C002 RJMP 0x0105
(0149) else indat(0);
0103 2700 CLR R16
0104 DF51 RCALL _indat
(0150) SET_STB;
0105 9A28 SBI 0x05,0
(0151) }
0106 9508 RET
_code_comp:
b --> R12
a --> R10
i --> R22
j --> R20
0107 D96D RCALL push_gset4
(0152) }
(0153) /*比较接收到的代码在EEPORM的位置
(0154) 有记录反回地址,没有反回FF*/
(0155) unsigned char code_comp (void)
(0156) {
(0157) unsigned char i,j=0,a,b;
0108 2744 CLR R20
(0158) for(i=0;i<100;i++)
0109 2766 CLR R22
010A C01B RJMP 0x0126
(0159) {
(0160) WDR();
010B 95A8 WDR
(0161) j=i*4; //每个ID用两个记录地址,两个记录编号
010C E084 LDI R24,4
010D 9F86 MUL R24,R22
010E 2D40 MOV R20,R0
(0162) a=EEPROM_read(j);
010F 2F04 MOV R16,R20
0110 D615 RCALL _EEPROM_read
0111 2EA0 MOV R10,R16
(0163) j++;
0112 9543 INC R20
(0164) b=EEPROM_read(j);
0113 2F04 MOV R16,R20
0114 D611 RCALL _EEPROM_read
0115 2EC0 MOV R12,R16
(0165) j++;
0116 9543 INC R20
(0166) if((a==data[0])&&(b==data[1]))
0117 9020011B LDS R2,data
0119 14A2 CP R10,R2
011A F439 BNE 0x0122
011B 9020011C LDS R2,data+1
011D 1502 CP R16,R2
011E F419 BNE 0x0122
(0167) {
(0168) addr=i;
011F 9360010B STS addr,R22
(0169) break;
0121 C006 RJMP 0x0128
(0170) }
(0171) else
(0172) {
(0173) addr=0xff;
0122 EF8F LDI R24,0xFF
0123 9380010B STS addr,R24
0125 9563 INC R22
0126 3664 CPI R22,0x64
0127 F318 BCS 0x010B
(0174)
(0175) }
(0176) }
(0177) return(addr);
0128 9100010B LDS R16,addr
012A D946 RCALL pop_gset4
012B 9508 RET
_lookup_led:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -