后面的已经上传的显示和位定义就不再上传了··
ZLG7290驱动。。
四极管:ZLG7290驱动(IIC_ZLG_7290.c)
#ifndef ZLG7290_C #define ZLG7290_C /*********************************** 函数功能:ZLG7290驱动 函数说明:模拟i2c写法 使用环境: 硬件: MCU: ATmega32L F_CPU = 16000000 外部:16000000 接线方法:见定义 编译环境:WinAVR-20080610 日期:2009年8月4日 修改者: (日期: ) ***************************************/ #define SDA_1 {DDRB&=~(1<<0);PORTB|=(1<<0);} #define SDA_0 {DDRB|=(1<<0);PORTB&=~(1<<0);} #define SCL_1 {DDRB&=~(1<<1);PORTB|=(1<<1);} #define SCL_0 {DDRB|=(1<<1);PORTB&=~(1<<1);} #define DA_IN PINB&(1<<0) #define uchar unsigned char #define uint unsigned int #define Write_Addr 0x70 #define Read_Addr 0x71 uchar data[]="0123456789"; volatile uchar Key_Value = 0 ; /********************************************************* 函数名称:delay_I2c 输入参数:n 输出参数:NULL 函数功能:短延时 ************************************************************/ void delay_I2c(uint n) { uint i; for(i=0;i<n;i++) { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } } /********************************************************** 函数名称:Start_I2c 输入参数:NULL 输出参数:NULL 函数功能:启动I2C总线 ************************************************************/ void Start_I2c(void) { SDA_1; SCL_1; delay_I2c(10); SDA_0; delay_I2c(10); SCL_0; delay_I2c(10); } /************************************************************ 函数名称:Stop_I2c 输入参数:NULL 输出参数:NULL 函数功能:结束I2C总线 **************************************************************/ void Stop_I2c(void) { SCL_1; SDA_0; delay_I2c(10); SDA_1; delay_I2c(10); SCL_0; delay_I2c(10); } /**************************************************************** 函数名称:SendByte 输入参数:Dat 输出参数:NULL 函数功能:8bit数据传送 ******************************************************************/ void SendByte(uchar Dat ) { uchar i; SCL_0; for(i=0;i<8;i++) { if(Dat&0x80){SDA_1;} else {SDA_0;} delay_I2c(5); SCL_1; delay_I2c(10); SCL_0; Dat<<=1; delay_I2c(5); } SDA_1; delay_I2c(10); SCL_1; delay_I2c(5); while(DA_IN); //等待应答 SCL_0; delay_I2c(10); } /*************************************************************** 函数名称:ReciveByte 输入参数:NULL 输出参数:Dat 函数功能:接受8bit数据 ****************************************************************/ uchar ReciveByte(void) { uchar Dat; uchar i; Dat = 0; SDA_1; //置数据线为输入方式 delay_I2c(5); for(i=0;i<8;i++) { Dat<<=1; SCL_1; delay_I2c(20); if(DA_IN) Dat|= 0X01; SCL_0; delay_I2c(30); } SCL_0; delay_I2c(10); return(Dat); } /***************************************************************** 函数名称:Ack_I2c 输入参数:NULL 输出参数:NULL 函数功能:主控器进行应答信号,(可以是应答或非应答信号) a = 1,非应答;a = 0,应答 *******************************************************************/ void Ack_I2c(unsigned char a) //a = 1为非应答 { if(a==0){SDA_0; } //在此发出应答或非应答信号 else {SDA_1; } delay_I2c(10); SCL_1; delay_I2c(10); //时钟低电平周期大于4μs SCL_0; //清时钟线,钳住I2C总线以便继续接收 delay_I2c(5); } /****************************************************************** 函数名称: ReadZLG7920 输入参数: NULL 输出参数: NULL 函数功能: 读取子地址的数据 读取方法: 启动总线->写从器件地址->写单元地址-> 启动总线->读从器件地址 ->读命令(ReciveByte())-> 发非应答信号->结束总线 *********************************************************************/ uchar ReadZLG7920(void) { uchar Key ; Start_I2c(); SendByte(Write_Addr); //写从器件地址 SendByte(0x01); //写从器件寄存器 Start_I2c(); SendByte(Read_Addr); //读从器件地址 Key = ReciveByte(); Ack_I2c(1) ; //发非应答信号 Stop_I2c(); return Key; } /****************************************************************** 函数名称: Key_Treat 输入参数: NULL 输出参数: NULL 函数功能: 按键值处理 ,把读出来的按键值转换成成 1--16 十进制 *********************************************************************/ void Key_change(void) { uchar Key_V; Key_V = ReadZLG7920(); switch(Key_V) { case 1 : Key_Value = 1;break; case 2 : Key_Value = 2;break; case 3 : Key_Value = 3;break; case 4 : Key_Value = 4;break; case 9 : Key_Value = 5;break; case 10: Key_Value = 6;break; case 11: Key_Value = 7;break; case 12: Key_Value = 8;break; case 17: Key_Value = 9;break; case 18: Key_Value = 10;break; case 19: Key_Value = 11;break; case 20: Key_Value = 12;break; case 25: Key_Value = 13;break; case 26: Key_Value = 14;break; case 27: Key_Value = 15;break; case 28: Key_Value = 16;break; default :break; } } /*************************************************************** 函数名称:Dispaly_Key 输入参数:NULL 输出参数:NULL 函数功能:用1602显示按键值 ****************************************************************/ void Display_Key(void) { Key_change() ; //Displaypstr(0,1,"Key = "); distwochar_12864(7,1,data[Key_Value/10],data[Key_Value%10]); } #endif
中断
四极管 :中断配置及实现(int0.c)
#ifndef INT0_C #define INT0_C /*********************************** 函数功能:外中断0驱动 函数说明:低电平触发中断 使用环境: 硬件: MCU: ATmega32L F_CPU = 16000000 外部:16000000 hucdishcushucus 接线方法:3跟数据线:外部中断源接PD2 编译环境:WinAVR-20080610 日期:2009年8月4日 作者:杨琦 修改者: (日期: ) ***********************************/ volatile uint8_t flag_1 = 0; //定义中断标志位 /**************************************** ** 函数名:int_init(void) ** 功能 :外中断初始化 ** 变量 :无 ** 返回值:无 ****************************************/ void int_init(void) { // MCUCR |= 0X00;//控制寄存器低两位(00):INT0的低电平产生一个中断请求 MCUCR |= 0X02;//控制寄存器低两位(00):INT0的下降沿产生一个中断请求 //MCUCSR|= 0x00;//控制和状态寄存器第六位(ISC2)控制INT2~~~~~~~~~?? GICR |= 0X40;//通用中断控制寄存器的高三位为INT0、INT1和INT2的中断允许控制位 } /**************************************** ** 函数名:SIGNAL(SIG_INTERRUPT0) ** 功能 :外中断0服务程序 ** 变量 :SIG_INTERRUPT0 ** 返回值:无 ****************************************/ SIGNAL(SIG_INTERRUPT0) { flag_1 = 1; //外中断0 } /**************************************** ** 函数名:init_devices(void) ** 功能 :中断驱动 ** 变量 :无 ** 返回值:无 ****************************************/ void init_devices(void) { DDRD=0x00; //设置为输出 int_init(); sei(); //开全局中断 } #endif
主函数
四极管:主函数(Main.c)
#ifndef MAIN_C #define MAIN_C #include <avr/io.h> #include <avr/interrupt.h> #include <int0.c> #include <RT12864M.c> #include <IIC_ZLG_7290.c> int main(void) { init_devices(); Init_12864(); while(1) { if(flag_1 == 1) ////flag = 1表明已进入中断 { Dispaly_Key(); //中断后显示按键值 flag_1 = 0; } } } #endif
显示函数
四极管:显示液晶(RT12864M.c)
/*********************************** 函数功能:RT12864_LCD 液晶汉字和字符 函数说明:四线方式,数据输出线:RS_12864 RW_12864 E_12864 PSB_12864 使用环境: 硬件: MCU: ATmega32L F_CPU = 16000000 外部:16000000 接线方法:4跟功能线(数据线公用):RS-OA7 RW-OA6 E-OA5 PSB-OA4 编译环境:WinAVR-20080610 显示说明: 显示两个字符即一个汉字 : distwochar_12864(uchar x,uchar y,uchar char1,uchar char2) (x为横坐标 y为坐标 char1 char2为所要显示的东西) 坐标定位说明:X:0-15 Y:0-3 显示汉字字组: dispstr_12864(uchar x,uchar y,uchar *pstr) (x为横坐标 y为坐标 *pstr为所要显示的东西) 坐标定位说明:X:0-7 Y:0-3 画图形: drawpic_12864(uchar *pdraw) ( *pdraw为所要显示的图形码) 所用取模软件: 字模精灵(Version1.0) 源图形宽度 * 高度:128 * 64 调整后宽度 * 高度:128 * 64 字模格式:横向取模,冗余模式,字节正序,正色取模, 包含文件 :MyBit.h BIN.h 日期:2009年7月13日 修改:杨琦 修改者: (日期: ) *******头文件部分********/ #include <avr/io.h> #include <util/delay.h> #include<MyBit.h> #include <BIN.h> #define uchar unsigned char #define uint unsigned int #define RS_12864 OA7//RS #define RW_12864 OA6//RW #define E_12864 OA5//E #define PSB_12864 OA4 #define RS_12864_io RA7 #define RW_12864_io RA6 #define E_12864_io RA5 #define PSB_12864_io RA4 #define RW_12864_r IA6 #define RS_12864_1() {RS_12864_io=1;_delay_us(1);RS_12864=1;} #define RS_12864_0() {RS_12864_io=1;_delay_us(1);RS_12864=0;} #define RW_12864_1() {RW_12864_io=1;_delay_us(1);RW_12864=1;} #define RW_12864_0() {RW_12864_io=1;_delay_us(1);RW_12864=0;} #define E_12864_1() {E_12864_io=1;_delay_us(1);E_12864=1;} #define E_12864_0() {E_12864_io=1;_delay_us(1);E_12864=0;} #define PSB_12864_1() {PSB_12864_io=1;_delay_us(1);PSB_12864=1;} #define PSB_12864_0() {PSB_12864_io=1;_delay_us(1);PSB_12864=0;} //串行写法第一字节 #define CM_rdata 0xfe //11111110 #define CM_rcomm 0xfc //11111100 #define CM_wdata 0xfa //11111010 #define CM_wcomm 0xf8 //11111000 uint CGRAM[64][8]; //*************函数部分***************/ /* 名字:sentbyte_12864() */ /* 功能:把一字节送到RT12864M */ /* 局部变量:sentbyte */ /* 全局变量:无 */ /* 返回值: 无 */ //************************************/ void sentbyte_12864(uchar sentbyte) { uint i; E_12864_0(); for(i=0;i<8;i++) { if(sentbyte&0x80){RW_12864_1();} else {RW_12864_0();} _delay_us(1); E_12864_1(); sentbyte<<=1; E_12864_0(); _delay_us(1); } } //*************函数部分***************/ /* 名字:readbyte_12864() */ /* 功能:读RT12864M */ /* 局部变量:readtype */ /* 全局变量:无 */ /* 返回值: temp */ //************************************/ uchar readbyte_12864(uchar readtype) { uchar tmp1=0,tmp2=0,temp=0; uint i; sentbyte_12864(readtype); E_12864_0(); for(i=0;i<8;i++) { _delay_us(1); E_12864_1(); if(RW_12864_r)tmp1|=0x01; tmp1<<=1; E_12864_0(); } for(i=0;i<8;i++) { _delay_us(1); E_12864_1(); if(RW_12864_r)tmp2|=0x01; tmp2<<=1; E_12864_0(); } temp=(tmp1&0xf0)|((tmp2&0xf0)>>4); return (temp); } //*************函数部分***************/ /* 名字:busywait_12864() */ /* 功能:检测RT12864M是否忙 */ /* 局部变量:无 */ /* 全局变量:无 */ /* 返回值: 无 */ //************************************/ void busywait_12864(void) { uchar bf; loop: bf=readbyte_12864(CM_rcomm); if(bf&0x80)goto loop; } //*************函数部分***************/ /* 名字:writecomm_12864() */ /* 功能:写命令进RT12864M */ /* 局部变量:command */ /* 全局变量:无 */ /* 返回值: 无 */ //************************************/ void writecomm_12864(uchar command) { busywait_12864(); RS_12864_1(); sentbyte_12864(CM_wcomm); sentbyte_12864(command&0xf0); sentbyte_12864((command<<4)&0xf0); } //*************函数部分***************/ /* 名字:writedata_12864() */ /* 功能:写数据写进RT12864M */ /* 局部变量:wrdata */ /* 全局变量:无 */ /* 返回值: 无 */ //************************************/ void writedata_12864(uchar wrdata) { busywait_12864(); RS_12864_1(); sentbyte_12864(CM_wdata); sentbyte_12864(wrdata&0xf0); sentbyte_12864((wrdata<<4)&0xf0); } //*************函数部分***************/ /* 名字:Init_12864() */ /* 功能:初始化RT12864M */ /* 局部变量:无 */ /* 全局变量:无 */ /* 返回值: 无 */ //************************************/ void Init_12864(void) { PSB_12864_0(); //选择串口通信 E_12864_0(); writecomm_12864(0x30);//功能设置 8位数据,基本指令 _delay_ms(10); writecomm_12864(0x0c);//显示状态 ON,游标OFF,反白OFF _delay_ms(10); writecomm_12864(0x01);//清除显示 _delay_ms(10); writecomm_12864(0x02);//地址归位 } //*************函数部分***************/ /* 名字:locatexy_12864() */ /* 功能:定位显示地址 */ /* 局部变量:x,y */ /* 全局变量:无 */ /* 返回值: 无 */ //************************************/ void locatexy_12864(uchar x,uchar y) { uchar addr=0; switch(y) { case 0:addr=0x80+x;break; case 1:addr=0x90+x;break; case 2:addr=0x88+x;break; case 3:addr=0x98+x;break; default:break; } writecomm_12864(addr); } //*************函数部分***************/ /* 名字:distwochar_12864() */ /* 功能:显示两个字符即一个汉字 */ /* 局部变量:x,y,char1,char2 */ /* 全局变量:无 */ /* 返回值: 无 */ //************************************/ void distwochar_12864(uchar x,uchar y,uchar char1,uchar char2) { locatexy_12864(x,y); writedata_12864(char1); writedata_12864(char2); } //*************函数部分***************/ /* 名字:dispstr_12864() */ /* 功能:显示汉字字组 */ /* 局部变量:x,y,*pstr */ /* 全局变量:无 */ /* 返回值: 无 */ //************************************/ void dispstr_12864(uchar x,uchar y,uchar *pstr) { uint i,t=0; while(pstr[t]!='\0')t++; for(i=0;i<t;i++) { distwochar_12864(x,y,pstr[i],pstr[i+1]); i+=1; x+=1; if(x==8) { x=0; y++; if(y==4)y=0; } } } /*=========================================*/ /* 函数:drawpic(uchar *pdraw); */ /* 功能描述:画图形 */ /* 参数接口:pdraw,是存放图形数据的表 */ /*=========================================*/ void drawpic_12864(uchar *pdraw) { uint x,y; long uint k=0; uchar yaddr=0x80; writecomm_12864(0x30);//功能设置---8BIT控制界面,绘图显示OFF writecomm_12864(0x34);//功能设置---8BIT控制界面,扩充指令集 for(y=0;y<32;y++) { writecomm_12864(yaddr++);//设置绘图区的Y地址坐标 writecomm_12864(0x80); //设置绘图区的X地址坐标 for(x=0;x<8;x++) { writedata_12864(pdraw[k++]); writedata_12864(pdraw[k++]); } } yaddr=0x80; for(y=0;y<32;y++) { writecomm_12864(yaddr++);//设置绘图区的Y地址坐标 writecomm_12864(0x88); //设置绘图区的X地址坐标 for(x=0;x<8;x++) { writedata_12864(pdraw[k++]); writedata_12864(pdraw[k++]); } } writecomm_12864(0x32);//功能设置---8BIT控制界面,绘图显示ON writecomm_12864(0x36);//功能设置---8BIT控制界面,绘图显示OFF //返回基本设置 _delay_ms(10); writecomm_12864(0x30);//功能设置 8位数据,基本指令 _delay_ms(10); writecomm_12864(0x0c);//显示状态 ON,游标OFF,反白OFF writecomm_12864(0x02);//地址归位 }
位定义·
四极管:位定义文件(Bin.h)
#define B0000_0000 0x00 #define B0000_0001 0x01 #define B0000_0010 0x02 #define B0000_0011 0x03 #define B0000_0100 0x04 #define B0000_0101 0x05 #define B0000_0110 0x06 #define B0000_0111 0x07 #define B0000_1000 0x08 #define B0000_1001 0x09 #define B0000_1010 0x0A #define B0000_1011 0x0B #define B0000_1100 0x0C #define B0000_1101 0x0D #define B0000_1110 0x0E #define B0000_1111 0x0F #define B0001_0000 0x10 #define B0001_0001 0x11 #define B0001_0010 0x12 #define B0001_0011 0x13 #define B0001_0100 0x14 #define B0001_0101 0x15 #define B0001_0110 0x16 #define B0001_0111 0x17 #define B0001_1000 0x18 #define B0001_1001 0x19 #define B0001_1010 0x1A #define B0001_1011 0x1B #define B0001_1100 0x1C #define B0001_1101 0x1D #define B0001_1110 0x1E #define B0001_1111 0x1F #define B0010_0000 0x20 #define B0010_0001 0x21 #define B0010_0010 0x22 #define B0010_0011 0x23 #define B0010_0100 0x24 #define B0010_0101 0x25 #define B0010_0110 0x26 #define B0010_0111 0x27 #define B0010_1000 0x28 #define B0010_1001 0x29 #define B0010_1010 0x2A #define B0010_1011 0x2B #define B0010_1100 0x2C #define B0010_1101 0x2D #define B0010_1110 0x2E #define B0010_1111 0x2F #define B0011_0000 0x30 #define B0011_0001 0x31 #define B0011_0010 0x32 #define B0011_0011 0x33 #define B0011_0100 0x34 #define B0011_0101 0x35 #define B0011_0110 0x36 #define B0011_0111 0x37 #define B0011_1000 0x38 #define B0011_1001 0x39 #define B0011_1010 0x3A #define B0011_1011 0x3B #define B0011_1100 0x3C #define B0011_1101 0x3D #define B0011_1110 0x3E #define B0011_1111 0x3F #define B0100_0000 0x40 #define B0100_0001 0x41 #define B0100_0010 0x42 #define B0100_0011 0x43 #define B0100_0100 0x44 #define B0100_0101 0x45 #define B0100_0110 0x46 #define B0100_0111 0x47 #define B0100_1000 0x48 #define B0100_1001 0x49 #define B0100_1010 0x4A #define B0100_1011 0x4B #define B0100_1100 0x4C #define B0100_1101 0x4D #define B0100_1110 0x4E #define B0100_1111 0x4F #define B0101_0000 0x50 #define B0101_0001 0x51 #define B0101_0010 0x52 #define B0101_0011 0x53 #define B0101_0100 0x54 #define B0101_0101 0x55 #define B0101_0110 0x56 #define B0101_0111 0x57 #define B0101_1000 0x58 #define B0101_1001 0x59 #define B0101_1010 0x5A #define B0101_1011 0x5B #define B0101_1100 0x5C #define B0101_1101 0x5D #define B0101_1110 0x5E #define B0101_1111 0x5F #define B0110_0000 0x60 #define B0110_0001 0x61 #define B0110_0010 0x62 #define B0110_0011 0x63 #define B0110_0100 0x64 #define B0110_0101 0x65 #define B0110_0110 0x66 #define B0110_0111 0x67 #define B0110_1000 0x68 #define B0110_1001 0x69 #define B0110_1010 0x6A #define B0110_1011 0x6B #define B0110_1100 0x6C #define B0110_1101 0x6D #define B0110_1110 0x6E #define B0110_1111 0x6F #define B0111_0000 0x70 #define B0111_0001 0x71 #define B0111_0010 0x72 #define B0111_0011 0x73 #define B0111_0100 0x74 #define B0111_0101 0x75 #define B0111_0110 0x76 #define B0111_0111 0x77 #define B0111_1000 0x78 #define B0111_1001 0x79 #define B0111_1010 0x7A #define B0111_1011 0x7B #define B0111_1100 0x7C #define B0111_1101 0x7D #define B0111_1110 0x7E #define B0111_1111 0x7F #define B1000_0000 0x80 #define B1000_0001 0x81 #define B1000_0010 0x82 #define B1000_0011 0x83 #define B1000_0100 0x84 #define B1000_0101 0x85 #define B1000_0110 0x86 #define B1000_0111 0x87 #define B1000_1000 0x88 #define B1000_1001 0x89 #define B1000_1010 0x8A #define B1000_1011 0x8B #define B1000_1100 0x8C #define B1000_1101 0x8D #define B1000_1110 0x8E #define B1000_1111 0x8F #define B1001_0000 0x90 #define B1001_0001 0x91 #define B1001_0010 0x92 #define B1001_0011 0x93 #define B1001_0100 0x94 #define B1001_0101 0x95 #define B1001_0110 0x96 #define B1001_0111 0x97 #define B1001_1000 0x98 #define B1001_1001 0x99 #define B1001_1010 0x9A #define B1001_1011 0x9B #define B1001_1100 0x9C #define B1001_1101 0x9D #define B1001_1110 0x9E #define B1001_1111 0x9F #define B1010_0000 0xA0 #define B1010_0001 0xA1 #define B1010_0010 0xA2 #define B1010_0011 0xA3 #define B1010_0100 0xA4 #define B1010_0101 0xA5 #define B1010_0110 0xA6 #define B1010_0111 0xA7 #define B1010_1000 0xA8 #define B1010_1001 0xA9 #define B1010_1010 0xAA #define B1010_1011 0xAB #define B1010_1100 0xAC #define B1010_1101 0xAD #define B1010_1110 0xAE #define B1010_1111 0xAF #define B1011_0000 0xB0 #define B1011_0001 0xB1 #define B1011_0010 0xB2 #define B1011_0011 0xB3 #define B1011_0100 0xB4 #define B1011_0101 0xB5 #define B1011_0110 0xB6 #define B1011_0111 0xB7 #define B1011_1000 0xB8 #define B1011_1001 0xB9 #define B1011_1010 0xBA #define B1011_1011 0xBB #define B1011_1100 0xBC #define B1011_1101 0xBD #define B1011_1110 0xBE #define B1011_1111 0xBF #define B1100_0000 0xC0 #define B1100_0001 0xC1 #define B1100_0010 0xC2 #define B1100_0011 0xC3 #define B1100_0100 0xC4 #define B1100_0101 0xC5 #define B1100_0110 0xC6 #define B1100_0111 0xC7 #define B1100_1000 0xC8 #define B1100_1001 0xC9 #define B1100_1010 0xCA #define B1100_1011 0xCB #define B1100_1100 0xCC #define B1100_1101 0xCD #define B1100_1110 0xCE #define B1100_1111 0xCF #define B1101_0000 0xD0 #define B1101_0001 0xD1 #define B1101_0010 0xD2 #define B1101_0011 0xD3 #define B1101_0100 0xD4 #define B1101_0101 0xD5 #define B1101_0110 0xD6 #define B1101_0111 0xD7 #define B1101_1000 0xD8 #define B1101_1001 0xD9 #define B1101_1010 0xDA #define B1101_1011 0xDB #define B1101_1100 0xDC #define B1101_1101 0xDD #define B1101_1110 0xDE #define B1101_1111 0xDF #define B1110_0000 0xE0 #define B1110_0001 0xE1 #define B1110_0010 0xE2 #define B1110_0011 0xE3 #define B1110_0100 0xE4 #define B1110_0101 0xE5 #define B1110_0110 0xE6 #define B1110_0111 0xE7 #define B1110_1000 0xE8 #define B1110_1001 0xE9 #define B1110_1010 0xEA #define B1110_1011 0xEB #define B1110_1100 0xEC #define B1110_1101 0xED #define B1110_1110 0xEE #define B1110_1111 0xEF #define B1111_0000 0xF0 #define B1111_0001 0xF1 #define B1111_0010 0xF2 #define B1111_0011 0xF3 #define B1111_0100 0xF4 #define B1111_0101 0xF5 #define B1111_0110 0xF6 #define B1111_0111 0xF7 #define B1111_1000 0xF8 #define B1111_1001 0xF9 #define B1111_1010 0xFA #define B1111_1011 0xFB #define B1111_1100 0xFC #define B1111_1101 0xFD #define B1111_1110 0xFE #define B1111_1111 0xFF
转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: [email protected]。