📄 sle4442.lst
字号:
__start:
__text_start:
0020 E5CF LDI R28,0x5F
0021 E0D2 LDI R29,2
0022 BFCD OUT 0x3D,R28
0023 BFDE OUT 0x3E,R29
0024 51C0 SUBI R28,0x10
0025 40D0 SBCI R29,0
0026 EA0A LDI R16,0xAA
0027 8308 STD Y+0,R16
0028 2400 CLR R0
0029 E7E8 LDI R30,0x78
002A E0F0 LDI R31,0
002B E010 LDI R17,0
002C 39E8 CPI R30,0x98
002D 07F1 CPC R31,R17
002E F011 BEQ 0x0031
002F 9201 ST R0,Z+
0030 CFFB RJMP 0x002C
0031 8300 STD Z+0,R16
0032 E2E8 LDI R30,0x28
0033 E0F0 LDI R31,0
0034 E6A0 LDI R26,0x60
0035 E0B0 LDI R27,0
0036 E010 LDI R17,0
0037 34E0 CPI R30,0x40
0038 07F1 CPC R31,R17
0039 F021 BEQ 0x003E
003A 95C8 LPM
003B 9631 ADIW R30,1
003C 920D ST R0,X+
003D CFF9 RJMP 0x0037
003E D571 RCALL _main
_exit:
003F CFFF RJMP _exit
FILE: E:\张军\AVR\光盘内容\实例源文件\第六章程序\SSLE4442.c
(0001) //*********************FileName:Main.c*********************//
(0002) //*********************Author:Steaven2000@163.com**********//
(0003) //********************Version:1.2*************************//
(0004) //******************LastUpdate:2004-11-03*****************//
(0005)
(0006) #include <io8535v.h>
(0007) #include <macros.h>
(0008) #define uchar unsigned char
(0009) #define uint unsigned int
(0010)
(0011) //**********定义全局变量*******************//
(0012) //查表0 1 2 3 4 5 6 7 8 9 E F P OFF
(0013) uchar table[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79,0x71,0x73,0x00};
(0014) uchar ICcode[4];//定义IC卡复位时读出的4字节代码;
(0015) uchar ICcontent[14];//定义IC卡有效信息;
(0016) uchar Money[5];//定义IC卡内金额;
(0017) uchar EEEEE[5]={0x79,0x79,0x79,0x79};
(0018) uchar FFFFF[5]={0x71,0x71,0x71,0x71};
(0019) uchar IC_Flag;//定义IC卡上电标志;
(0020) uchar Num_Flag;//数标志;
(0021) uchar Add_Flag;//加标志
(0022) uchar Sub_Flag;//减标志
(0023) uchar Init_Flag;//初始化标志
(0024) uchar Repair_Flag;//修卡标志;
(0025) uchar Enter_Flag;//确认标志
(0026) uchar Point_Flag;//.标志
(0027) uchar Key_Flag; //按键标志;
(0028)
(0029)
(0030) //***********IC卡引脚信号处理***************//
(0031) void Voice(uchar PD) //Voice=PD^7
(0032) {if(PD==1) PORTD|=0x80;//Voice置1
_Voice:
PD --> R16
0040 3001 CPI R16,1
0041 F411 BNE 0x0044
0042 9A97 SBI 0x12,7
0043 C003 RJMP 0x0047
(0033) else PORTD&=~80; //Voice置0
0044 B382 IN R24,0x12
0045 7A8F ANDI R24,0xAF
0046 BB82 OUT 0x12,R24
(0034) }
0047 9508 RET
(0035)
(0036) void RST(uchar PD) //RST=PD^6
(0037) {if(PD==1) PORTD|=0x40;//RST置1
_RST:
PD --> R16
0048 3001 CPI R16,1
0049 F411 BNE 0x004C
004A 9A96 SBI 0x12,6
004B C001 RJMP 0x004D
(0038) else PORTD&=~0x40;//RST置0
004C 9896 CBI 0x12,6
(0039) }
004D 9508 RET
(0040)
(0041) void CLK(uchar PD) //CLK=PD^5
(0042) {if(PD==1) PORTD|=0x20;//CLK置1
_CLK:
PD --> R16
004E 3001 CPI R16,1
004F F411 BNE 0x0052
0050 9A95 SBI 0x12,5
0051 C001 RJMP 0x0053
(0043) else PORTD&=~0x20;//CLK置0
0052 9895 CBI 0x12,5
(0044) }
0053 9508 RET
(0045)
(0046) void IO(uchar PD) //IO=PD^4
(0047) {if(PD==1) PORTD|=0x10;//IO置1
_IO:
PD --> R16
0054 3001 CPI R16,1
0055 F411 BNE 0x0058
0056 9A94 SBI 0x12,4
0057 C001 RJMP 0x0059
(0048) else PORTD&=~0x10;//IO置0
0058 9894 CBI 0x12,4
(0049) }
0059 9508 RET
(0050)
(0051) void SetIO(uchar i)//设置IO口属性
(0052) {if(i==1) DDRD=0xf0; //IO口输出:1111 0000
_SetIO:
i --> R16
005A 3001 CPI R16,1
005B F419 BNE 0x005F
005C EF80 LDI R24,0xF0
005D BB81 OUT 0x11,R24
005E C002 RJMP 0x0061
(0053) else DDRD=0xe0; //IO口输如:1110 0000
005F EE80 LDI R24,0xE0
0060 BB81 OUT 0x11,R24
(0054) PORTD=0x00;//不带上拉电阻;
0061 2422 CLR R2
0062 BA22 OUT 0x12,R2
(0055) }
0063 9508 RET
(0056)
(0057) //**********延时函数(Us数量级)*********//
(0058) //单周期指令执行时间,执行时间1/8us*分频系数(取8分频则刚好1us);
(0059) void DelayUs(uchar i)
(0060) {for(;i!=0;i--)
_DelayUs:
i --> R16
0064 C002 RJMP 0x0067
(0061) NOP();
0065 0000 NOP
0066 950A DEC R16
0067 2300 TST R16
0068 F7E1 BNE 0x0065
(0062) }
0069 9508 RET
_DelayMs:
k --> R20
j --> R22
i --> R16
006A D5AB RCALL push_gset2
(0063)
(0064) //****************延时函数(Ms数量级)*********//
(0065) void DelayMs(uint i)
(0066) {uchar j,k;
(0067) for(;i!=0;i--)
006B C00D RJMP 0x0079
(0068) {for(k=0;k<4;k++)
006C 2744 CLR R20
006D C007 RJMP 0x0075
(0069) {for(j=250;j!=0;j--) NOP();}
006E EF6A LDI R22,0xFA
006F C002 RJMP 0x0072
0070 0000 NOP
0071 956A DEC R22
0072 2366 TST R22
0073 F7E1 BNE 0x0070
0074 9543 INC R20
0075 3044 CPI R20,4
0076 F3B8 BCS 0x006E
0077 5001 SUBI R16,1
0078 4010 SBCI R17,0
0079 3000 CPI R16,0
007A 0701 CPC R16,R17
007B F781 BNE 0x006C
(0070) }
(0071) }
007C D57C RCALL pop_gset2
007D 9508 RET
_ReceiveData:
io_value --> R20
count --> R22
value --> R10
007E D59A RCALL push_gset3
(0072)
(0073) //****************接收数据**************//
(0074) uchar ReceiveData(void)
(0075) {uchar count;
(0076) uchar value;
(0077) uchar io_value;
(0078) value=0;
007F 24AA CLR R10
(0079) SetIO(0);//设置IO脚为输入;
0080 2700 CLR R16
0081 DFD8 RCALL _SetIO
(0080) CLK(0);
0082 2700 CLR R16
0083 DFCA RCALL _CLK
(0081) //IO=1;
(0082) for(count=0;count<8;count++)
0084 2766 CLR R22
0085 C014 RJMP 0x009A
(0083) {value=value>>1;
0086 94A6 LSR R10
(0084) CLK(1);
0087 E001 LDI R16,1
0088 DFC5 RCALL _CLK
(0085) DelayUs(2);
0089 E002 LDI R16,2
008A DFD9 RCALL _DelayUs
(0086) io_value=PIND;
008B B340 IN R20,0x10
(0087) CLK(0);
008C 2700 CLR R16
008D DFC0 RCALL _CLK
(0088) DelayUs(2);
008E E002 LDI R16,2
008F DFD4 RCALL _DelayUs
(0089) if(io_value&0x10==0x10) value|=0x80;//判断IO脚是否为1
0090 FF40 SBRS R20,0
0091 C004 RJMP 0x0096
0092 2D8A MOV R24,R10
0093 6880 ORI R24,0x80
0094 2EA8 MOV R10,R24
0095 C003 RJMP 0x0099
(0090) else value&=0x7f;
0096 2D8A MOV R24,R10
0097 778F ANDI R24,0x7F
0098 2EA8 MOV R10,R24
0099 9563 INC R22
009A 3068 CPI R22,0x8
009B F350 BCS 0x0086
(0091) }
(0092) return (value);
009C 2D0A MOV R16,R10
009D D55D RCALL pop_gset3
009E 9508 RET
_SendData:
value --> R20
count --> R20
Xdata --> R22
009F D576 RCALL push_gset2
00A0 2F60 MOV R22,R16
(0093) }
(0094)
(0095) //********************发送数据************//
(0096) void SendData(uchar Xdata)
(0097) {uchar count;
(0098) uchar value;
(0099) SetIO(1);////设置IO脚为输出;
00A1 E001 LDI R16,1
00A2 DFB7 RCALL _SetIO
(0100) value=Xdata;
(0101) for(count=8;count!=0;count--)
00A3 E048 LDI R20,0x8
00A4 C015 RJMP 0x00BA
(0102) {CLK(0);
00A5 2700 CLR R16
00A6 DFA7 RCALL _CLK
(0103) if((Xdata<<(count-1))&0x80) IO(1);
00A7 2F14 MOV R17,R20
00A8 5011 SUBI R17,1
00A9 2F06 MOV R16,R22
00AA D5A2 RCALL lsl8
00AB 2F80 MOV R24,R16
00AC 7880 ANDI R24,0x80
00AD F019 BEQ 0x00B1
00AE E001 LDI R16,1
00AF DFA4 RCALL _IO
00B0 C002 RJMP 0x00B3
(0104) else IO(0);
00B1 2700 CLR R16
00B2 DFA1 RCALL _IO
(0105) CLK(1);
00B3 E001 LDI R16,1
00B4 DF99 RCALL _CLK
(0106) DelayUs(2);
00B5 E002 LDI R16,2
00B6 DFAD RCALL _DelayUs
(0107) CLK(0);}
00B7 2700 CLR R16
00B8 DF95 RCALL _CLK
00B9 954A DEC R20
00BA 2344 TST R20
00BB F749 BNE 0x00A5
(0108) }
00BC D53C RCALL pop_gset2
00BD 9508 RET
_ResetIC:
count --> R20
Xdata --> R22
00BE D557 RCALL push_gset2
00BF 2F60 MOV R22,R16
00C0 2F71 MOV R23,R17
(0109)
(0110) //****************IC卡复位************************//
(0111) void ResetIC(uchar *Xdata)
(0112) {uchar count;
(0113) SetIO(1); //设置IC卡引脚的属性
00C1 E001 LDI R16,1
00C2 DF97 RCALL _SetIO
(0114) RST(0);
00C3 2700 CLR R16
00C4 DF83 RCALL _RST
(0115) CLK(0);
00C5 2700 CLR R16
00C6 DF87 RCALL _CLK
(0116) IO(1);
00C7 E001 LDI R16,1
00C8 DF8B RCALL _IO
(0117) DelayUs(5);
00C9 E005 LDI R16,5
00CA DF99 RCALL _DelayUs
(0118) RST(1);
00CB E001 LDI R16,1
00CC DF7B RCALL _RST
(0119) DelayUs(5);
00CD E005 LDI R16,5
00CE DF95 RCALL _DelayUs
(0120) CLK(1);
00CF E001 LDI R16,1
00D0 DF7D RCALL _CLK
(0121) DelayUs(5);
00D1 E005 LDI R16,5
00D2 DF91 RCALL _DelayUs
(0122) CLK(0);
00D3 2700 CLR R16
00D4 DF79 RCALL _CLK
(0123) DelayUs(5);
00D5 E005 LDI R16,5
00D6 DF8D RCALL _DelayUs
(0124) RST(0);
00D7 2700 CLR R16
00D8 DF6F RCALL _RST
(0125) for(count=4;count!=0;count--)
00D9 E044 LDI R20,4
00DA C007 RJMP 0x00E2
(0126) {*Xdata=ReceiveData();
00DB DFA2 RCALL _ReceiveData
00DC 2FE6 MOV R30,R22
00DD 2FF7 MOV R31,R23
00DE 8300 STD Z+0,R16
(0127) Xdata+=2;}
00DF 5F6E SUBI R22,0xFE
00E0 4F7F SBCI R23,0xFF
00E1 954A DEC R20
00E2 2344 TST R20
00E3 F7B9 BNE 0x00DB
(0128) }
00E4 D514 RCALL pop_gset2
00E5 9508 RET
(0129)
(0130) //*******************Start条件****************//
(0131) void Start(void)
(0132) {SetIO(1);
_Start:
00E6 E001 LDI R16,1
00E7 DF72 RCALL _SetIO
(0133) CLK(0);
00E8 2700 CLR R16
00E9 DF64 RCALL _CLK
(0134) IO(0);
00EA 2700 CLR R16
00EB DF68 RCALL _IO
(0135) DelayUs(2);
00EC E002 LDI R16,2
00ED DF76 RCALL _DelayUs
(0136) CLK(1);
00EE E001 LDI R16,1
00EF DF5E RCALL _CLK
(0137) IO(1);
00F0 E001 LDI R16,1
00F1 DF62 RCALL _IO
(0138) DelayUs(2);
00F2 E002 LDI R16,2
00F3 DF70 RCALL _DelayUs
(0139) IO(0);
00F4 2700 CLR R16
00F5 DF5E RCALL _IO
(0140) CLK(0);
00F6 2700 CLR R16
(0141) }
00F7 CF56 RJMP _CLK
(0142)
(0143) //*******************Stop条件****************//
(0144) void Stop(void)
(0145) {CLK(0);
_Stop:
00F8 2700 CLR R16
00F9 DF54 RCALL _CLK
(0146) IO(0);
00FA 2700 CLR R16
00FB DF58 RCALL _IO
(0147) DelayUs(2);
00FC E002 LDI R16,2
00FD DF66 RCALL _DelayUs
(0148) CLK(1);
00FE E001 LDI R16,1
00FF DF4E RCALL _CLK
(0149) IO(0);
0100 2700 CLR R16
0101 DF52 RCALL _IO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -