搜索
bottom↓
回复: 29

求教:CVAVR中EEPROM操作问题,如何用指针在指定地址写入指定数值,高手赐教!!!

[复制链接]

出0入0汤圆

发表于 2008-7-14 13:16:56 | 显示全部楼层 |阅读模式
我想在eeprom的指定位置比如0x0001写入一个指定数值例如0x12,应该怎么写?我今天翻了一天的论坛也没能找到答案,求各位大哥帮帮小弟...
马老师的书里关于eeprom这方面感觉写得太少了,小弟实在不知道该怎么解决...

#include <mega16.h>   

#define uchar unsigned char
#define uint unsigned int  

eeprom uchar *pa;
  
void main(void)
{
pa=0x01;    //我从别的参考书上看到这样写可以指定地址,但是编译时会出现错误
*pa=0x12;
}


错误内容:a value of type 'char' can't be assigned to an entity of type "eeprom unsigned char"



请问该如何修改才能正确?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2008-7-14 14:48:02 | 显示全部楼层
你问了一圈,最后转到这里了。

首先建议你看的是CVAVR软件中的帮助。你使用什么平台,就必须要熟悉该平台的功能和特点,每个平台都有差别。因为对与FLASH和EEPROM中的变量已经指针等,都是非标准C的东西,每个平台处理方法不一样。另外,你的C语言基础要好(不是指学校学的那点东西,以及能编一些代码),否则你看不懂,尽管CVAVR的帮助有中文翻译版的。

现在仅提供在CVAVR里如何定位EEPROM变量的简单办法。

1。CVAVR中不能直接指定EEPROM中变量的地址,它是按用户定义EEPROM变量的先后次序,顺序分配在EEPROM空间。
2。CVAVR中有类似 @0x20的变量定义方法,但只是将变量定义在指定的寄存器或RAM中,没有特殊的情况,不要使用这样的定义。
3。CVAVR中对EEPROM中的变量操作比其它的平台要方便,只要定义了在EEPROM中的变量,在程序中就如同使用了普通变量。不过注意不能无限制的赋值(写操作),因为EEPROM的写操作次数为10W次!所以通常只存放比较固定不变的变量在EEPROM中。

下面根据第1点,回答你的“指定EEPROM位置,比如0x0001,写入一个指定数值例如0x12”,并且在100的地址也存放一个0x12;

eeprom char temp;                     // temp 在0000
eeprom char a = 0x12;                // a 在 0001
eeprom char tt[98];                   // 从0002开始的98个字节为tt数组
eeprom char b = 0x12;                 // b 在100的位置。


编译后在CVAVR产生的LST文件中可以查看EEPROM的变量分配情况。注意的是,编译后会产生2个文件,一个是HEX文件为FLASH中的代码,一个为EEP文件,是EEPROM变量的初值,2个文件需要一起下载写到AVR中。

下面是以上4句编译后在LST中的情况:

                 ;      21 eeprom char temp;                     // temp 在0000
                 
                         .ESEG
                 _temp:
000000 00                .DB  0x0
                 ;      22 eeprom char a = 0x12;                // a 在 0001
                 _a:
000001 12                .DB  0x12
                 ;      23 eeprom char tt[98];                   // 从0002开始的98个字节为tt数组
                 _tt:
000002 00                .DB  0x0
000003 00                .DB  0x0
................
000062 00                .DB  0x0
000063 00                .DB  0x0
                 ;      24 eeprom char b = 0x12;                 // b 在100的位置。
                 _b:
000064 12                .DB  0x12

出0入0汤圆

发表于 2008-7-14 14:54:10 | 显示全部楼层
下面是CVAVR中关于指针使用的说明:

Pointers

Due to the Harvard architecture of the AVR microcontroller, with separate address spaces for data (SRAM), program  (FLASH) and EEPROM memory, the compiler implements three types of pointers.

The syntax for pointer declaration is:

[<type storage modifier>] type * [<pointer storage modifier>]
[* [<pointer storage modifier>] ...] pointer_name;

or

type [<type storage modifier>] * [<pointer storage modifier>]
[* [<pointer storage modifier>] ...] pointer_name;

where type can be any data type.

Variables placed in SRAM are accessed using normal pointers.
For accessing constants placed in FLASH memory, the flash type storage modifier is used.
For accessing variables placed in EEPROM, the eeprom type storage modifier is used.
Although the pointers may point to different memory areas, they are by default stored in SRAM.
Example:

/* Pointer to a char string placed in SRAM */
char *ptr_to_ram="This string is placed in SRAM";

/* Pointer to a char string placed in FLASH */
flash char *ptr_to_flash1="This string is placed in FLASH";
char flash *ptr_to_flash2="This string is also placed in FLASH";

/* Pointer to a char string placed in EEPROM */
eeprom char *ptr_to_eeprom1="This string is placed in EEPROM";
char eeprom *ptr_to_eeprom2="This string is also placed in EEPROM";

In order to store the pointer itself in other memory areas, like FLASH or EEPROM, the flash or eeprom pointer storage modifiers must be used as in the examples below:

/* Pointer stored in FLASH to a char string placed in SRAM */
char * flash flash_ptr_to_ram="This string is placed in SRAM";

/* Pointer stored in FLASH to a char string placed in FLASH */
flash char * flash flash_ptr_to_flash="This string is placed in FLASH";

/* Pointer stored in FLASH to a char string placed in EEPROM */
eeprom char * flash eeprom_ptr_to_eeprom="This string is placed in EEPROM";

/* Pointer stored in EEPROM to a char string placed in SRAM */
char * eeprom eeprom_ptr_to_ram="This string is placed in SRAM";

/* Pointer stored in EEPROM to a char string placed in FLASH */
flash char * eeprom eeprom_ptr_to_flash="This string is placed in FLASH";

/* Pointer stored in EEPROM to a char string placed in EEPROM */
eeprom char * eeprom eeprom_ptr_to_eeprom="This string is placed in EEPROM";

In order to improve the code efficiency several memory models are implemented.

The TINY memory model uses 8 bits for storing pointers to the variables placed in SRAM. In this memory model you can only have access to the first 256 bytes of SRAM.

The SMALL memory model uses 16 bits for storing pointers the variables placed in SRAM. In this memory model you can have access to 65536 bytes of SRAM.

In both TINY and SMALL memory models pointers to the FLASH memory area use 16 bits.

Because in these memory models pointers to the FLASH memory are 16 bits wide, the total size of the constant arrays and literal char strings is limited to 64K.
However the total size of the program can be the full amount of FLASH.

In order to remove the above mentioned limitation, there are available two additional memory models: MEDIUM and LARGE.
The MEDIUM memory model is similar to the SMALL memory model, except it uses pointers to constants in FLASH that are 32 bits wide. The pointers to functions are however 16 bit wide because they hold the word  address of the function, so 16 bits are enough to address a function located in all 128kbytes of FLASH.

The MEDIUM memory model can be used only for chips with 128kbytes of FLASH.

The LARGE memory model is similar to the SMALL memory model, except it uses pointers to the FLASH memory area that are 32 bits wide.
The LARGE memory model can be used for chips with 256kbytes or more of FLASH.

In all memory models pointers to the EEPROM memory area are 16 bit wide.

Pointers can be grouped in arrays, which can have up to 8 dimensions.
Example:


/* Declare and initialize a global array of pointers to strings  

   placed in SRAM */

char *strings[3]={"One","Two","Three"};

/* Declare and initialize a global array of pointers to strings  

   placed in FLASH

   The pointer array itself is also stored in FLASH */

flash char * flash messages[3]={"Message 1","Message 2","Message 3"};

/* Declare some strings in EEPROM */

eeprom char m1[]="aaaa";

eeprom char m2[]="bbbb";

void main(void) {

/* Declare a local array of pointers to the strings placed in EEPROM

   You must note that although the strings are located in EEPROM,

   the pointer array itself is located in SRAM */

char eeprom *pp[2];

/* and initialize the array */

pp[0]=m1;

pp[1]=m2;

}

Pointers to functions always access the FLASH memory area. There is no need to use the flash keyword for these types of pointers.

Example:

/* Declare a function */

int sum(int a, int b) {

return a+b;

}

/* Declare and initialize a global pointer to the function sum */

int (*sum_ptr) (int a, int b)=sum;

void main(void) {

int i;

/* Call the function sum using the pointer */

i=(*sum_ptr) (1,2);

}

出0入0汤圆

 楼主| 发表于 2008-7-14 15:39:34 | 显示全部楼层
哈哈~终于等到马老师的指导了~谢谢谢谢马老师~

出0入0汤圆

发表于 2008-10-21 13:59:26 | 显示全部楼层
正在学习!!谢谢马老师!!

出0入0汤圆

发表于 2008-12-29 16:13:41 | 显示全部楼层
很多同行喜欢用翻译的资料做教材而懒得加些自己在实际中碰到到问题来点拨后生.一方面可能是因为时间不够吧.另一个隐性的原因就是"懒".现在很多编译器都附带了很多例子.无需再去翻译(这部分时间至少可以节省一半出来,那必须的一半是去看人家的例子.足矣.).

既然打算出来当老师,我想还应该更竞业一点.

另外对于后生,阅读专业资料的英文水平是必需的.少玩点游戏吧.

出0入0汤圆

发表于 2008-12-29 16:26:44 | 显示全部楼层
对于CVAVR中的情况,"1。CVAVR中不能直接指定EEPROM中变量的地址,它是按用户定义EEPROM变量的先后次序,顺序分配在EEPROM空间。",这显然不符合工作需要嘛.如果你事先不知道eeprom的指定位置(譬如用户通过UART输入指定位置....),我急死你.

我喜欢直接去问"office@hpinfotech.ro"&nbsp;.前面那位兄弟都不错,知道这个缺陷.很好啊.CVAVR自己的不足他们心知肚名也会去改善的.总之跟别的编译器而言,这是一个很大的缺点.反馈给他们这是我的一贯作法.

出0入0汤圆

发表于 2008-12-29 16:30:16 | 显示全部楼层
另外建议马老师:尽可能用C语言.就象聊天尽可能用MSN和SKYPE一样.

出0入0汤圆

发表于 2008-12-29 19:12:57 | 显示全部楼层
to&nbsp;123456jj:



我教这门课程已经8、9个年头了,没有一个学生问到这样的问题,因为他们学的还是基础知识和应用。可贴上本帖的问题的人估计已经不是学生,或至少是研究生了,在做具体的项目或产品。我给出原文的提示帮助已经是不错了,没有义务仔细说明吧。



作为教师,我直接是面对我教的课堂学生,我同样要求他们要看英文原版的资料,就是考试也有英文的东西。



我认为我已经是非常竞业了。你只有3个积分,可见你在这里有多少的贡献,给了多少人的帮助。恐怕没有资格说别人吧。

出0入0汤圆

发表于 2008-12-29 20:07:45 | 显示全部楼层
*((eeprom&nbsp;unsigned&nbsp;char&nbsp;*)0x01)&nbsp;=&nbsp;0x12;



——难道不能写成这样吗?

出0入0汤圆

发表于 2008-12-30 10:10:15 | 显示全部楼层
亲爱的马老师,本人绝无对您不敬的意思.我只是在感叹堂堂中华这么多人员在目前的科技领域(这个方面)不那么尽如人意有点哀伤.

本人在沿海地区打工很多年(您可以把我理解成农民工吧),写软件,用的都是国外牌子的单片机.伤心啊.没本事进中科院,在此独自感叹而已.

言语过于刻薄,向您致歉!对不住.

出0入0汤圆

发表于 2008-12-30 10:21:43 | 显示全部楼层
我英文也很差劲的,但在工作中,经常碰到一些技术问题,芯片供应商的FAE总是搞不定(哈哈,他们也不是万能的小伙子),没办法只得自己发蹩脚的邮件向编译器生产商的技术人员请教(我从心底里佩服他们的博学及敬业).我用PIC最多,AVR前几年用过,忘了,先要重新拾起(都是工作需要).

附HP&nbsp;InfoTech今天回复的邮件(人家还在圣诞节其间!)

Hello



eeprom&nbsp;unsigned&nbsp;char&nbsp;abc&nbsp;@&nbsp;0x02;





....



abc=0x56;



Best&nbsp;regards,



Pavel&nbsp;Haiduc

Manager



**********************************

HP&nbsp;InfoTech&nbsp;S.R.L

Bd.&nbsp;Decebal&nbsp;nr.3

Bl.S12B&nbsp;Sc.2&nbsp;Ap.29

Sector&nbsp;3

Bucharest&nbsp;030962

ROMANIA

EUROPEAN&nbsp;UNION



e-mail:&nbsp;office@hpinfotech.ro

http://www.hpinfotech.ro

phone:&nbsp;(+40)-723469754

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(+40)-213261875

fax:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(+40)-213261876

**********************************



-----&nbsp;Original&nbsp;Message&nbsp;-----

From:&nbsp;

To:&nbsp;&lt;office@hpinfotech.ro>

Sent:&nbsp;Monday,&nbsp;December&nbsp;29,&nbsp;2008&nbsp;5:27&nbsp;AM

Subject:&nbsp;How&nbsp;to&nbsp;operate&nbsp;the&nbsp;special&nbsp;address&nbsp;for&nbsp;inner&nbsp;eeprom





Dear&nbsp;Sir,



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Merry&nbsp;Christmas&nbsp;and&nbsp;Happy&nbsp;New&nbsp;Year!



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;How&nbsp;to&nbsp;operate&nbsp;the&nbsp;special&nbsp;address&nbsp;for&nbsp;inner&nbsp;eeprom&nbsp;in&nbsp;CVAVR&nbsp;?



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;an&nbsp;example:&nbsp;I&nbsp;want&nbsp;to&nbsp;write&nbsp;data&nbsp;0x56&nbsp;in&nbsp;address&nbsp;0x02&nbsp;in

EEPROM,&nbsp;how&nbsp;can&nbsp;I&nbsp;do&nbsp;it?



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I&nbsp;can&nbsp;not&nbsp;find&nbsp;example&nbsp;from&nbsp;website&nbsp;and&nbsp;attached&nbsp;example&nbsp;of

compiler.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thanks.

出0入0汤圆

发表于 2008-12-30 10:29:03 | 显示全部楼层
刚才依照HP&nbsp;InfoTech的建议,完成EEPROM读写操作的小程序附下(我们经常会先准备好一些自己写好的小程序备份一备以后工作调用,免得临时碰到问题影响项目进程.已调试过OK)给兄弟姐妹参考参考吧.我不需要积分的.谢谢!

/*****************************************************





#include&nbsp;&lt;mega8.h>



//&nbsp;Standard&nbsp;Input/Output&nbsp;functions

#include&nbsp;&lt;stdio.h>

#include&nbsp;&lt;delay.h>&nbsp;





//eeprom&nbsp;unsigned&nbsp;int&nbsp;ee_addr0&nbsp;@0x0000;



eeprom&nbsp;unsigned&nbsp;char&nbsp;ee_addrx[512];



void&nbsp;initia(void);&nbsp;&nbsp;//&nbsp;move&nbsp;all&nbsp;initialization&nbsp;here&nbsp;from&nbsp;main()&nbsp;





void&nbsp;main(void)

{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;c;

&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;addr;

&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;data;

&nbsp;&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Declare&nbsp;your&nbsp;local&nbsp;variables&nbsp;here

&nbsp;&nbsp;&nbsp;&nbsp;initia();&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Place&nbsp;your&nbsp;code&nbsp;here

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\r\rPlease&nbsp;select&nbsp;operation&nbsp;mode:\r");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("r&nbsp;---&nbsp;read&nbsp;one&nbsp;byte\r");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("w&nbsp;---&nbsp;write&nbsp;one&nbsp;byte\r");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;getchar();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\ryou&nbsp;just&nbsp;typed&nbsp;\'%c\'",c);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(c)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x72&nbsp;:&nbsp;//&nbsp;ASCII&nbsp;for&nbsp;'r'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\rPlease&nbsp;input&nbsp;the&nbsp;hex&nbsp;address(&lt;0x0200,&nbsp;such&nbsp;as&nbsp;000A)&nbsp;you&nbsp;want&nbsp;to&nbsp;read:&nbsp;");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%4x",&addr);&nbsp;&nbsp;//&nbsp;for&nbsp;data&nbsp;receiving&nbsp;"scanf"&nbsp;function&nbsp;is&nbsp;the&nbsp;best&nbsp;one.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(addr&nbsp;&lt;&nbsp;0x200)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;ee_addrx[addr];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\rData&nbsp;read&nbsp;from&nbsp;EEPROM&nbsp;is&nbsp;%X",data);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;printf("\rSorry!&nbsp;address&nbsp;you&nbsp;typed&nbsp;is&nbsp;out&nbsp;of&nbsp;range:&nbsp;");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x77&nbsp;:&nbsp;//&nbsp;ASCII&nbsp;for&nbsp;'w'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\rPlease&nbsp;input&nbsp;the&nbsp;hex&nbsp;address(&lt;0x0200,&nbsp;such&nbsp;as&nbsp;0002)&nbsp;you&nbsp;want&nbsp;to&nbsp;write:&nbsp;");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%4x",&addr);&nbsp;&nbsp;//&nbsp;for&nbsp;data&nbsp;not&nbsp;"char"&nbsp;receiving&nbsp;"scanf"&nbsp;function&nbsp;is&nbsp;the&nbsp;best&nbsp;one.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(addr&nbsp;&lt;&nbsp;0x200)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\rPlease&nbsp;input&nbsp;hex&nbsp;data&nbsp;you&nbsp;want&nbsp;to&nbsp;write:&nbsp;");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%2x",&data);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ee_addrx[addr]&nbsp;=&nbsp;data;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;printf("\rSorry!&nbsp;address&nbsp;you&nbsp;typed&nbsp;is&nbsp;out&nbsp;of&nbsp;range:&nbsp;");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//&nbsp;end&nbsp;switch&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;};

}&nbsp;







void&nbsp;initia(void)&nbsp;&nbsp;//&nbsp;move&nbsp;all&nbsp;initialization&nbsp;here&nbsp;from&nbsp;main()

{

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Input/Output&nbsp;Ports&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Port&nbsp;B&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Func7=In&nbsp;Func6=In&nbsp;Func5=In&nbsp;Func4=In&nbsp;Func3=In&nbsp;Func2=In&nbsp;Func1=In&nbsp;Func0=In&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;State7=T&nbsp;State6=T&nbsp;State5=T&nbsp;State4=T&nbsp;State3=T&nbsp;State2=T&nbsp;State1=T&nbsp;State0=T&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;PORTB=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;DDRB=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Port&nbsp;C&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Func6=In&nbsp;Func5=In&nbsp;Func4=In&nbsp;Func3=In&nbsp;Func2=In&nbsp;Func1=In&nbsp;Func0=In&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;State6=T&nbsp;State5=T&nbsp;State4=T&nbsp;State3=T&nbsp;State2=T&nbsp;State1=T&nbsp;State0=T&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;PORTC=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;DDRC=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Port&nbsp;D&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Func7=In&nbsp;Func6=In&nbsp;Func5=In&nbsp;Func4=In&nbsp;Func3=In&nbsp;Func2=In&nbsp;Func1=In&nbsp;Func0=In&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;State7=T&nbsp;State6=T&nbsp;State5=T&nbsp;State4=T&nbsp;State3=T&nbsp;State2=T&nbsp;State1=T&nbsp;State0=T&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;PORTD=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;DDRD=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Timer/Counter&nbsp;0&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clock&nbsp;source:&nbsp;System&nbsp;Clock

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clock&nbsp;value:&nbsp;Timer&nbsp;0&nbsp;Stopped

&nbsp;&nbsp;&nbsp;&nbsp;TCCR0=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;TCNT0=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Timer/Counter&nbsp;1&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clock&nbsp;source:&nbsp;System&nbsp;Clock

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clock&nbsp;value:&nbsp;Timer&nbsp;1&nbsp;Stopped

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Mode:&nbsp;Normal&nbsp;top=FFFFh

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OC1A&nbsp;output:&nbsp;Discon.

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OC1B&nbsp;output:&nbsp;Discon.

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Noise&nbsp;Canceler:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Input&nbsp;Capture&nbsp;on&nbsp;Falling&nbsp;Edge

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Timer&nbsp;1&nbsp;Overflow&nbsp;Interrupt:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Input&nbsp;Capture&nbsp;Interrupt:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Compare&nbsp;A&nbsp;Match&nbsp;Interrupt:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Compare&nbsp;B&nbsp;Match&nbsp;Interrupt:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;TCCR1A=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;TCCR1B=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;TCNT1H=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;TCNT1L=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;ICR1H=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;ICR1L=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;OCR1AH=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;OCR1AL=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;OCR1BH=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;OCR1BL=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Timer/Counter&nbsp;2&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clock&nbsp;source:&nbsp;System&nbsp;Clock

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clock&nbsp;value:&nbsp;Timer&nbsp;2&nbsp;Stopped

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Mode:&nbsp;Normal&nbsp;top=FFh

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OC2&nbsp;output:&nbsp;Disconnected

&nbsp;&nbsp;&nbsp;&nbsp;ASSR=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;TCCR2=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;TCNT2=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;OCR2=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;External&nbsp;Interrupt(s)&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;INT0:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;INT1:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;MCUCR=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Timer(s)/Counter(s)&nbsp;Interrupt(s)&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;TIMSK=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USART&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Communication&nbsp;Parameters:&nbsp;8&nbsp;Data,&nbsp;1&nbsp;Stop,&nbsp;No&nbsp;Parity

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USART&nbsp;Receiver:&nbsp;On

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USART&nbsp;Transmitter:&nbsp;On

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USART&nbsp;Mode:&nbsp;Asynchronous

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USART&nbsp;Baud&nbsp;Rate:&nbsp;9600&nbsp;(Double&nbsp;Speed&nbsp;Mode)

&nbsp;&nbsp;&nbsp;&nbsp;UCSRA=0x02;

&nbsp;&nbsp;&nbsp;&nbsp;UCSRB=0x18;

&nbsp;&nbsp;&nbsp;&nbsp;UCSRC=0x86;

&nbsp;&nbsp;&nbsp;&nbsp;UBRRH=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;UBRRL=0x0C;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Analog&nbsp;Comparator&nbsp;initialization

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Analog&nbsp;Comparator:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Analog&nbsp;Comparator&nbsp;Input&nbsp;Capture&nbsp;by&nbsp;Timer/Counter&nbsp;1:&nbsp;Off

&nbsp;&nbsp;&nbsp;&nbsp;ACSR=0x80;

&nbsp;&nbsp;&nbsp;&nbsp;SFIOR=0x00;

}

出0入0汤圆

发表于 2008-12-30 10:33:53 | 显示全部楼层
雁过留言,经过这里而已!拜拜.新年快乐!

出0入0汤圆

发表于 2008-12-31 15:42:52 | 显示全部楼层
#include&nbsp;&lt;mega8.h>

#include&nbsp;&lt;delay.h>



#define&nbsp;RXB8&nbsp;1

#define&nbsp;TXB8&nbsp;0

#define&nbsp;UPE&nbsp;2

#define&nbsp;OVR&nbsp;3

#define&nbsp;FE&nbsp;4

#define&nbsp;UDRE&nbsp;5

#define&nbsp;RXC&nbsp;7



#define&nbsp;FRAMING_ERROR&nbsp;(1&lt;&lt;FE)

#define&nbsp;PARITY_ERROR&nbsp;(1&lt;&lt;UPE)

#define&nbsp;DATA_OVERRUN&nbsp;(1&lt;&lt;OVR)

#define&nbsp;DATA_REGISTER_EMPTY&nbsp;(1&lt;&lt;UDRE)

#define&nbsp;RX_COMPLETE&nbsp;(1&lt;&lt;RXC)



//&nbsp;USART&nbsp;Receiver&nbsp;buffer

#define&nbsp;RX_BUFFER_SIZE&nbsp;8

char&nbsp;rx_buffer[RX_BUFFER_SIZE];



#if&nbsp;RX_BUFFER_SIZE&lt;256

unsigned&nbsp;char&nbsp;rx_wr_index,rx_rd_index,rx_counter;

#else

unsigned&nbsp;int&nbsp;rx_wr_index,rx_rd_index,rx_counter;

#endif



//&nbsp;This&nbsp;flag&nbsp;is&nbsp;set&nbsp;on&nbsp;USART&nbsp;Receiver&nbsp;buffer&nbsp;overflow

bit&nbsp;rx_buffer_overflow;



//&nbsp;USART&nbsp;Receiver&nbsp;interrupt&nbsp;service&nbsp;routine

interrupt&nbsp;[USART_RXC]&nbsp;void&nbsp;usart_rx_isr(void)

{

char&nbsp;status,data;

status=UCSRA;

data=UDR;

if&nbsp;((status&nbsp;&&nbsp;(FRAMING_ERROR&nbsp;|&nbsp;PARITY_ERROR&nbsp;|&nbsp;DATA_OVERRUN))==0)

&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;rx_buffer[rx_wr_index]=data;

&nbsp;&nbsp;&nbsp;if&nbsp;(++rx_wr_index&nbsp;==&nbsp;RX_BUFFER_SIZE)&nbsp;rx_wr_index=0;

&nbsp;&nbsp;&nbsp;if&nbsp;(++rx_counter&nbsp;==&nbsp;RX_BUFFER_SIZE)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rx_counter=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rx_buffer_overflow=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};

&nbsp;&nbsp;&nbsp;};

}



#ifndef&nbsp;_DEBUG_TERMINAL_IO_

//&nbsp;Get&nbsp;a&nbsp;character&nbsp;from&nbsp;the&nbsp;USART&nbsp;Receiver&nbsp;buffer

#define&nbsp;_ALTERNATE_GETCHAR_

#pragma&nbsp;used+

char&nbsp;getchar(void)

{

char&nbsp;data;

while&nbsp;(rx_counter==0);

data=rx_buffer[rx_rd_index];

if&nbsp;(++rx_rd_index&nbsp;==&nbsp;RX_BUFFER_SIZE)&nbsp;rx_rd_index=0;

#asm("cli")

--rx_counter;

#asm("sei")

return&nbsp;data;

}

#pragma&nbsp;used-

#endif



//&nbsp;Standard&nbsp;Input/Output&nbsp;functions

#include&nbsp;&lt;stdio.h>



//&nbsp;Declare&nbsp;your&nbsp;global&nbsp;variables&nbsp;here

&nbsp;&nbsp;eeprom&nbsp;unsigned&nbsp;char&nbsp;eepromArray[256];

void&nbsp;main(void)

{



&nbsp;&nbsp;unsigned&nbsp;char&nbsp;temp,i;

&nbsp;&nbsp;unsigned&nbsp;char&nbsp;buf[8],index;

//&nbsp;USART&nbsp;initialization

//&nbsp;Communication&nbsp;Parameters:&nbsp;8&nbsp;Data,&nbsp;1&nbsp;Stop,&nbsp;No&nbsp;Parity

//&nbsp;USART&nbsp;Receiver:&nbsp;On

//&nbsp;USART&nbsp;Transmitter:&nbsp;On

//&nbsp;USART&nbsp;Mode:&nbsp;Asynchronous

//&nbsp;USART&nbsp;Baud&nbsp;Rate:&nbsp;9600

UCSRA=0x00;

UCSRB=0x98;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x33;



//&nbsp;Analog&nbsp;Comparator&nbsp;initialization

//&nbsp;Analog&nbsp;Comparator:&nbsp;Off

//&nbsp;Analog&nbsp;Comparator&nbsp;Input&nbsp;Capture&nbsp;by&nbsp;Timer/Counter&nbsp;1:&nbsp;Off

ACSR=0x80;

SFIOR=0x00;

#asm("sei")

putsf("wait");

for(i=0;i&lt;255;i++)

{

&nbsp;&nbsp;eepromArray&nbsp;=&nbsp;255-i;&nbsp;&nbsp;

}



while&nbsp;(1)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;getchar();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(temp);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(temp&nbsp;==&nbsp;'r')

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;getchar();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;eepromArray[temp];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(i);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(temp&nbsp;==&nbsp;'w')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;getchar();&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(temp);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=&nbsp;getchar();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(i);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eepromArray[temp]&nbsp;=&nbsp;&nbsp;i;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;};

}



通过串口控制eeprom读写,通过数组来设置在某地址上读写eeprom。朋友们看看,有没有什么问题

出0入0汤圆

发表于 2009-2-6 16:04:14 | 显示全部楼层
我也对这个问题发表些看法,我在CVAVR1248d&nbsp;版本中,可以定义,eeprom&nbsp;unsigned&nbsp;char&nbsp;&nbsp;*eePtr=0x01;

这句话编译可以通过,而且含义是eePtr&nbsp;指向0x01这个地址的,若向0x01写入0x88,则&nbsp;*eePtr=0x88;&nbsp;即可。



但是我在cvavr2304版本,就编译通不过,出现和楼主一样的错误提示,



高手们,有谁能指教一下啊

出0入0汤圆

发表于 2009-8-21 17:14:41 | 显示全部楼层
谢谢各位的讨论,掌握了

出0入0汤圆

发表于 2009-8-22 11:12:03 | 显示全部楼层
精彩,这才叫论坛

出0入0汤圆

发表于 2009-9-17 20:30:59 | 显示全部楼层
真的很不错

出0入0汤圆

发表于 2009-9-18 08:12:48 | 显示全部楼层
认识上又有进步,感谢各位!

出0入0汤圆

发表于 2009-10-23 15:59:42 | 显示全部楼层
精彩

出0入0汤圆

发表于 2009-10-24 10:02:29 | 显示全部楼层
eeprom char temp;                     // temp 在0000
eeprom char a = 0x12;                // a 在 0001
eeprom char tt[98];                   // 从0002开始的98个字节为tt数组
eeprom char b = 0x12;                 // b 在100的位置。

/************************************************/

eeprom unsigned char abc @ 0x02;
abc=0x56;

MARK

出0入0汤圆

发表于 2009-10-24 13:43:48 | 显示全部楼层
论坛

出0入0汤圆

发表于 2009-11-17 12:19:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-17 12:52:06 | 显示全部楼层
据我所知,CV在版本2.03.2以前@不能用于EEPROM变量的定义,而此后就可以了。如使用2.03.2以前的(也可以是以后的),可以用:

eeprom unsigned char  *P = (eeprom unsigned char *)0x00;

*P = 0x00 ;

出0入0汤圆

发表于 2009-11-17 18:56:01 | 显示全部楼层
mark.

出0入85汤圆

发表于 2009-11-28 08:46:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-3 13:05:31 | 显示全部楼层
很精彩 很好  mark

出0入0汤圆

发表于 2011-10-6 15:02:51 | 显示全部楼层
回复【24楼】Paul
-----------------------------------------------------------------------

MARK

出0入0汤圆

发表于 2012-2-26 18:57:29 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 07:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表