带LCD1602液晶显示的多功能数字时钟【转】 - wangfengtop - 博客园
**************************************************************************************************************
                                             带LCD1602液晶显示的多功能数字时钟

设计者:  bluemanzyp(巨蟹座风云)
硬件载体:  EP2C8Q208 Amy电子FPGA学习板
设计时间:  2009年4月1日,V1.0版
{zh1}修改时间: 2009年8月23日,V3.0版
说明:
  1. 本设计全部采用数字电路和状态机的设计方法,没有采用任何CPU的IP核。
  2. 本设计的目的是为了练习状态机的设计技巧,以及方便生活^_^ 
  3. 有些EP2C8Q208 Amy电子FPGA学习板上的蜂鸣器是电平型的,给高电平就响,给低电平就不响,这样可能造成振铃的音质很差并且声音太小。
   建议将蜂鸣器换成脉冲型的,给什么频率的信号,响什么频率的声音。另外,{zh0}测试一下蜂鸣器在哪些频率下声音{zd0},选择这些音量大的频率工作。
  4. 如果要在其他型号的板子上用,请自己进行引脚锁定。
  5.  系统需要的最小资源:占用1100个逻辑单元LC,8个按键,LCD1602液晶,3个拨码开关,3个发光二极管。另外可以选配4×4小键盘,方便设置时钟。
************************************************************************************************************** 

多功能数字时钟的功能和特点:

1. 上电1s复位功能,手动复位功能,复位会给出1s振铃信号;
2. 基本时钟计时功能;
3. 闹钟功能;
4. 计数器xxx功能;
5. 整点报时功能;
6. 闹钟具有懒人模式功能,如果启动懒人模式,闹钟振铃每隔一分钟就响一次,如果不启动懒人模式,闹钟振铃响一分钟就停止;
7. 任意键关闭闹钟振铃功能(与懒人模式有关);
8. 计数器自动装载功能,可实现00h:00m:15s---99h:59m:59s的循环定时振铃;
9. 计数器手动启动功能;
10. 一键启动或关闭闹钟或者计数器功能;
11. 自动检验时钟、闹钟、和计数器设置数字的正确性,不正确的数字不能被输入系统;
12. 液晶LCD1602显示,可同时查看时间和闹钟设置时间或者计数器时间;
13. 菜单设置功能,人机界面友好;
14. 30秒不操作,自动退出菜单功能;
15. 8个基本按键:“↑”、“↓”、“←”、“→”、“确定”、“取消”、“闹钟开关alarm_sw”和“计数器开关cntalm_sw”完成全部操作;
16. 可以插上4×4小键盘进行快速操作;
17. 键盘自动消抖;
18. 4×4小键盘快捷键;
19. 用4×4小键盘设置时间或闹钟或计数器数字时,正确设置一位数字后,自动移到下一位数字进行设置;
20. “↑”、“↓”键连击功能实现快速数字设定;
21. 时钟后台计时功能,查看菜单不会影响时钟计时。
22. 各种振铃声音不同,容易分辨,声音洪亮(要换成脉冲型的蜂鸣器)。
************************************************************************

多功能数字时钟的使用方法:


一、时钟的设定和显示:

1. 正常显示时间的界面下,液晶上{dy}行显示当前时钟的时间,格式为:“Time  : h1h0:m1m0:s1s0”,其中“:”会0.5s亮0.5s灭。
第二行可以显示设定的闹钟时间、或当前的计数器计数值、或计数器的设定时间,可以通过接口板或者4×4小键盘上的“↑”、“↓”、“←”、“→”键来选择某一个来显示。
例如:选择显示设定的闹钟时间,  格式为:“Alarm : h1h0:m1m0:s1s0”,其中“:”一直亮。
例如:选择显示当前的计数器计数值, 格式为:“CntTim: h1h0:m1m0:s1s0”,其中“:”一直亮。
例如:选择显示计数器的设定时间, 格式为:“CntBuf: h1h0:m1m0:s1s0”,其中“:”一直亮。

2. 首先,在正常显示时间的界面下按“确定”键(接口板s6键或者4×4小键盘上的“确定”键)进入功能菜单,一共有三种功能菜单:“Set Clock”、“Set Alarm”、“Set Counter”,分别表示设置时钟、设置闹钟、设置计数器。通过按接口板或者4×4小键盘上的“↑”、“↓”、“←”、“→”键来选择菜单,因为LCD1602只有两行,所以同时只能有2个功能菜单显示出来,其中最左边有一个“→”符号的表示本菜单是选中的功能菜单。然后再次按“确定”键进入这一选中的功能进行设置。另外,4×4小键盘上的“1”、“2”、“3”键分别是“Set Clock”功能、“Set Alarm”功能、“Set Counter”功能的快捷键。在正常显示时间的界面下,也可以通过4×4小键盘上的“1”选择“Set Clock”功能,“2”选择“Set Alarm”功能,“3”选择“Set Counter”功能,再次按“确定”键或者4×4小键盘上的“1”、“2”、“3”键就可以进入对应功能。

3. 如果选择了“Set Clock”菜单,按“确定”键进入设置时钟的功能进行设置,这时液晶上{dy}行显示“Set Clock Time:”,第二行显示“h1h0:m1m0:s1s0”,系统会自动装载当前显示的时间作为设置时间的基础。其中需要设置的某一位数字处于闪烁状态,可以通过接口板或者4×4小键盘上的“↑”、“↓”键或者是4×4小键盘上的0-9的数字键来设置某一位数字的数值,通过接口板或者4×4小键盘上的“←”、“→”键来选择设置哪一位数字。其中h1只能是0、1、2三个数字,根据h1的取值h0只能是0-9或者0-3,m1只能是0-5,m0只能是0-9,s1只能是0-5,s0只能是0-9。数值的限定范围是自动进行的,比如设置h1时,当按下“↑”、“↓”键,就自动在0、1、2三个数字中循环,设置好以后,“←”、“→”键来选择下一位数字h0或者s0来设置。按当按下4×4小键盘上的0-9的数字键,如果按的建不是0、1、2三个数字,按其他键是无效的。当按下4×4小键盘上的有效数字键后,会自动进入设置h0的位置,同时h0开始闪烁。

4. 当设置完毕时钟的时间后,可以按“确定”键保存当前时钟的设置,再按“取消”(接口板s5键或者4×4小键盘上的“取消”键)退出菜单,回到正常显示时间的界面。

二、闹钟的操作:

1. 首先,通过菜单设置好闹钟的时间,按“确定”保存当前闹钟的设置,再按“取消”退出菜单,回到正常显示时间的界面。此时alarm_on(发光二极管D1)自动点亮,说明闹钟功能启动。你也可以通过按alarm_sw键,关闭闹钟功能,此时alarm_on灭。关闭后,如果不需要改动原来设置的闹钟时间,可以通过再次按alarm_sw键,开启闹钟功能,此时alarm_on亮。
2. 如果关闭了懒人模式(SW7键,lazy_mode,拨在上边),当时钟到达设定的闹钟时间,就会开始振铃1分钟然后停止,到明天同一时间会再次响起。闹铃过程中按下接口板上的s3-s8键或者4×4小键盘上的的任意键,就会关闭闹铃振铃,但不会关闭闹钟功能,alarm_on(发光二极管D1)不会受到影响,仍然亮。

3. 如果启动了懒人模式(SW7键,lazy_mode,拨在下边),当时钟到达设定的闹钟时间,就会响1分钟,然后停1分钟,这样一直循环响下去。直到按下alarm_sw键(s1键)关闭闹钟(注意:关闭闹钟不会立刻关闭闹铃振铃,只不过明天、后天……闹钟就不会响了),或者关闭懒人模式为止(注意:关闭懒人模式也不会立刻关闭闹铃振铃,闹铃振铃要响完这一分钟才会停)。在懒人模式下,闹铃过程中按下接口板上的s3-s8键或者4×4小键盘上的的任意键,只能暂时关闭闹钟,一分钟后闹钟仍然会振铃。

4. 闹钟设置过程中,液晶上{dy}行显示“Set Alarm Time:”,第二行显示“h1h0:m1m0:s1s0”,系统会自动装载上次设置的闹钟时间作为设置闹钟的基础。其中需要设置的某一位数字处于闪烁状态,可以通过接口板或者4×4小键盘上的“↑”、“↓”键或者是4×4小键盘上的0-9的数字键来设置某一位数字的数值,通过接口板或者4×4小键盘上的“←”、“→”键来选择设置哪一位数字。其中h1只能是0、1、2三个数字,根据h1的取值h0只能是0-9或者0-3,m1只能是0-5,m0只能是0-9,s1只能是0-5,s0只能是0-9。数值的限定范围也是自动进行的,作用跟时钟设置时的一样,不再举例。



三、计数器的操作:
        
        1. 首先,通过菜单设置好需要计数器的计数时间,按“确定”保存当前计数器的设置,再按“取消”退出菜单,回到正常显示时间的界面。此时cntalm_on(发光二极管D2)自动点亮,说明计数器功能启动,同时计数器开始倒计数。你也可以通过按cntalm_sw键,关闭计数器功能,此时cntalm_on灭。关闭后,如果不需要改动原来设置的计数器时间,可以通过再次按cntalm_sw键,开启计数器功能,此时cntalm_on亮,同时计数器开始倒计数。注意:如果给计数器设置的计数值是0,则计数器自动关闭,cntalm_on熄灭,停止计数。
        
        2. 如果打开了自动装载计数器功能(SW6键,is_manual_auto_start,拨在下边),此时若cntalm_on(发光二极管D2)亮,则计数器会每过设定的计数时间就会启动计 数闹钟响15秒,如果设定的计数时间小于15秒,则计数闹钟会一直响。直到按下cntalm_sw(s2键)关闭计数器闹钟,此时cntalm_on灭,计数器闹钟振铃也停止。每当振铃结束时,cntalm_on(发光二极管D2)保持点亮,自动保持计数器的开启。
        
        3. 如果关闭了自动装载计数器(SW6键,is_manual_auto_start,拨在上边),必须按下cntalm_sw(s2键),cntalm_on(发光二极管D2)亮,打开计数器才会xxx,直到计数到1时,计数闹钟开始响,同时计数器停止计数,当振铃结束时,cntalm_on(发光二极管D2)灭,自动关闭计数器。振铃的过程中可以通过按下cntalm_sw(s2键),来关闭计数器振铃,同时cntalm_on(发光二极管D2)灭。当通过菜单设置了计数器的计数时间后,cntalm_on(发光二极管D2)也亮,计数器也会自动开始倒计数,计数到1时,开始振铃,当振铃结束时,cntalm_on(发光二极管D2)灭,自动关闭计数器。
        
        4. 计数器设置过程中,液晶上{dy}行显示“Set Count Time:”,第二行显示“h1h0:m1m0:s1s0”,系统会自动装载上次设置的计数器时间作为设置计数器的基础。其中需要设置的某一位数字处于闪烁状态,可以通过接口板或者4×4小键盘上的“↑”、“↓”键或者是4×4小键盘上的0-9的数字键来设置某一位数字的数值,通过接口板或者4×4小键盘上的“←”、“→”键来选择设置哪一位数字。其中h1可以是0-9,h0也可以是0-9,m1只能是0-5,m0只能是0-9,s1只能是0-5,s0只能是0-9。数值的限定范围也是自动进行的,作用跟时钟设置时的一样,不再举例。
        
四、整点报时功能:

        将接口板上的SW8键,is_need_alarm,拨在下边(H)表示需要需要整点报时,拨在上边(L)表示不需要整点报时。整点报时功能启用时,当时钟每到59分56秒、57秒、58秒、59秒、和00分的00秒就会连响5下,其中前四声频率低,{zh1}一声频率高,表示整点。
        
五、其他注意事项:

        1. 进入任何一级菜单后,如果30s内不按键(接口板上的s3-s8键或者4×4小键盘上的任意按键),则自动退出菜单,进入正常显示时间的模式。
        
        2. 进入任何一级菜单后,时钟会在后台继续计时,如果没有重新设置时间,则时钟就不会受到任何影响,当前时间不会因为进入菜单而停止计时。
        
        3. 计数器闹铃优先级{zg},普通闹铃优先级次之,整点报时闹铃优先级{zd1}。当计数器闹铃时,普通闹铃和整点报时闹铃被屏蔽,普通闹铃正在进行时,整点报时闹铃被屏蔽。
    
    4. 注意:当s4键和s8键同时按下时,整个系统总清零,reset,所有的计数器和时间回到0。当产生系统总清零时,会发出1s“嘀”的声音。另外上电后,也会自动产生系统总清零信号,并会发出1s“嘀”的声音。

        
一、按键和发光二极管的编码:

        1. 接口板上左右两列共8个按键开关的编号如下:从上到下,从左到右分别为:s1-s8
        2. 接口板上从左到右共8个发光二极管的编号如下:从左到右分别为:D1-D8
        3. 接口板上从左到右共8个拨码开关的编号如下:从左到右分别为:SW1-SW8
        4. 发光二极管D1(又称为“alarm_on”)的亮灭表示有没有开启闹钟的功能,亮表示开启,灭表示关闭。
        5. 发光二极管D2(又称为“cntalm_on”)的亮灭表示有没有开启计数器闹钟的功能,亮表示开启,灭表示关闭。
        6. 发光二极管D8的亮灭表示有没有按下按键,按下接口板上的s3-s8键或者4×4小键盘的任意键,发光二极管D8点亮,松开按键,D8熄灭。
        
二、开发板红色拨码开关的作用(从左到右:SW1-SW8):

        1. SW8键,is_need_alarm,                是否需要整点闹铃,                        H(拨在下边)需要,                        L(拨在上边)不需要
        2. SW7键,lazy_mode,                        是否启动懒人模式,                        H(拨在下边)启动,                        L(拨在上边)不启动
        3. SW6键,is_manual_auto_start,是否自动装载计数器的设置值,H(拨在下边)自动装载,                L(拨在上边)不自动装载\




三、接口板左右两侧8个按键功能(从上到下、从左到右分别是s1键到s8键,s3、s4、s7、s8键有双功能):


        (1) 当正常显示时间时:
        
                1. s1键,alarm_sw,控制着闹钟的开启和关闭,每按一次键,闹钟就打开或关闭,当打开闹钟时,alarm_on(发光二极管D1)亮,关闭闹钟时,alarm_on灭。
                
                2. s2键,cntalm_sw,控制着计数器闹铃的开启和关闭,每按一次键,计数器闹钟就打开或关闭,当打开计数器闹钟时,cntalm_on(发光二极管D2)亮,关闭闹钟    时,cntalm_on灭。
                
                3. s5键,“取消”键,进入菜单后,如果不想保存当前的设置值,可以按“取消”,不保存当前设置,并推出本级菜单进入上一级菜单。
                
                4. s6键,“确定”键,正常显示时间时,按下此键,则进入菜单。可以通过“↑”、“↓”、“←”、“→”键来选择菜单,进入某一个菜单后,可以通过“↑”、“↓”键来增加或者减少某一位数字的数值,通过“←”、“→”键来选择设置哪一位数字。如果想保存当前的设置值,可以按“确定”,保存当前设置后,退出本级菜单进入下一级菜单。
                
        (2) 当进入设置菜单时:
        
                1. s7键,相当于“↑”键,在设置时间或闹铃或计数器时,用来加计数值,按键时间不超过0.5s时,按一下键,计数值就加一,当键时间超过0.5s时,计数值自动以每0.1秒加一。
                
                2. s8键,相当于“↓”键,在设置时间或闹铃或计数器时,用来减计数值,按键时间不超过0.5s时,按一下键,计数值就减一,当键时间超过0.5s时,计数值自动以每0.1秒减一。
                
                3. s3键,相当于“←”键,用来选择前一个菜单,或者用来选择设置左侧时分秒的数据。
                
                4. s4键,相当于“→”键,用来选择后一个菜单,或者用来选择设置右侧的时分秒的数据。
                
        (3) 当时钟正常显示时间时:
        
                1. s7键和s4键,相当于“↑”键和“→”键,        在液晶第二行循环切换显示“闹钟设定时间almbufin” → “计数器当前计数值cnttimein” → “计数器设定值cntbufin”。
                
                2. s8键和s3键,相当于“↓”键和“←”键,        在液晶第二行循环切换显示“闹钟设定时间almbufin” → “计数器设定值cntbufin” → “计数器当前计数值cnttimein”。
                
                注意:当s4键和s8键同时按下时,整个系统总清零,reset,所有的计数器和时间回到0。当产生系统总清零时,会发出1s“嘀”的声音。

                
四、4×4小键盘的作用:

        当插上4×4小键盘时,可以方便地快速设置时间、闹钟和计数器。
        4×4小键盘的行扫描row(3..0)从高位到分别接到接口板的P5双排插针的左下角4根线上,分别锁定引脚为40、43、45、47,列扫描col(3..0)接到接口板的P5双排插针的右下角4根线上,分别锁定引脚为41、44、46、48。
    编码:
    |----------------|
    | 1   2   3  取消|
    | 4          5   6  确定|
    | 7          8   9          ↑  |
    | 0   ←   →   ↓  |
    |----------------|
    
    1. 键盘编码0~9,用来快速设置时间或者闹钟或者计数器,每设置一个数字,自动向右动跳到一个数字进行设置。
    
    2. “←”和“→”用来选择前一个或者后一个菜单,或者用来选择某一个时分秒的数据来设置。
    
    3. “↑”和“↓”在设置时间或闹铃或计数器时,用来加减计数值,按键时间不超过0.5s时,按一下键,计数值就加一或减一,当按键时间超过0.5s时,计数值自动以每0.2秒的速度加1。
    
    4. “取消”,进入菜单后,如果不想保存当前的设置值,可以按“取消”,不保存当前设置,并推出本级菜单进入上一级菜单。
    
    5. “确定”,正常显示时间时,按下此键,则进入菜单。设置时间或闹钟或计数器后,如果想保存当前的设置值,可以按“确定”保存当前设置,同时退出本级菜单进入下一级功能选择菜单。
    
五、需要锁定的引脚:
        1. 4×4小键盘的行引脚row[3..0]和列引脚col[3..0],从行引脚输出键盘扫描的信号,从列引脚读入键盘扫描的信号。
                set_location_assignment PIN_48 -to col[0]
                set_location_assignment PIN_46 -to col[1]
                set_location_assignment PIN_44 -to col[2]
                set_location_assignment PIN_41 -to col[3]
                set_location_assignment PIN_47 -to row[0]
                set_location_assignment PIN_45 -to row[1]
                set_location_assignment PIN_43 -to row[2]
                set_location_assignment PIN_40 -to row[3]
            
            列引脚col[3..0]要设置弱的上拉电阻:
            set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to col[0]
                set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to col[1]
                set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to col[2]
                set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to col[3]
                
        2. 接口板上s3-s8,分别对应“←”键、“→”键、“取消”键、“确定”键、“↑”键、“↓”键
                set_location_assignment PIN_84 -to key6[0]                # “→”键
                set_location_assignment PIN_87 -to key6[1]                # “←”键
                set_location_assignment PIN_145 -to key6[2]                # “↓”键
                set_location_assignment PIN_143 -to key6[3]                # “↑”键
                set_location_assignment PIN_146 -to key6[4]                # “确定”键
                set_location_assignment PIN_144 -to key6[5]                # “取消”键
                
        3. 液晶LCD1602的控制信号和数据信号
                set_location_assignment PIN_67 -to dout[0]
                set_location_assignment PIN_63 -to dout[1]
                set_location_assignment PIN_60 -to dout[2]
                set_location_assignment PIN_58 -to dout[3]
                set_location_assignment PIN_56 -to dout[4]
                set_location_assignment PIN_57 -to dout[5]
                set_location_assignment PIN_59 -to dout[6]
                set_location_assignment PIN_61 -to dout[7]
                set_location_assignment PIN_69 -to en
                set_location_assignment PIN_75 -to rs
                set_location_assignment PIN_72 -to rw
                
        4. 其他引脚
                set_location_assignment PIN_23 -to clk_50M                                        # 50MHz时钟。
                
                set_location_assignment PIN_74 -to alarm_sw                                        # 开关闹钟的控制键。
                set_location_assignment PIN_86 -to cntalm_sw                                # 开关计数器的控制键。
                
                set_location_assignment PIN_137 -to is_manual_auto_start        # 否需要整点闹铃。
                set_location_assignment PIN_139 -to lazy_mode                                # 否需要懒人模式。
                set_location_assignment PIN_142 -to is_need_alarm                        # 否需要整点报时。
                
                set_location_assignment PIN_88 -to alarm_on                                        # 发光二极管D1,亮表示开启闹钟,灭表示关闭闹钟。
                set_location_assignment PIN_90 -to cntalm_on                                # 发光二极管D2,亮表示开启计数器闹钟,灭表示关闭计数器闹钟。
                set_location_assignment PIN_112 -to key_pressed                                # 发光二极管D8的亮灭表示有没有按下按键,亮表示按下按键,灭表示松开按键。
                
                set_location_assignment PIN_82 -to alarm_out                                # 送给蜂鸣器的信号。
                
                set_location_assignment PIN_80 -to MAX232_R                                        # 关闭MAX232_R的发光二极管,也可以不锁定这个引脚。
                set_location_assignment PIN_76 -to MAX232_T                                        # 关闭MAX232_T的发光二极管,也可以不锁定这个引脚。
                
                以上是EP2C8Q208型号的FPGA学习板引脚锁定,如果板子型号也是EP2C8Q208,可以直接使用压缩包内的“clock.sof”或者“clock.jic”文件直接下载。
                
                如果使用别的型号的板子,需要按照自己板子的情况进行引脚锁定,下载后即可使用。
                
                {zh0}测试一下蜂鸣器在哪些频率下声音{zd0},通过“tone_gen”模块分频产生2个音量{zd0}的频率信号提供给“clock_no_PLL.bsf”模块的“ToneH”(高频率)和“ToneL”(低频率)端口。







开学一直很忙,借国庆假期,将这个数字钟的源程序整理出来跟大家分享,里边有使用状态机设计菜单的方法、4×4键盘消抖和识别、键盘连击功能、LCD1602驱动设计、以及一些其他设计技术,我想程序中肯定有很多不足的地方,本来不想拿出来献丑,但是本着相互学习的态度,还是拿出来供大家一起学习一起提高吧,希望大家指正。

还有一些功能本来也想加进去,比如说显示和设置日期和星期的功能,但是实在是太忙,一直没有把设想变成现实,希望有兴趣的同志们继续改进。^_^
因为很多功能是动态显示的,所以照片也没有照,大家可以自己编译后下载到EP2C8Q208 Amy电子FPGA学习板中体验一下,有用过的同志也可以帮忙拍几张照片传上来看看。

另外,不管这个程序被传播到哪里,请保持项目的设计者为:bluemanzyp(巨蟹座风云),这是对作者的最起码的尊重。谢谢!


带LCD1602液晶菜单显示的多功能数字时钟的功能和特点:

1. 上电1s复位功能,手动复位功能,复位会给出1s振铃信号;
2. 基本时钟计时功能;
3. 闹钟功能;
4. 计数器xxx功能;
5. 整点报时功能;
6. 闹钟具有懒人模式功能,如果启动懒人模式,闹钟振铃每隔一分钟就响一次,如果不启动懒人模式,闹钟振铃响一分钟就停止;
7. 任意键关闭闹钟振铃功能(与懒人模式有关);
8. 计数器自动装载功能,可实现00h:00m:15s---99h:59m:59s的循环定时振铃;
9. 计数器手动启动功能;
10. 一键启动或关闭闹钟或者计数器功能;
11. 自动检验时钟、闹钟、和计数器设置数字的正确性,不正确的数字不能被输入系统;
12. 液晶LCD1602显示,可同时查看时间和闹钟设置时间或者计数器时间;
13. 菜单设置功能,人机界面友好;
14. 30秒不操作,自动退出菜单功能;
15. 8个基本按键:“↑”、“↓”、“←”、“→”、“确定”、“取消”、“闹钟开关alarm_sw”和“计数器开关cntalm_sw”完成全部操作;
16. 可以插上4×4小键盘进行快速操作;
17. 键盘自动消抖;
18. 4×4小键盘快捷键;
19. 用4×4小键盘设置时间或闹钟或计数器数字时,正确设置一位数字后,自动移到下一位数字进行设置;
20. “↑”、“↓”键连击功能实现快速数字设定;
21. 时钟后台计时功能,查看菜单不会影响时钟计时。
22. 各种振铃声音不同,容易分辨,声音洪亮(要换成脉冲型的蜂鸣器)。



 (原文件名:1.JPG) 



 (原文件名:2.JPG) 
郑重声明:资讯 【带LCD1602液晶显示的多功能数字时钟【转】 - wangfengtop - 博客园】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——