📄 work.lst
字号:
__text_start:
__start:
0000 CFFF RJMP __text_start
0001 C2FB RJMP _INTHandler
0002 BFCD OUT 0x3D,R28
0003 BFDE OUT 0x3E,R29
0004 51C0 SUBI R28,0x10
0005 40D0 SBCI R29,0
0006 EA0A LDI R16,0xAA
0007 8308 STD Y+0,R16
0008 2400 CLR R0
0009 E6E0 LDI R30,0x60
000A E0F0 LDI R31,0
000B E010 LDI R17,0
000C 36E8 CPI R30,0x68
000D 07F1 CPC R31,R17
000E F011 BEQ 0x0011
000F 9201 ST R0,Z+
0010 CFFB RJMP 0x000C
0011 8300 STD Z+0,R16
0012 E0E0 LDI R30,0
0013 E0F0 LDI R31,0
0014 E6A0 LDI R26,0x60
0015 E0B0 LDI R27,0
0016 E010 LDI R17,0
0017 30E0 CPI R30,0
0018 07F1 CPC R31,R17
0019 F021 BEQ 0x001E
001A 95C8 LPM
001B 9631 ADIW R30,1
001C 920D ST R0,X+
001D CFF9 RJMP 0x0017
001E D28B RCALL _main
_exit:
001F CFFF RJMP _exit
FILE: E:\张军\AVR\光盘内容\实例源文件\第七章工程\wwork.c
(0001) //**********************FileName:Work.c**************************//
(0002) //**********************ICCAVR6.30编译****************************//
(0003) #include <io8535v.h>
(0004) #include <macros.h>
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007)
(0008) //引脚信号定义
(0009) #define KEY_0 (PINA&0x01) //PA0装票键
(0010) #define KEY_1 (PINA&0x02) //PA1打印页码键
(0011) #define KEY_2 (PINA&0x04) //PA2盖章键
(0012)
(0013) #define SONSOR_0 (PINB&0x01) //PB0前传感器
(0014) #define SONSOR_1 (PINB&0x02) //PB1中传感器
(0015) #define SONSOR_2 (PINB&0x04) //PB2后传感器
(0016) #define SONSOR_3 (PINB&0x08) //PB3纸传感器
(0017) #define SONSOR_4 (PINB&0x10) //PB4字轮传感器
(0018) #define SONSOR_5 (PINB&0x20) //PB5行走左传感器
(0019) #define SONSOR_6 (PINB&0x40) //PB6行走右传感器
(0020)
(0021) #define SIGN_ON1 (PORTD=PORTD|0x01) //PD0=1盖章工作指示灯输出
(0022) #define SIGN_ON0 (PORTD=PORTD&0xfe) //PD0=0盖章工作指示灯输出
(0023) #define SIGN_OFF1 (PORTD=PORTD|0x02) //PD1=1盖章结束指示灯输出管脚
(0024) #define SIGN_OFF0 (PORTD=PORTD&0xfd) //PD1=0盖章结束指示灯输出管脚
(0025) #define PRINT_ON1 (PORTD=PORTD|0x08) //PD3=1打印页码工作指示灯输出管脚
(0026) #define PRINT_ON0 (PORTD=PORTD&0xf7) //PD3=0打印页码工作指示灯输出管脚
(0027) #define PRINT_OFF1 (PORTD=PORTD|0x10) //PD4=1打印页码结束指示灯输出管脚
(0028) #define PRINT_OFF0 (PORTD=PORTD&0xef) //PD4=1打印页码结束指示灯输出管脚
(0029)
(0030) #define GRASP_ACT1 (PORTC=PORTC|0x01) //PC0抓纸机械手输出管脚
(0031) #define GRASP_ACT0 (PORTC=PORTC&0xfe) //PC0抓纸机械手输出管脚
(0032) #define PRINT_ACT1 (PORTC=PORTC|0x02) //PC1字轮击打电磁铁输出管脚
(0033) #define PRINT_ACT0 (PORTC=PORTC&0xfd) //PC1字轮击打电磁铁输出管脚
(0034) #define SIGN_ACT1 (PORTC=PORTC|0x04) //PC2盖章击打电磁铁输出管脚
(0035) #define SIGN_ACT0 (PORTC=PORTC&0xfb) //PC2盖章击打电磁铁输出管脚
(0036) #define M_DIR1 (PORTC=PORTC|0x08) //PC3电机方向输出管脚
(0037) #define M_DIR0 (PORTC=PORTC&0xf7) //PC3电机方向输出管脚
(0038) #define M3_pulse1 (PORTC=PORTC|0x10) //PC4字轮电机脉冲输出管脚
(0039) #define M3_pulse0 (PORTC=PORTC&0xef) //PC4字轮电机脉冲输出管脚
(0040) #define M2_pulse1 (PORTC=PORTC|0x20) //PC5行走电机脉冲输出管脚
(0041) #define M2_pulse0 (PORTC=PORTC&0xdf) //PC5行走电机脉冲输出管脚
(0042) #define M1_pulse1 (PORTC=PORTC|0x40) //PC6装票电机脉冲输出管脚
(0043) #define M1_pulse0 (PORTC=PORTC&0xbf) //PC6装票电机脉冲输出管脚
(0044)
(0045) uchar KeyDown; //有功能键按下标志
(0046) uchar Cancell; //取消功能键标志
(0047) uint u; //翻页步进电机的步数变量
(0048) uint b; //页码序号的不同位数之间差值的中间变量
(0049) uchar FunkeyNum;//功能按键的标号变量
(0050) uchar R_Step; //页码序号之间的距离(数字间距)所需的步进电机的步数
(0051)
(0052) //*****************I/O口初始化*****************************
(0053) void IO_Init(void)
(0054) {DDRA=0x00;//A口三态输入
_IO_Init:
0020 2422 CLR R2
0021 BA2A OUT 0x1A,R2
(0055) PORTA=0x00;
0022 BA2B OUT 0x1B,R2
(0056) DDRB=0x00;//B口三态输入
0023 BA27 OUT 0x17,R2
(0057) PORTB=0x00;
0024 BA28 OUT 0x18,R2
(0058) DDRC=0xff;//C口推挽输出
0025 EF8F LDI R24,0xFF
0026 BB84 OUT 0x14,R24
(0059) PORTC=0xff;
0027 BB85 OUT 0x15,R24
(0060) DDRD=0xfb;//D口推挽输出,PD2中断输入
0028 EF8B LDI R24,0xFB
0029 BB81 OUT 0x11,R24
(0061) PORTD=0xfb;
002A BB82 OUT 0x12,R24
(0062) }
002B 9508 RET
(0063) //*************************中断初始化函数************************//
(0064) void INT_Init(void)
(0065) {MCUCR=MCUCR&0xfd;//低电平中断
_INT_Init:
002C B785 IN R24,0x35
002D 7F8D ANDI R24,0xFD
002E BF85 OUT 0x35,R24
(0066) GIMSK=GIMSK|0x40;//INT0中断使能
002F B78B IN R24,0x3B
0030 6480 ORI R24,0x40
0031 BF8B OUT 0x3B,R24
(0067) SREG=SREG|0x80;//全局中断使能
0032 9478 BSET 7
(0068) }
0033 9508 RET
_DelayShort:
i --> R20
j --> R16
0034 D326 RCALL push_gset1
(0069)
(0070) //***************************短延时函数************************//
(0071) void DelayShort(uint j)
(0072) {uint i;
(0073) for(i=0;i<j;i++) ;
0035 2744 CLR R20
0036 2755 CLR R21
0037 C002 RJMP 0x003A
0038 5F4F SUBI R20,0xFF
0039 4F5F SBCI R21,0xFF
003A 1740 CP R20,R16
003B 0751 CPC R21,R17
003C F3D8 BCS 0x0038
(0074) }
003D D320 RCALL pop_gset1
003E 9508 RET
_DelayLong:
l --> R22
i --> R20
j --> R16
003F D332 RCALL push_gset2
(0075)
(0076) //***************************长延时函数************************//
(0077) void DelayLong(uint j)
(0078) {uint i;
(0079) for(i=0;i<j;i++)
0040 2744 CLR R20
0041 2755 CLR R21
0042 C00B RJMP 0x004E
(0080) {uint l;
(0081) for(l=0;l<1000;l++);}
0043 2766 CLR R22
0044 2777 CLR R23
0045 C002 RJMP 0x0048
0046 5F6F SUBI R22,0xFF
0047 4F7F SBCI R23,0xFF
0048 3E68 CPI R22,0xE8
0049 E0E3 LDI R30,3
004A 077E CPC R23,R30
004B F3D0 BCS 0x0046
004C 5F4F SUBI R20,0xFF
004D 4F5F SBCI R21,0xFF
004E 1740 CP R20,R16
004F 0751 CPC R21,R17
0050 F390 BCS 0x0043
(0082) }
0051 D307 RCALL pop_gset2
0052 9508 RET
(0083) //*************************按键扫描函数************************//
(0084) void FunkeyScan()
(0085) {KeyDown=0;
_FunkeyScan:
0053 2422 CLR R2
0054 92200067 STS _KeyDown,R2
(0086) FunkeyNum=3;
0056 E083 LDI R24,3
0057 93800061 STS _FunkeyNum,R24
(0087) if(KEY_0==0)
0059 99C8 SBIC 0x19,0
005A C00B RJMP 0x0066
(0088) {DelayLong(10); //去抖动延时10ms
005B E00A LDI R16,0xA
005C E010 LDI R17,0
005D DFE1 RCALL _DelayLong
(0089) if(KEY_0==0)
005E 99C8 SBIC 0x19,0
005F C006 RJMP 0x0066
(0090) {FunkeyNum=0; //按键的标号变量值赋0
0060 2422 CLR R2
0061 92200061 STS _FunkeyNum,R2
(0091) KeyDown=1;}} //PA0 装票功能键按下
0063 E081 LDI R24,1
0064 93800067 STS _KeyDown,R24
(0092) if(KEY_1==0)
0066 99C9 SBIC 0x19,1
0067 C00A RJMP 0x0072
(0093) {DelayLong(10); //去抖动延时10ms
0068 E00A LDI R16,0xA
0069 E010 LDI R17,0
006A DFD4 RCALL _DelayLong
(0094) if(KEY_1==0)
006B 99C9 SBIC 0x19,1
006C C005 RJMP 0x0072
(0095) {FunkeyNum=1; //按键的标号变量值赋1
006D E081 LDI R24,1
006E 93800061 STS _FunkeyNum,R24
(0096) KeyDown=1;}} //PA1 盖章功能键按下
0070 93800067 STS _KeyDown,R24
(0097) if(KEY_2==0)
0072 99CA SBIC 0x19,2
0073 C00B RJMP 0x007F
(0098) {DelayLong(10); //去抖动延时10ms
0074 E00A LDI R16,0xA
0075 E010 LDI R17,0
0076 DFC8 RCALL _DelayLong
(0099) if(KEY_2==0)
0077 99CA SBIC 0x19,2
0078 C006 RJMP 0x007F
(0100) {FunkeyNum=2; //按键的标号变量值赋2
0079 E082 LDI R24,2
007A 93800061 STS _FunkeyNum,R24
(0101) KeyDown=1;}} //PA2 打码功能键按下
007C E081 LDI R24,1
007D 93800067 STS _KeyDown,R24
(0102) }
007F 9508 RET
(0103) //******************装票步进电机频率函数***********************//
(0104) void PulseZhuangPiao()
(0105) {
(0106) DelayShort(45); //装票步进电机周期45us
_PulseZhuangPiao:
0080 E20D LDI R16,0x2D
0081 E010 LDI R17,0
0082 DFB1 RCALL _DelayShort
(0107) M1_pulse1; //Pc7=1
0083 9AAE SBI 0x15,6
(0108) DelayShort(45); //装票步进电机周期45us
0084 E20D LDI R16,0x2D
0085 E010 LDI R17,0
0086 DFAD RCALL _DelayShort
(0109) M1_pulse0; //Pc7=0
0087 B385 IN R24,0x15
0088 7B8F ANDI R24,0xBF
0089 BB85 OUT 0x15,R24
(0110) }
008A 9508 RET
(0111) //******************翻页步进电机频率函数***********************//
(0112) void PulseXingZou()
(0113) {
(0114) DelayShort(35); //翻页步进电机周期35us
_PulseXingZou:
008B E203 LDI R16,0x23
008C E010 LDI R17,0
008D DFA6 RCALL _DelayShort
(0115) M2_pulse1; //Pc6=1
008E 9AAD SBI 0x15,5
(0116) DelayShort(35); //翻页步进电机周期35us
008F E203 LDI R16,0x23
0090 E010 LDI R17,0
0091 DFA2 RCALL _DelayShort
(0117) M2_pulse0; //Pc6=0
0092 B385 IN R24,0x15
0093 7D8F ANDI R24,0xDF
0094 BB85 OUT 0x15,R24
(0118) }
0095 9508 RET
(0119) //******************字轮步进电机频率函数***********************//
(0120) void PulseZiLun()
(0121) {
(0122) DelayShort(55); //字轮电机周期55us
_PulseZiLun:
0096 E307 LDI R16,0x37
0097 E010 LDI R17,0
0098 DF9B RCALL _DelayShort
(0123) M3_pulse0; //Pc5=0
0099 B385 IN R24,0x15
009A 7E8F ANDI R24,0xEF
009B BB85 OUT 0x15,R24
(0124) DelayShort(55); //字轮电机周期55us
009C E307 LDI R16,0x37
009D E010 LDI R17,0
009E DF95 RCALL _DelayShort
(0125) M3_pulse1; //Pc5=1
009F 9AAC SBI 0x15,4
(0126) }
00A0 9508 RET
(0127) //***************打印数码的电磁击打锤动作函数******************//
(0128) void Print_Act()
(0129) {
(0130) PRINT_ACT1; //打字电磁铁打下
_Print_Act:
00A1 9AA9 SBI 0x15,1
(0131) DelayLong(5); //打字电磁铁打下时间延时20(*1000)us
00A2 E005 LDI R16,5
00A3 E010 LDI R17,0
00A4 DF9A RCALL _DelayLong
(0132) PRINT_ACT0; //打字电磁铁上升
00A5 B385 IN R24,0x15
00A6 7F8D ANDI R24,0xFD
00A7 BB85 OUT 0x15,R24
(0133) DelayLong(20); //打字电磁铁上升时间延时20(*1000)us
00A8 E104 LDI R16,0x14
00A9 E010 LDI R17,0
(0134) }
00AA CF94 RJMP _DelayLong
(0135) //***************盖章的电磁击打锤动作函数**********************//
(0136) void Sign_Act()
(0137) {
(0138) SIGN_ACT1; //盖章电磁铁打下
_Sign_Act:
00AB 9AAA SBI 0x15,2
(0139) DelayLong(20); //盖章电磁铁打下时间延时20(*1000)us
00AC E104 LDI R16,0x14
00AD E010 LDI R17,0
00AE DF90 RCALL _DelayLong
(0140) SIGN_ACT0; //盖章电磁铁打下
00AF B385 IN R24,0x15
00B0 7F8B ANDI R24,0xFB
00B1 BB85 OUT 0x15,R24
(0141) DelayLong(20); //盖章电磁铁上升时间延时20(*1000)us
00B2 E104 LDI R16,0x14
00B3 E010 LDI R17,0
(0142) }
00B4 CF8A RJMP _DelayLong
(0143) //***************翻页电机行走字间距函数************************//
(0144) void Num_Step()
(0145) {
(0146) M_DIR0; //翻页电机反转
_Num_Step:
00B5 B385 IN R24,0x15
00B6 7F87 ANDI R24,0xF7
00B7 BB85 OUT 0x15,R24
(0147) for(u=0;u<40;u++) //翻页电机行走的字间距即步进电机的40步
00B8 2422 CLR R2
00B9 2433 CLR R3
00BA 92300065 STS _u+1,R3
00BC 92200064 STS _u,R2
00BE C00A RJMP 0x00C9
(0148) PulseXingZou();
00BF DFCB RCALL _PulseXingZou
00C0 91800064 LDS R24,_u
00C2 91900065 LDS R25,_u+1
00C4 9601 ADIW R24,1
00C5 93900065 STS _u+1,R25
00C7 93800064 STS _u,R24
00C9 91800064 LDS R24,_u
00CB 91900065 LDS R25,_u+1
00CD 3288 CPI R24,0x28
00CE E0E0 LDI R30,0
00CF 079E CPC R25,R30
00D0 F370 BCS 0x00BF
(0149) }
00D1 9508 RET
_Reverse_Step:
i --> R20
00D2 D288 RCALL push_gset1
(0150) //***************翻页电机行走抓纸张函数************************//
(0151) void Reverse_Step()
(0152) {
(0153) unsigned int i;
(0154) for(i=0;i<350;i++) //居中以后再走100吸纸
00D3 2744 CLR R20
00D4 2755 CLR R21
00D5 C006 RJMP 0x00DC
(0155) {
(0156) M_DIR0; //翻页电机反转
00D6 B385 IN R24,0x15
00D7 7F87 ANDI R24,0xF7
00D8 BB85 OUT 0x15,R24
(0157) PulseXingZou(); //翻页电机驱动脉冲输出
00D9 DFB1 RCALL _PulseXingZou
00DA 5F4F SUBI R20,0xFF
00DB 4F5F SBCI R21,0xFF
00DC 354E CPI R20,0x5E
00DD E0E1 LDI R30,1
00DE 075E CPC R21,R30
00DF F3B0 BCS 0x00D6
(0158) }
(0159) GRASP_ACT1; //机械手抓纸
00E0 9AA8 SBI 0x15,0
00E1 C004 RJMP 0x00E6
(0160) while(SONSOR_5==0) //检测传感器5
(0161) {
(0162) M_DIR0; //翻页电机反转
00E2 B385 IN R24,0x15
00E3 7F87 ANDI R24,0xF7
00E4 BB85 OUT 0x15,R24
(0163) PulseXingZou(); //翻页电机驱动脉冲输出
00E5 DFA5 RCALL _PulseXingZou
00E6 9BB5 SBIS 0x16,5
00E7 CFFA RJMP 0x00E2
(0164) }
(0165) }
00E8 D275 RCALL pop_gset1
00E9 9508 RET
(0166) //***************翻页电机行走上电后复位函数********************//
(0167) void Forward_Step()
(0168) {
_Forward_Step:
00EA C002 RJMP 0x00ED
(0169) while(SONSOR_6==0) //检测传感器6
(0170) {
(0171) M_DIR1; //翻页电机正转
00EB 9AAB SBI 0x15,3
(0172) PulseXingZou(); //翻页电机驱动脉冲输出
00EC DF9E RCALL _PulseXingZou
00ED 9BB6 SBIS 0x16,6
00EE CFFC RJMP 0x00EB
(0173) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -