📄 work.s
字号:
.module work.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第七章\第七章工程\work.c
.dbfunc e IO_Init _IO_Init fV
.even
_IO_Init::
.dbline -1
.dbline 54
; //**********************FileName:Work.c**************************//
; //**********************ICCAVR6.30编译****************************//
; #include <io8535v.h>
; #include <macros.h>
; #define uchar unsigned char
; #define uint unsigned int
;
; //引脚信号定义
; #define KEY_0 (PINA&0x01) //PA0装票键
; #define KEY_1 (PINA&0x02) //PA1打印页码键
; #define KEY_2 (PINA&0x04) //PA2盖章键
;
; #define SONSOR_0 (PINB&0x01) //PB0前传感器
; #define SONSOR_1 (PINB&0x02) //PB1中传感器
; #define SONSOR_2 (PINB&0x04) //PB2后传感器
; #define SONSOR_3 (PINB&0x08) //PB3纸传感器
; #define SONSOR_4 (PINB&0x10) //PB4字轮传感器
; #define SONSOR_5 (PINB&0x20) //PB5行走左传感器
; #define SONSOR_6 (PINB&0x40) //PB6行走右传感器
;
; #define SIGN_ON1 (PORTD=PORTD|0x01) //PD0=1盖章工作指示灯输出
; #define SIGN_ON0 (PORTD=PORTD&0xfe) //PD0=0盖章工作指示灯输出
; #define SIGN_OFF1 (PORTD=PORTD|0x02) //PD1=1盖章结束指示灯输出管脚
; #define SIGN_OFF0 (PORTD=PORTD&0xfd) //PD1=0盖章结束指示灯输出管脚
; #define PRINT_ON1 (PORTD=PORTD|0x08) //PD3=1打印页码工作指示灯输出管脚
; #define PRINT_ON0 (PORTD=PORTD&0xf7) //PD3=0打印页码工作指示灯输出管脚
; #define PRINT_OFF1 (PORTD=PORTD|0x10) //PD4=1打印页码结束指示灯输出管脚
; #define PRINT_OFF0 (PORTD=PORTD&0xef) //PD4=1打印页码结束指示灯输出管脚
;
; #define GRASP_ACT1 (PORTC=PORTC|0x01) //PC0抓纸机械手输出管脚
; #define GRASP_ACT0 (PORTC=PORTC&0xfe) //PC0抓纸机械手输出管脚
; #define PRINT_ACT1 (PORTC=PORTC|0x02) //PC1字轮击打电磁铁输出管脚
; #define PRINT_ACT0 (PORTC=PORTC&0xfd) //PC1字轮击打电磁铁输出管脚
; #define SIGN_ACT1 (PORTC=PORTC|0x04) //PC2盖章击打电磁铁输出管脚
; #define SIGN_ACT0 (PORTC=PORTC&0xfb) //PC2盖章击打电磁铁输出管脚
; #define M_DIR1 (PORTC=PORTC|0x08) //PC3电机方向输出管脚
; #define M_DIR0 (PORTC=PORTC&0xf7) //PC3电机方向输出管脚
; #define M3_pulse1 (PORTC=PORTC|0x10) //PC4字轮电机脉冲输出管脚
; #define M3_pulse0 (PORTC=PORTC&0xef) //PC4字轮电机脉冲输出管脚
; #define M2_pulse1 (PORTC=PORTC|0x20) //PC5行走电机脉冲输出管脚
; #define M2_pulse0 (PORTC=PORTC&0xdf) //PC5行走电机脉冲输出管脚
; #define M1_pulse1 (PORTC=PORTC|0x40) //PC6装票电机脉冲输出管脚
; #define M1_pulse0 (PORTC=PORTC&0xbf) //PC6装票电机脉冲输出管脚
;
; uchar KeyDown; //有功能键按下标志
; uchar Cancell; //取消功能键标志
; uint u; //翻页步进电机的步数变量
; uint b; //页码序号的不同位数之间差值的中间变量
; uchar FunkeyNum;//功能按键的标号变量
; uchar R_Step; //页码序号之间的距离(数字间距)所需的步进电机的步数
;
; //*****************I/O口初始化*****************************
; void IO_Init(void)
; {DDRA=0x00;//A口三态输入
.dbline 54
clr R2
out 0x1a,R2
.dbline 55
; PORTA=0x00;
out 0x1b,R2
.dbline 56
; DDRB=0x00;//B口三态输入
out 0x17,R2
.dbline 57
; PORTB=0x00;
out 0x18,R2
.dbline 58
; DDRC=0xff;//C口推挽输出
ldi R24,255
out 0x14,R24
.dbline 59
; PORTC=0xff;
out 0x15,R24
.dbline 60
; DDRD=0xfb;//D口推挽输出,PD2中断输入
ldi R24,251
out 0x11,R24
.dbline 61
; PORTD=0xfb;
out 0x12,R24
.dbline -2
.dbline 62
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e INT_Init _INT_Init fV
.even
_INT_Init::
.dbline -1
.dbline 65
; //*************************中断初始化函数************************//
; void INT_Init(void)
; {MCUCR=MCUCR&0xfd;//低电平中断
.dbline 65
in R24,0x35
andi R24,253
out 0x35,R24
.dbline 66
; GIMSK=GIMSK|0x40;//INT0中断使能
in R24,0x3b
ori R24,64
out 0x3b,R24
.dbline 67
; SREG=SREG|0x80;//全局中断使能
bset 7
.dbline -2
.dbline 68
; }
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e DelayShort _DelayShort fV
; i -> R20,R21
; j -> R16,R17
.even
_DelayShort::
rcall push_gset1
.dbline -1
.dbline 72
;
; //***************************短延时函数************************//
; void DelayShort(uint j)
; {uint i;
.dbline 73
clr R20
clr R21
rjmp L7
L4:
.dbline 73
L5:
.dbline 73
subi R20,255 ; offset = 1
sbci R21,255
L7:
.dbline 73
; for(i=0;i<j;i++) ;
cp R20,R16
cpc R21,R17
brlo L4
.dbline -2
.dbline 74
; }
L3:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 16 i
.dbend
.dbfunc e DelayLong _DelayLong fV
; l -> R22,R23
; i -> R20,R21
; j -> R16,R17
.even
_DelayLong::
rcall push_gset2
.dbline -1
.dbline 78
;
; //***************************长延时函数************************//
; void DelayLong(uint j)
; {uint i;
.dbline 79
; for(i=0;i<j;i++)
clr R20
clr R21
rjmp L12
L9:
.dbline 80
; {uint l;
.dbline 81
clr R22
clr R23
rjmp L16
L13:
.dbline 81
L14:
.dbline 81
subi R22,255 ; offset = 1
sbci R23,255
L16:
.dbline 81
cpi R22,232
ldi R30,3
cpc R23,R30
brlo L13
.dbline 81
L10:
.dbline 79
subi R20,255 ; offset = 1
sbci R21,255
L12:
.dbline 79
cp R20,R16
cpc R21,R17
brlo L9
.dbline -2
.dbline 82
; for(l=0;l<1000;l++);}
; }
L8:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r l 22 i
.dbsym r i 20 i
.dbsym r j 16 i
.dbend
.dbfunc e FunkeyScan _FunkeyScan fV
.even
_FunkeyScan::
.dbline -1
.dbline 85
; //*************************按键扫描函数************************//
; void FunkeyScan()
; {KeyDown=0;
.dbline 85
clr R2
sts _KeyDown,R2
.dbline 86
; FunkeyNum=3;
ldi R24,3
sts _FunkeyNum,R24
.dbline 87
; if(KEY_0==0)
sbic 0x19,0
rjmp L18
.dbline 88
; {DelayLong(10); //去抖动延时10ms
.dbline 88
ldi R16,10
ldi R17,0
rcall _DelayLong
.dbline 89
; if(KEY_0==0)
sbic 0x19,0
rjmp L20
.dbline 90
; {FunkeyNum=0; //按键的标号变量值赋0
.dbline 90
clr R2
sts _FunkeyNum,R2
.dbline 91
ldi R24,1
sts _KeyDown,R24
.dbline 91
L20:
.dbline 91
; KeyDown=1;}} //PA0 装票功能键按下
L18:
.dbline 92
; if(KEY_1==0)
sbic 0x19,1
rjmp L22
.dbline 93
; {DelayLong(10); //去抖动延时10ms
.dbline 93
ldi R16,10
ldi R17,0
rcall _DelayLong
.dbline 94
; if(KEY_1==0)
sbic 0x19,1
rjmp L24
.dbline 95
; {FunkeyNum=1; //按键的标号变量值赋1
.dbline 95
ldi R24,1
sts _FunkeyNum,R24
.dbline 96
sts _KeyDown,R24
.dbline 96
L24:
.dbline 96
; KeyDown=1;}} //PA1 盖章功能键按下
L22:
.dbline 97
; if(KEY_2==0)
sbic 0x19,2
rjmp L26
.dbline 98
; {DelayLong(10); //去抖动延时10ms
.dbline 98
ldi R16,10
ldi R17,0
rcall _DelayLong
.dbline 99
; if(KEY_2==0)
sbic 0x19,2
rjmp L28
.dbline 100
; {FunkeyNum=2; //按键的标号变量值赋2
.dbline 100
ldi R24,2
sts _FunkeyNum,R24
.dbline 101
ldi R24,1
sts _KeyDown,R24
.dbline 101
L28:
.dbline 101
L26:
.dbline -2
.dbline 102
; KeyDown=1;}} //PA2 打码功能键按下
; }
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e PulseZhuangPiao _PulseZhuangPiao fV
.even
_PulseZhuangPiao::
.dbline -1
.dbline 105
; //******************装票步进电机频率函数***********************//
; void PulseZhuangPiao()
; {
.dbline 106
; DelayShort(45); //装票步进电机周期45us
ldi R16,45
ldi R17,0
rcall _DelayShort
.dbline 107
; M1_pulse1; //Pc7=1
sbi 0x15,6
.dbline 108
; DelayShort(45); //装票步进电机周期45us
ldi R16,45
ldi R17,0
rcall _DelayShort
.dbline 109
; M1_pulse0; //Pc7=0
in R24,0x15
andi R24,191
out 0x15,R24
.dbline -2
.dbline 110
; }
L30:
.dbline 0 ; func end
ret
.dbend
.dbfunc e PulseXingZou _PulseXingZou fV
.even
_PulseXingZou::
.dbline -1
.dbline 113
; //******************翻页步进电机频率函数***********************//
; void PulseXingZou()
; {
.dbline 114
; DelayShort(35); //翻页步进电机周期35us
ldi R16,35
ldi R17,0
rcall _DelayShort
.dbline 115
; M2_pulse1; //Pc6=1
sbi 0x15,5
.dbline 116
; DelayShort(35); //翻页步进电机周期35us
ldi R16,35
ldi R17,0
rcall _DelayShort
.dbline 117
; M2_pulse0; //Pc6=0
in R24,0x15
andi R24,223
out 0x15,R24
.dbline -2
.dbline 118
; }
L31:
.dbline 0 ; func end
ret
.dbend
.dbfunc e PulseZiLun _PulseZiLun fV
.even
_PulseZiLun::
.dbline -1
.dbline 121
; //******************字轮步进电机频率函数***********************//
; void PulseZiLun()
; {
.dbline 122
; DelayShort(55); //字轮电机周期55us
ldi R16,55
ldi R17,0
rcall _DelayShort
.dbline 123
; M3_pulse0; //Pc5=0
in R24,0x15
andi R24,239
out 0x15,R24
.dbline 124
; DelayShort(55); //字轮电机周期55us
ldi R16,55
ldi R17,0
rcall _DelayShort
.dbline 125
; M3_pulse1; //Pc5=1
sbi 0x15,4
.dbline -2
.dbline 126
; }
L32:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Print_Act _Print_Act fV
.even
_Print_Act::
.dbline -1
.dbline 129
; //***************打印数码的电磁击打锤动作函数******************//
; void Print_Act()
; {
.dbline 130
; PRINT_ACT1; //打字电磁铁打下
sbi 0x15,1
.dbline 131
; DelayLong(5); //打字电磁铁打下时间延时20(*1000)us
ldi R16,5
ldi R17,0
rcall _DelayLong
.dbline 132
; PRINT_ACT0; //打字电磁铁上升
in R24,0x15
andi R24,253
out 0x15,R24
.dbline 133
; DelayLong(20); //打字电磁铁上升时间延时20(*1000)us
ldi R16,20
ldi R17,0
.dbline -2
.dbline 134
; }
L33:
.dbline 0 ; func end
rjmp _DelayLong
.dbend
.dbfunc e Sign_Act _Sign_Act fV
.even
_Sign_Act::
.dbline -1
.dbline 137
; //***************盖章的电磁击打锤动作函数**********************//
; void Sign_Act()
; {
.dbline 138
; SIGN_ACT1; //盖章电磁铁打下
sbi 0x15,2
.dbline 139
; DelayLong(20); //盖章电磁铁打下时间延时20(*1000)us
ldi R16,20
ldi R17,0
rcall _DelayLong
.dbline 140
; SIGN_ACT0; //盖章电磁铁打下
in R24,0x15
andi R24,251
out 0x15,R24
.dbline 141
; DelayLong(20); //盖章电磁铁上升时间延时20(*1000)us
ldi R16,20
ldi R17,0
.dbline -2
.dbline 142
; }
L34:
.dbline 0 ; func end
rjmp _DelayLong
.dbend
.dbfunc e Num_Step _Num_Step fV
.even
_Num_Step::
.dbline -1
.dbline 145
; //***************翻页电机行走字间距函数************************//
; void Num_Step()
; {
.dbline 146
; M_DIR0; //翻页电机反转
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 147
; for(u=0;u<40;u++) //翻页电机行走的字间距即步进电机的40步
clr R2
clr R3
sts _u+1,R3
sts _u,R2
rjmp L39
L36:
.dbline 148
rcall _PulseXingZou
L37:
.dbline 147
lds R24,_u
lds R25,_u+1
adiw R24,1
sts _u+1,R25
sts _u,R24
L39:
.dbline 147
lds R24,_u
lds R25,_u+1
cpi R24,40
ldi R30,0
cpc R25,R30
brlo L36
.dbline -2
.dbline 149
; PulseXingZou();
; }
L35:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Reverse_Step _Reverse_Step fV
; i -> R20,R21
.even
_Reverse_Step::
rcall push_gset1
.dbline -1
.dbline 152
; //***************翻页电机行走抓纸张函数************************//
; void Reverse_Step()
; {
.dbline 154
; unsigned int i;
; for(i=0;i<350;i++) //居中以后再走100吸纸
clr R20
clr R21
rjmp L44
L41:
.dbline 155
.dbline 156
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 157
rcall _PulseXingZou
.dbline 158
L42:
.dbline 154
subi R20,255 ; offset = 1
sbci R21,255
L44:
.dbline 154
cpi R20,94
ldi R30,1
cpc R21,R30
brlo L41
.dbline 159
; {
; M_DIR0; //翻页电机反转
; PulseXingZou(); //翻页电机驱动脉冲输出
; }
; GRASP_ACT1; //机械手抓纸
sbi 0x15,0
rjmp L46
L45:
.dbline 161
.dbline 162
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 163
rcall _PulseXingZou
.dbline 164
L46:
.dbline 160
; while(SONSOR_5==0) //检测传感器5
sbis 0x16,5
rjmp L45
.dbline -2
.dbline 165
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -