?? wwork.s
字號:
.module wwork.c
.area text(rom, con, rel)
.dbfile E:\張軍\AVR\光盤內容\實例源文件\第七章工程\wwork.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 + -