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

📄 usbd12.s

📁 1.实现单片机驱动USBD12的固件
💻 S
📖 第 1 页 / 共 5 页
字号:
	.module USBD12.C
	.area text(rom, con, rel)
	.dbfile C:/icc/include/AVR_PQ1A.h
	.dbfunc e Delayus _Delayus fV
;              i -> R20,R21
;             US -> R22,R23
	.even
_Delayus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 28
; /*******************************************
;   文件:USBD12.C
;   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
;   硬件:ATMEGA16芯片
;   日期:2006年12月10日 
;   功能:驱动开发板上的USBD12
;   备注:参考《PDIUSBD12USB固件编程与驱动开发》(北航出版社)
; /******************************************/
; #include <iom16v.h>			//包含型号头文件
; #include <macros.h>			//包含"位"操作头文件
; #include <stdio.h>			//标准输入输出头文件
; #include <AVR_PQ1A.h>		//包含自定义常量头文件
; #include "LED.C"
; #include "SKEY.C"
; 
; #pragma interrupt_handler USB_INT1:3//外部中断1中断服务函数声明
; struct flags
; {
; 	uchar bus_reset           	;	//总线复位标志
; 	uchar suspend             	;	//挂起改变标志
; 	uchar setup_packet  	  	;	//收到SETUP包
; 	uchar remote_wakeup			;
; 	uchar in_isr		      	;	//USB中断服务标志
; 	uchar control_state			;	//控制端点处理标志
; 													//0: IDLE	   空闲状态
; 													//1: TRANSMIT  数据发送状态
; 													//2: RECEIVE   数据接收状态
;  	uchar configuration			;	//配置标志(0: 未配置; 1: 已经配置)		
	.dbline 30
; 	uchar ep1_rxdone			;	//端点 1 收到数据标志
; 	uchar ep2_rxdone			;	//端点 2 收到数据标志
	ldi R16,5
	ldi R17,0
	movw R18,R22
	xcall empy16s
	movw R22,R16
	lsr R23
	ror R22
	lsr R23
	ror R22
	.dbline 31
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 31
L3:
	.dbline 31
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 31
; 	uchar ep2buf_full			;	//端点 2 接收双缓冲区满标志
	cp R20,R22
	cpc R21,R23
	brlo L2
	.dbline -2
	.dbline 32
; }USB_FLAG={0,0,0,0,0,0,0,0,0,0};
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r US 22 i
	.dbend
	.dbfunc e Delayms _Delayms fV
;              i -> R20,R21
;              j -> R22,R23
;             MS -> R16,R17
	.even
_Delayms::
	xcall push_gset2
	.dbline -1
	.dbline 40
; typedef struct request
; {
; 	uchar bmRequestType;
; 	uchar bRequest;
; 	uint wValue;
; 	uint wIndex;
; 	uint wLength;
; }DEVICE_REQUEST;
	.dbline 42
; typedef struct xfer
; {
	clr R20
	clr R21
	xjmp L10
L7:
	.dbline 43
	clr R22
	clr R23
	xjmp L14
L11:
	.dbline 43
L12:
	.dbline 43
	subi R22,255  ; offset = 1
	sbci R23,255
L14:
	.dbline 43
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L11
L8:
	.dbline 42
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 42
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
	.dbline 44
; 	DEVICE_REQUEST DeviceRequest;
; 	uint wLength;
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r MS 16 i
	.dbend
	.dbfunc e Board_init _Board_init fV
	.even
_Board_init::
	.dbline -1
	.dbline 52
; 	uint wCount;
; 	uchar * pData;
; 	uchar dataBuffer[MAX_CTLDAT_SIZE];
; }CONTROL_XFER;
; typedef struct _USB_DEVICE_DESCRIPTOR 
; {
;     uchar bLength;
;     uchar bDescriptorType;
	.dbline 53
;     uchar bcdUSB0;
	ldi R24,255
	out 0x1a,R24
	.dbline 54
;     uchar bcdUSB1;
	out 0x17,R24
	.dbline 55
;     uchar bDeviceClass;
	out 0x14,R24
	.dbline 56
;     uchar bDeviceSubClass;
	out 0x11,R24
	.dbline 58
;     uchar bDeviceProtocol;
;     uchar bMaxPacketSize0;
	clr R2
	out 0xd,R2
	.dbline 60
;     uchar idVendor0;
;     uchar idVendor1;
	sbi 0x1b,6
	.dbline 61
;     uchar idProduct0;
	cbi 0x15,6
	.dbline 62
;     uchar idProduct1;
	cbi 0x1b,1
	.dbline 63
;     uchar bcdDevice0;
	out 0x18,R24
	.dbline 64
;     uchar bcdDevice1;
	sbi 0x1b,2
	.dbline 65
;     uchar iManufacturer;
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 66
;     uchar iProduct;
	cbi 0x1b,2
	.dbline 68
;     uchar iSerialNumber;
;     uchar bNumConfigurations;
	clr R2
	out 0x18,R2
	.dbline 69
; } USB_DEVICE_DESCRIPTOR;
	sbi 0x1b,3
	.dbline 70
; /***********  USB  接口描述符结构体  ****************/
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 71
; typedef struct _USB_INTERFACE_DESCRIPTOR 
	cbi 0x1b,3
	.dbline 73
; {
;     uchar bLength;
	ldi R24,255
	out 0x18,R24
	.dbline 74
;     uchar bDescriptorType;
	sbi 0x1b,4
	.dbline 75
;     uchar bInterfaceNumber;
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 76
;     uchar bAlternateSetting;
	cbi 0x1b,4
	.dbline 78
;     uchar bNumEndpoints;
;     uchar bInterfaceClass;
	ldi R24,255
	out 0x12,R24
	.dbline 79
;     uchar bInterfaceSubClass;
	sbi 0x1b,7
	.dbline 80
;     uchar bInterfaceProtocol;
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 81
;     uchar iInterface;
	cbi 0x1b,7
	.dbline -2
	.dbline 84
; } USB_INTERFACE_DESCRIPTOR;
; /***********  USB  配置描述符结构体  ****************/
; typedef struct _USB_CONFIGURATION_DESCRIPTOR 
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/LED.C
	.dbfunc e One_led _One_led fV
;              i -> <dead>
;          light -> R22
;         number -> R20
	.even
_One_led::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 21
	.dbline 22
	cpi R22,1
	brne L17
	.dbline 23
	.dbline 24
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R16
	com R2
	in R3,0x18
	and R3,R2
	out 0x18,R3
	.dbline 25
	sbi 0x1b,2
	.dbline 26
	ldi R16,5
	ldi R17,0
	xcall _Delayms
	.dbline 27
	cbi 0x1b,2
	.dbline 28
	xjmp L18
L17:
	.dbline 30
	.dbline 31
	ldi R16,1
	mov R17,R20
	xcall lsl8
	in R2,0x18
	or R2,R16
	out 0x18,R2
	.dbline 32
	sbi 0x1b,2
	.dbline 33
	ldi R16,5
	ldi R17,0
	xcall _Delayms
	.dbline 34
	cbi 0x1b,2
	.dbline 35
L18:
	.dbline -2
	.dbline 36
L16:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l i 1 c
	.dbsym r light 22 c
	.dbsym r number 20 c
	.dbend
	.dbfunc e All_led _All_led fV
;          light -> R20
	.even
_All_led::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 44
	.dbline 45
	tst R20
	breq L20
	.dbline 46
	.dbline 47
	in R24,0x18
	andi R24,0
	out 0x18,R24
	.dbline 48
	sbi 0x1b,2
	.dbline 49
	ldi R16,5
	ldi R17,0
	xcall _Delayms
	.dbline 50
	cbi 0x1b,2
	.dbline 51
	xjmp L21
L20:
	.dbline 53
	.dbline 54
	in R24,0x18
	ori R24,255
	out 0x18,R24
	.dbline 55
	sbi 0x1b,2
	.dbline 56
	ldi R16,5
	ldi R17,0
	xcall _Delayms
	.dbline 57
	cbi 0x1b,2
	.dbline 58
L21:
	.dbline -2
	.dbline 59
L19:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r light 20 c
	.dbend
	.dbfunc e Flow_LED _Flow_LED fV
;              i -> R20
;             MS -> R22
	.even
_Flow_LED::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 67
	.dbline 69
	clr R20
	xjmp L26
L23:
	.dbline 70
	.dbline 71
	clr R16
	xcall _All_led
	.dbline 72
	ldi R18,1
	mov R16,R20
	xcall _One_led
	.dbline 73
	mov R16,R22
	clr R17
	xcall _Delayms
	.dbline 74
L24:
	.dbline 69
	inc R20
L26:
	.dbline 69
	cpi R20,8
	brlo L23
	.dbline -2
	.dbline 75
L22:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r MS 22 c
	.dbend
	.dbfunc e Flash_LED _Flash_LED fV
;             MS -> R22
;         number -> R20
	.even
_Flash_LED::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 84
	.dbline 85
; {
	ldi R18,1
	mov R16,R20
	xcall _One_led
	.dbline 86
;     uchar bLength;
	mov R16,R22
	clr R17
	xcall _Delayms
	.dbline 87
;     uchar bDescriptorType;
	clr R16
	xcall _All_led
	.dbline 88
;     uchar wTotalLength0;
	mov R16,R22
	clr R17
	xcall _Delayms
	.dbline 89
;     uchar wTotalLength1;
	clr R18
	mov R16,R20
	xcall _One_led
	.dbline -2
	.dbline 90
;     uchar bNumInterfaces;
L27:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r MS 22 c
	.dbsym r number 20 c
	.dbend
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.dbfunc e Skey_press _Skey_press fc
;        pressed -> R16
	.even
_Skey_press::
	.dbline -1
	.dbline 20
	.dbline 22
	ldi R24,255
	out 0x11,R24
	.dbline 23
	in R24,0x12
	ori R24,15
	out 0x12,R24
	.dbline 24
	ldi R24,240
	out 0x11,R24
	.dbline 25
	in R24,0x10
	andi R24,15
	cpi R24,15
	breq L29
	.dbline 26
	ldi R16,1
	xjmp L30
L29:
	.dbline 28
	clr R16
L30:
	.dbline 29
	ldi R24,255
	out 0x11,R24
	.dbline 30
	.dbline -2
L28:
	.dbline 0 ; func end
	ret
	.dbsym r pressed 16 c
	.dbend
	.dbfunc e Skey_scan _Skey_scan fc
;        keycode -> R20
	.even
_Skey_scan::
	xcall push_gset2
	.dbline -1
	.dbline 39
	.dbline 40
	ldi R20,255
	.dbline 41
	ldi R16,15
	ldi R17,0
	xcall _Delayms
	.dbline 42
	xcall _Skey_press
	cpi R16,1
	brne L32
	.dbline 43
	.dbline 44
	ldi R24,240
	out 0x11,R24
	.dbline 45
	in R20,0x10
	.dbline 46
	andi R20,15
	.dbline 47
	mov R22,R20
	clr R23
	cpi R22,7
	ldi R30,0
	cpc R23,R30
	breq L40
	cpi R22,11
	ldi R30,0
	cpc R23,R30
	breq L39
	cpi R22,13
	ldi R30,0
	cpc R23,R30
	breq L38
	cpi R22,14
	ldi R30,0
	cpc R23,R30
	breq L37
	xjmp L34
X0:
	.dbline 48
L37:
	.dbline 50
	clr R20
	.dbline 51
	xjmp L35
L38:
	.dbline 53
	ldi R20,1
	.dbline 54
	xjmp L35
L39:
	.dbline 56
	ldi R20,2
	.dbline 57
	xjmp L35
L40:
	.dbline 59
	ldi R20,3
	.dbline 60
	xjmp L35
L34:
	.dbline 62
	clr R20
	.dbline 63
L35:
L41:
	.dbline 65
	.dbline 66
L42:
	.dbline 66
	xcall _Skey_press
	cpi R16,1
	breq L41
	.dbline 67
L32:
	.dbline 68
	mov R16,R20
	.dbline -2
L31:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r keycode 20 c
	.dbend
	.area vector(rom, abs)
	.org 8
	jmp _USB_INT1
	.area text(rom, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
_USB_FLAG::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB/SKEY.C
	.blkb 1
	.area idata

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -