微机原理课程设计 电子琴设计_第1页
微机原理课程设计 电子琴设计_第2页
微机原理课程设计 电子琴设计_第3页
微机原理课程设计 电子琴设计_第4页
微机原理课程设计 电子琴设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计任务书学生姓名: 郑舟 专业班级: 自动化0808 指导教师: 徐小强 工作单位: 自动化 题 目: 电子琴软件设计初始条件:用汇编语言设计一个电子琴,在屏幕上显示出来,界面要美观,功能上模拟现实电子琴功能。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1实现弹奏功或演奏。其中弹奏:用户每按一琴键弹奏相应音符;演奏:按下某键后自动弹奏预存琴谱功能;还可以附加变调功能。2界面要美观。3撰写符合学校要求的课程设计说明书,内容包括:摘要、目录、正文、参考文献、附录(程序清单)。正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程

2、序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。时间安排:1. 1月08日-1月10日 查阅资料及方案设计2. 1月11日-1月13日 编程3. 1月14日-1月16日 调试程序4. 1月17日-1月18日 撰写课程设计报告5. 1月19日 上午准备答辩,下午正式答辩指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录摘 要11 设计任务及要求22 工作原理22.1 8253简介32.28255简介43设计思路43.1程序功能描述43.2程序流程图53.3DOS/BIOS功能调用6INT 16H(键盘I/O中断)6INT 10H(屏幕及显示器中断)73.3.3

3、 INT 21H(DOS系统功能调用)84方案比较及论证85 程序源代码及注释86 运行结果分析117 调试过程记录128 课程设计小结13参考文献14附录15电子琴软件设计摘 要本文通过8255和8253来实现电子琴模拟,主要可以分成两部分,分别为输入部分和发音部分。输入部分主要是由8255和8个常开型开关来完成。发音部分由CUP通过对定时器8253的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。本文用到的是8253的方式3方波发生器。在程序设计中,为了避免过于频繁的调用中断显示字符串,应用了宏定义;还通过子程序

4、调用,有效的解决了跳转和转移过多的问题;再加上合理的DOS和BIOS功能调用,以及各种指令的综合,最终作出了漂亮的电子琴界面,并实现了电子琴演奏高、中、低音,以及播放预存乐曲的功能。关键词:电子琴 8253定时器 8255 DOS调用 宏定义 1 设计任务及要求初始条件:用汇编语言设计一个电子琴,在屏幕上显示出来,界面要美观,功能上模拟现实电子琴功能。要求完成的主要任务:1实现弹奏功或演奏。其中弹奏:用户每按一琴键弹奏相应音符;演奏:按下某键后自动弹奏预存琴谱功能;还可以附加变调2界面要美观。2 工作原理PC机扬声器电路以及相关接口电路如图2-1。图2-1 PC机扬声器电路及相关接口电路通过8

5、255和8253来实现电子琴模拟,主要可以分成两部分,分别为输入部分和发音部分。输入部分:主要是由8255和8个常开型开关来完成。 发音部分:CUP通过对定时器的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。 当通道2用于发声时,采用的是方式3,在方式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。从定时器输出的方波信号,经功率放大和滤波后驱动扬声器。送到扬声器的信号还受到了从并行接口芯片8255(端口地址为61H)来的双重控制,端口61H的最低位控制通道2的门控开断,以产生特

6、殊的音频信号,端口61H的PB1位和定时器的输出信号同时作为与门的输入,PB0和PB1位可由程序决定为0还是为1。显然只有PB0和PB1都是1时,才能使扬声器发出声音。控制音长的时间可以简单地通过反复执行指令来得到。2.1 8253简介8253芯片是常用的可编程计数器,在微机中有着极其重要的作用。常用于事件计数器,单稳态触发器,分频器,方波发生器,硬件触发的单脉冲发生器等。计数器/定时器8253包括3个独立的16位计数器通道,而每个计数器都有6种工作方式,可以按二进制或十进制(BCD码)进行计数。本文用到的是8253的方式3方波发生器来实现了简易电子琴的设计。8253的方式控制字如图2-2所示

7、。图2-2 8253的方式控制字8253的工作方式3方波发生器:它的特点是:(1)输出为周期性的方波。若计数值为N,则输出方波的周期是N个CLK脉冲的宽度。(2)写入控制字后,输出将变为高电平,当写入计数初值后,就开始计数,输出仍为高电平;当计数到初值的一半时,输出变为低电平,直至计数到0,输出又变为高电平,重新开始计数。(3)若计数值为偶数,则输出对称方波;如果计数值为奇数,则前(N+1)/2个CLK脉冲期间输出为高电平,后(N-1)/2个CLK脉冲期间输出为低电平。(4)GATE信号能使计数过程重新开始,GATE=1允许计数,GATE=0禁止计数。停止后OUT将立即变高电平,当GATE再次

8、变高以后,计数器将自动装入计数初值,重新开始计数。2.2 8255简介按功能可把8255分为三个逻辑电路部分,即:口电路、总线接口电路和控制逻辑电路。8255共有三个8位口,其中A口和B口是单纯的数据口,供数据I/O使用。而C口则既可以作数据口,又可以作控制口使用,用于实现A口和B口的控制功能。8255A的方式控制字如图2-3所示。图2-3 8255A的方式控制字3设计思路3.1 程序功能描述程序开始,显示电子琴界面和提示信息,对缓存区初始化。按键扫描,接着调用发音子程序把al送缓存区,发出与按键相对应频率的声音,从而实现计算机钢琴功能:键盘按键“q、w、e、r、t、y、u”实现音调的高音输入

9、;键盘按键“a、s、d、f、g、h、j”实现音调的中音输入;键盘按键“z、x、c、v、b、n、m”实现音调的低音输入。不停地对Esc键进行扫描,当Esc键按下时,就退出程序;当按下p时,播放预存音乐;当检测到Enter键时,退出到计算机钢琴演奏状态。3.2 程序流程图程序流程图如图3-1所示。图3-1 程序流程图3.3 DOS/BIOS功能调用DOS操作系统为程序设计者提供了可以直接调用的软中断处理程序,每一个中断处理程序完成一个特定的功能操作。依据编程需要选择适当的处理程序,编程者不需再重新编写程序,而是使用INT n软中断指令。每执行一种不同类型码n的软中断指令,就执行一个中断处理程序,其

10、主要功能如下: (1) 磁盘的读/写控制。 (2)内存管理、文件操作和目录管理。 (3)基本输入/输出(对键盘、打印机和显示器等)控制,另外还有日期、时间管理等。BIOS是固化在只读存储器ROM中的一系列输入/输出服务程序,它存放于内存的高地址区域内,除负责处理系统中的全部内部中断外,还提供对主要I/O接口的控制功能,如键盘、显示器、磁盘、打印、日期与时间等。BIOS采用模块化结构,每个功能模块的入口地址都存于中断向量表中。对这些中断调用是通过软中断指令INT n来实现的,中断指令中的操作数n即为中断类型码。 BIOS的调用方法与DOS系统功能调用方法类似: (1)置功能号于AH中。

11、 (2)置入口参数。 (3)执行INT n 。 (4)分析出口参数及状态。下面介绍程序中将要用到的一下DOS/BIOS功能调用:3.3.1 INT 16H(键盘I/O中断)1. 功能号:00H功能:从键盘读入ASCII字符,放在AL中入口参数:AH=00H2. 功能号:01H功能:测试有无键被按下入口参数:AH=01H3.3.2 INT 10H(屏幕及显示器中断)1. 功能号:00H功能:设置显示模式入口参数:AH=00H  AL=显示模式2. 功能号:02H 功能:用文本坐标下设置光标位置 入口参数: AH02H      

12、;     BH显示页码           DH行(Y坐标)           DL列(X坐标) 3. 功能号:09H 功能:在当前光标处按指定属性显示字符 入口参数:AH09H          AL字符     

13、     BH显示页码          BL属性(文本模式)或颜色(图形模式)          CX重复输出字符的次数 4. 功能号:0BH 功能:设置调色板、背景色或边框 入口参数:AH0BH设置颜色:BH00H,BL颜色选择调色板:BH01H,BL调色板(320×200、4种颜色的图形模式) 。5. 功能号:0CH 功能:写图形象素 入口参数:AH0CH

14、60;         AL象素值          BH页码          (CX、DX)图形坐标列(X)、行(Y) 3.3.3 INT 21H(DOS系统功能调用)功能号:4CH功能:退出系统,返回DOS入口参数:AH=4CH4 方案比较及论证在程序设计的过程中,遇到了很多问题,总结起来有以下几点:问题1:要显示的字符串过多,但又

15、不想重复写代码原因:过于频繁的调用中断显示字符串,导致程序过于庞大和复杂,可读性差。解决办法:解决这种问题的最好方法是直接把显示部分写成子过程,但是子过程在递参数的时候不方便,所以就用宏定义,宏定义可以很方便的传递参数,不仅使得程序美观好看,而且可读性好,程序代码紧凑。问题2:寄存器不够用原因:使用了太多的寄存器,AX、BX、CX、DX。解决办法:使用外部变量定义,定义外部变量的方法为:变量名数据类型 ?问题3:跳转,转移指令跳出的范围太大,编译出现错误原因:程序结构过于复杂,庞大。解决办法:使用过程,也就是子程序设计,直接把一个要频繁要用到的函数打包成一个子过程,然后用CALL调用子过程就可

16、以了,这样就可以避免使用跳转和转移指令了。5 程序源代码及注释主程序如下(宏定义及子程序见附录):data segment;-进度条字符-st_load db 10 ;起始行 db 4 ;起始列 db 0bh ;字体颜色 db 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII' db 00;-字符定义-start_col db ? ;存储起始行text db 14 ;起始行 db 2 ;起始列 db 0fh ;字体颜色 db 'piano - AUTOMATION 0808 _',0ffh,0ffh ;显示字 db ' HAVE A

17、GOOD TIME!',0ffh ;以0ffh来判断是否换行 db ' -1-2-3-4-5-6-7-',0ffh db 'H q w e r t y u p: play',0ffh db 'M a s d f g h j enter: stop',0ffh db 'L z x c v b n m Esc: exit',0ffh db ' 1/2: speed down/up',0ffh db 00;-白色琴键坐标-st_lx dw 50,61,72,83,94,105,116 ;起点横坐标 dw 127,

18、138,149,160,171,182,193 dw 204,215,226,237,248,259,270st_y dw 50 ;起点纵坐标ed_lx dw 60,71,82,93,104,115,126 ;终点横坐标 dw 137,148,159,170,181,192,203 dw 214,225,236,247,258,269,280ed_y dw 90 ;终点纵坐标;-黑色琴键坐标-bt_x dw 57,68,90,101,112 ;起点横坐标 dw 134,145,167,178,189 dw 211,222,244,254,265bt_y dw 50 ;起点纵坐标bd_x dw

19、64,75,97,108,119 ;终点横坐标 dw 141,152,174,185,196 dw 218,229,251,262,273bd_y dw 70 ;终点纵坐标;-音乐频率值-tune dw 220,247,278,294,330,371,416 ;低音 dw 441,495,556,589,661,742,833 ;中音 dw 882,990,1112,1178,1322,1484,1655 ;高音 soundcolor dw 0 ;音色缓存,用于改变播放或弹奏时琴上音响和琴面上点阵的颜色 key_tune dw 0 ;按键状态缓存,用于判断是否有手动按键,1为有,0为无keyn

20、um dw 1 ;按键编号缓存,用于提取对应的按键位置 delay_time dw 7000 ;延时缓存,用于播放时存入bx中来计数;-自动演奏的歌曲频率和延时-卡农轻快改编版-mus_freq dw 1112,990,882,833,742,661,742,833 ;声音频率部分 dw 882,833,742,661,589,556,589,495 dw 882,833,882,441,416,661,556,589,441,882,833,742,833,1113,1322,1484 dw 1178,1112,990,1178,1178,1112,882,833,742,661,589,5

21、56,495,589,556,495 dw 441,495,556,589,661,495,661,589,556,742,661,589,661,589,556,495 dw 441,371,742,833,882,833,742,661,589,556,495,742,661,742,661,589 dw 556,1112,990,882,990,882,1112,990,1178 dw 1322,1112,1178,1322,1112,1178,1322,661,742,833,882,990,1112,1178 dw 1112,882,990,1112,556,589,661,742,

22、661,589,661,556,589,661 dw 589,742,661,589,556,495,556,495,441,495,556,589,661,742 dw 589,742,661,742,833,882,661,742,833,882,990,1112,1178,1322 dw 1112,882,990,1112,990,882,990,833,882,990,1112,990,882,833 dw 882,742,833,882,441,495,556,589,556,495,556,882,833,882 dw 742,882,833,742,661,589,661,589

23、,556,589,661,742,833,882 dw 742,882,833,882,833,742,833,882,990,882,833,882,742,883 dw 1112,556,589,556,495,990,1112,990,882,556,441,742,661,330,294,330 dw 371,742,833,742,833,330,294,330,371,742,661,742,833,833,742,833 dw 441,882,990,880,833,416,441,416,371,742,661,742,833,416,556,495 dw 441,882,99

24、0,1178,1112,556,661,1112,882,1178,1112,1178,990,661,589,661 dw 556,882,833,882,556,661,661,742,883,661 dw 556,882,1112,1178,882,1112,1112,990,882,833 dw 742,742,661,742,833,882,1112,990,882,1178 dw 1322,1178,1112,990,1112,990,882,833,882,833,742,661,742,661,589,556 dw 589,589,495,441 dw 441 dw -1 ;以

25、后以-1来判断是否结束;-声音节拍部分,32为一拍-mus_time dw 16 dup(32),64 dup(8) dw 16,16,32,32,32,16,16,16,16 dw 8 dup(8,4,4,8,4,4,8 dup(4) dw 64 dup(8) dw 6 dup(8,4,4,8,8) dw 20 dup(8),32 data ends;*代码段*code segment assume ds:data,cs:code;-主程序-;-依次调用:开场效果-初始化-键盘扫描-按键处理程序-main proc farstart: call show_load ;调用进度条显示程序;-延

26、时20*waitf- push bx mov bx,20del: call waitf dec bx jnz del pop bx;-重新开始- restart: ;自动播放音乐时,按enter键或音乐完全结束后会返回这里 call init;调用初始化程序new_scan: ;键盘扫描程序没有检测到功能键被按下时,会返回这里 call scan_key ;调用键盘扫描程序,扫描所按下的键;-按键处理- call do_key;-重新扫描- jmp new_scan ;重新扫描有无键按下,直到按下esc键main endp6 运行结果分析电子琴界面如图6-1所示。图6-1 电子琴界面电子琴播放

27、预存音乐时的界面如图6-2所示。相比初始界面,播放预存音乐时,右上角的第一个灯变绿了,上面和左右两边的点开始闪烁,且每播放一个音符,界面下方就多了一个符号。图6-2 电子琴播放预存音乐的界面7 调试过程记录在程序调试的过程中,遇到最大的问题就是,寄存器的值变幻无常,容易出错。原因:程序结构过于复杂,使用寄存器比较频繁,以及使用了BIOS中断程序,这样会导致其它与之相关寄存器的值的改变。解决办法:堆栈是保护环境的主要工具,一旦用错,后果将很严重,比如我们在调试程序的过程中,遇到过这样的问题:在一个函数的开始,我先用PUSH把所有寄存器入栈了,在函数的执行中,我又把一个寄存器PUSH到栈中保存,却

28、忘记了在执行POP指令之前把它恢复出来!这样就造成了所有的寄存器的值都的生了变化。PUSH了一个变量之后在新的PUSH来临之前如果又有POP别的变量的语句,一定会出问题!解决的办法只有一个,把PUSH和POP对上号。8 课程设计小结在本次设计中,可以说是一次成功的经验。在学完了微型原理与接口技术这门课的基础上来搞做这个设计,使我对这门课的理论知识的理解有很大程度上的加强。微机原理这门课程本身是一门实验性和工程性很强的专业技术课,因此不仅要重视理论教学,更应注意实践技能的培养和训练。课程设计是这门课程的一个重要环节,通过课程设计,巩固、加深和拓宽了学习的理解,使自己的分析、设计和调试8086微机

29、系统的能力得到了进一步的提高。通过整整一个星期的摸索和编程,查资料,终于把程序完成了,和小组的成员一起讨论问题,分析问题,发现问题,解决问题,也收获了不少,我们的编程技术都有所提高,我们的体会就是:要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。每一个程序员都是在失败、尝试、失败、尝试与收获中成长起来的。在设计过程中,对不同方案的构思、分析、比较到最后的定案,这些工作,培养了我们的分析问题,解决问题和创新的能力。在方案确定后,在软件编程方面,对编写的程序经上机实践和调试,对存在的问题进行反复修改,使其达到了最优方案。这样的编程机会在平时是很少有的,所以,在编程方面我们得

30、到了很多的锻炼,使自己更加熟悉了汇编语言,了解了编程思想,为以后的学习以及工作打下了扎实的基础。我认为,在这次的课程设计中,不但做出了一个符合要求的电子琴,而且为自己积累了一笔有用的财富。参考文献1 龚尚福.微机原理与接口技术.西安电子科技大学出版社,2003.82 李芷.微机原理与接口技术.电子工业出版社,2002 3 钱晓捷.汇编语言程序设计(第二版).电子工业出版社,20034 宋杰等微机原理与接口技术课程设计北京 :机械工业出版社 ,20055 杨立,邓振杰,荆淑霞等微型计算机原理与接口技术(第二版)北京:中国铁道出版社,20066 小捷. 汇编语言程序设计. 第2

31、版. 西安:西安电子科技大学出版社,2003附录;*矩形绘制宏*draw macro start_x,start_y,end_x,end_y,color local draw_next;local :避免宏重复调用时,标号的重复;功能:画填充的矩形;使用条件:start_x < end_x ,start_y < end_y push ax ;堆栈 push bx push cx push dx mov ah,0ch ;12号功能,写像素 mov al,color ;取颜色值 mov bh,0 ;页号0 mov cx,start_x ;列起始点 mov dx,start_y ;行起始

32、点draw_next: int 10h ;画点 inc cx ;画横线 cmp cx,end_x ;比较行是否画完 jne draw_next ;画另一行 mov cx, start_x ;另一行的起始点 inc dx ;下一行 cmp dx,end_y ;比较列是否画完 jne draw_next ;未完继续画 pop dx ;出栈 pop cx pop bx pop ax endm;*矩形点阵绘制宏*draw_point macro start_x,start_y,end_x,end_y,color local draw_next;local :避免宏重复调用时,标号的重复;功能:画矩形点

33、阵;使用条件:start_x < end_x ,start_y < end_y push ax push bx push cx push dx mov ah,0ch ;12号功能,写像素 mov al,color ;设置颜色 mov bh,0 ;页号0 mov cx,start_x ;列起始点 mov dx,start_y ;行起始点draw_next: int 10h ;画点 inc cx inc cx ;隔一点 cmp cx,end_x ;比较行是否画完 jne draw_next ;画另一行 mov cx, start_x ;另一行的起始点 inc dx inc dx ;隔一

34、行 cmp dx,end_y ;比较列是否画完 jne draw_next ;未完继续画 pop dx pop cx pop bx pop ax endm;*矩形框绘制宏*drawsqre macro start_x,start_y,end_x,end_y,color local row_up,row_down,rank_left,rank_right;-功能:画矩形框。 push ax push bx push cx push dx push si mov ah,0ch ;12号功能,写像素 mov al,color mov bh,0 mov cx,start_x mov dx,start_

35、yrow_up: ;画上边 int 10h inc cx cmp cx,end_x jne row_up rank_right: ;画右边 int 10h inc dx cmp dx,end_y jne rank_right mov cx, start_x ;下边起始点 mov si,end_x inc sirow_down: ;画下边 int 10h inc cx cmp cx,si jne row_down mov dx,start_y ;左边起始点 mov cx,start_xrank_left: ;画左边 int 10h inc dx cmp dx, end_y jne rank_le

36、ft pop si pop dx pop cx pop bx pop ax endm ;*琴键处理程序*do_key proc near;-显示按下-push bx ;bx入栈mov bx,keynum ;取按键编号缓存值,存入bxcall key_down ;在屏幕上显示按下状态;-按下时琴身点阵颜色改变-纯白-draw_point 40,52,44,92,0fh ;调用矩形点阵宏,绘制音响孔左点阵draw_point 288,52,292,92,0fh ;调用矩形点阵宏,绘制音响孔右点阵draw_point 150,34,282,38,0fh ;调用矩形点阵宏,绘制正面音孔点阵 pop b

37、x ;bx出栈 ;-发出声音- lea bx,tune ;装入对应频率段地址到bx中 push si ;si入栈mov si,keynum ;取按键编号缓存值,存入simov di,bx+si ;取对应编号的音符频率值,存入dicall play_hand ;调用手动发声程序pop si ;出栈;-显示弹起- push bxmov bx,keynum ;在屏幕上显示弹起状态call key_up;-按下时琴身点阵颜色恢复-灰色-draw_point 40,52,44,92,07h ;调用矩形点阵宏,绘制音响孔左draw_point 288,52,292,92,07h ;调用矩形点阵宏,绘制音响

38、孔右draw_point 150,34,282,38,07h ;调用矩形点阵宏,绘制正面音孔 pop bx mov key_tune,0 ;恢复按键状态缓存,;- retdo_key endp;*手动演奏发声程序*;-功能:当手动按键时,播放相应键的声音,只要不放开,就会一直播放。;-在di中存放发声频率。play_hand proc near;- push axpush bxpush cxpush dxpush di;-mov al,0b6h ;在8253的43端送出一个控制字0b6h(10110110b)out 43h,al ;从而对定时器2初始化,准备接收计数初值 mov dx,12h

39、;1.1931Mhz/给定频率=12348h/给定频率=计数初值mov ax,348ch ;12348h存入DX:AX中,作32位运算,商存入AX,余数存入DX div di ;di中存放给定频率out 42h,al in al,61h ;开扬声器mov al,ah ;给定时器2写入AX中存放的计数初值out 42h,al in al,61h mov ah,al ;把8255输出端的61h的0、1两位置1,并把端口状态存入ahor al,3 ;打开扬声器out 61h,al ;-按键等待-wait1: call waitf;调用延时 in al,60h ;读取键盘扫描码,按下和放开都有相应的扫

40、描码,放开码=按下码+80h>80h test al,80h ;al和80h相与,影响标志位 jz wait1;未放开则继续延时 mov al,ah;恢复8255端口61h的状态,关扬声器out 61h,al;-pop di ;恢复寄存器状态pop dx pop cxpop bxpop ax;- retplay_hand endp;*自动播放发声程序*;-功能:自动播放音乐时发声。play_auto proc near;-push ax ;保存寄存器状态push bxpush cxpush dxpush di;-mov al,0b6h ;在8253的43端送出一个控制字0b6h(10110110b)out 43h,al ;从而对定时器2初始化,准备接收计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论