⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 work.s

📁 AVRkaifashili.rar
💻 S
📖 第 1 页 / 共 3 页
字号:
	.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 + -