搜索
bottom↓
回复: 16

张明峰的《PIC单片机入门与实战》第五章,PORTB改写为C程序,与汇编仿真结果不一致,帮忙

[复制链接]

出0入0汤圆

发表于 2010-5-22 19:30:53 | 显示全部楼层 |阅读模式
书上原来是汇编程序,我给修改了用PORTD输出扫描到的按键码,可以正常的显示,按下某个按键,就会显示出某个按键码,延时结束后,LED就会灭掉。而修改成C程序,按下某个按键,可以正常显示按键码,但是延时结束后,仍然显示,直到按新的按键,才会发生变化。可以帮忙修改一下么?谢谢了!
另外,新手,尽量讲的详细一些,谢谢!

Proteus仿真电路以及汇编、C程序ourdev_556000.rar(文件大小:19K) (原文件名:按键中断仿真.rar)

Proteus仿真图片 (原文件名:仿真.jpg)

C源程序,这些都包含在附件中,这个是给不想下附件的看的。
//=============头文件及配置===================
#include<pic.h>
__CONFIG(HS & PROTECT & PWRTEN & BOREN & WDTDIS);
//============全局变量====================
unsigned char KeyCode[8];
unsigned char KeySaved=0x00;
unsigned char KeyCurrent=0x00;
//===========函数声明======================
void KeyCheck(unsigned char KeySaved,unsigned char KeyCurrent);
void Delay(void);
//===========主函数========================
main()
{
        TRISB=0xF0;//PORTB高4位输入,低4位输出
        TRISD=0x00;//PORTD全输出
        PORTD=0x00;//PORTD清零
        PORTB=0x00;//PORTB清零,PORTB=B'11110000'
        RBPU=0;//在C里,NOT_RBPU位即RBPU位,开启PORTB的内部弱上拉
        RBIE=1;//开启PORTB端口引脚状态变化中断
        GIE=1;//开启总中断
        while(1)
        {
                PORTD=0x00;
                PORTB=0x00;
                KeyCheck(KeySaved,KeyCurrent);//按键检测
        }               
}
//==============================================
void interrupt RbInt(void)
{
    unsigned char ScanCode=0xEF;//定义按键扫描
    unsigned int k;
     if(RBIE && RBIF)//判断中断使能和中断标志位
     {
         RBIF=0;//清零中断标志位
         if((PORTB & 0xF0)!=0xF0)//如果有按键按下
            {
                 for(k=0;k<5;k++)
                    {
                       PORTB=ScanCode;//输出初始扫描值,PORTB的引脚上逻辑电平高4为不变
                       if((PORTB & 0xF0)!=0xF0)
                       {
                           KeyCode[KeyCurrent]=PORTB;
                           break;
                          }
                      else
                        {
                           ScanCode=ScanCode>>1;//扫描码循环右移,这个移的乱七八糟的
                                               //不知道是仿真的问题,还是移位的问题
                                              //原理就是低4为依次循环输出0,而其他位为高
                            }
                    }                       
               }
              KeyCurrent++;//当前按键存储偏移位置加1
               KeyCurrent=KeyCurrent & 0x07;//确保按键存储偏移位置小于8
        }
}
//==============================================
void KeyCheck(unsigned char KeySaved,unsigned char KeyCurrent)//按键检测函数
{
       if(KeyCurrent!=KeySaved)//如果当前按键偏移位置和已有的按键偏移位置不相等,则有新的按键
          {
              PORTD=KeyCode[KeySaved];//读保存的按键码
              Delay();//延时显示
              KeySaved = KeyCurrent;//已有按键偏移位置加1,与当前按键偏移位置同步
              //KeySaved = KeySaved & 0x07;//确保按键已存储偏移位置小于8
          }
          else PORTD=0x00;
}
//==============================================
void  Delay(void)//延时
{
   int n;
   for(n=0;n<=5000;n++)
   continue;
}
//==============================================

出0入0汤圆

发表于 2010-5-22 21:14:18 | 显示全部楼层
回复【楼主位】guyanqiu
-----------------------------------------------------------------------
汇编是找到键值,然后显示,延时,关显示;而你的程序是如有按键,显示,延时;若没按键关显示。else  PORTD=0x00;
         显示按键扫描码-------------
        MOVF         INDF,W                                ;读取INDF所指向的地址(当前按键扫描码存储地址)
        MOVWF         PORTD                                ;把扫描码地址输出给PORTD
        CALL         DELAY                                ;延时显示按键扫描码
                CLRF         PORTD                                ;清零PORT
我有疑问,请问一下  for(k=0;k<5;k++) 。这个是循环5次。及K为0,1,2,3,4,都会执行的,而你的按键扫描要移位4次。

出0入0汤圆

 楼主| 发表于 2010-5-22 22:56:22 | 显示全部楼层
我是用11101111,这样,循环5次,只是多浪费一次而已,不然,只循环四次,很麻烦,因为移动的话,PIC里没有51里循环移动的函数,只能一个方向移动,然后补零。我用4次的话,总会出现按键没有反应的情况。

出0入0汤圆

发表于 2010-5-22 23:11:50 | 显示全部楼层
you should check to see how to clear interrupt-on-change flags - read the datasheet on that.

you could also refine your key_scan routine. it is not very efficient. a simpler approach is to output 0x0f on portb, read it back; and then output 0xf0 on portb, read it back. you can figure out the keys pressed by comparing the two reads, :)

出0入0汤圆

 楼主| 发表于 2010-5-22 23:12:05 | 显示全部楼层
//==============================================
void KeyCheck(unsigned char KeySaved,unsigned char KeyCurrent)//按键检测函数
{
        if(KeyCurrent!=KeySaved)//如果当前按键偏移位置和已有的按键偏移位置不相等,则有新的按键
        {
                PORTD=KeyCode[KeySaved];//读保存的按键码
                Delay();//延时显示
                KeySaved = KeyCurrent;//已有按键偏移位置加1,与当前按键偏移位置同步
                //KeySaved = KeySaved & 0x07;//确保按键已存储偏移位置小于8
                PORTD=0x00;//就算加了这句,也还是显示按键的值啊,奇怪了。
        }
        else PORTD=0x00;
}

出0入0汤圆

 楼主| 发表于 2010-5-22 23:18:41 | 显示全部楼层
回复【3楼】millwood0  
you should check to see how to clear interrupt-on-change flags - read the datasheet on that.
you could also refine your key_scan routine.
it is not very efficient. a simpler approach is to output 0x0f on portb,
read it back; and then output 0xf0 on portb, read it back.
you can figure out the keys pressed by comparing the two reads, :)

-----------------------------------------------------------------------
你的意思是用PORTB输出0x0F,然后读回来,然后再输出0xF0,再读回来,然后比较两组读回来的数的不同?
我试试。

出0入0汤圆

 楼主| 发表于 2010-5-23 00:21:56 | 显示全部楼层
//=============头文件及配置===================
#include<pic.h>
__CONFIG(HS & PROTECT & PWRTEN & BOREN & WDTDIS);
//============全局变量====================
unsigned char KeyHigh=0x00;
unsigned char KeyLow=0x00;
unsigned char KeyCode=0x00;
//===========函数声明======================
void KeyCheck(void);
void Delay(void);
//===========主函数========================
main()
{
        TRISB=0xF0;//PORTB高4位输入,低4位输出
        TRISD=0x00;//PORTD全输出
        PORTD=0x00;//PORTD清零
        PORTB=0x00;//PORTB清零,PORTB=B'11110000'
        RBPU=0;//在C里,NOT_RBPU位即RBPU位,开启PORTB的内部弱上拉
        RBIE=1;//开启PORTB端口引脚状态变化中断
        GIE=1;//开启总中断
        RBIF=0;
        while(1)
        {
                TRISB=0xF0;
                PORTD=0x00;
                KeyCheck();//按键检测
        }               
}
//==============================================
void interrupt RbInt(void)
{
        unsigned char i;
        if(RBIE & RBIF)//判断中断使能和中断标志位
        {
                GIE=0;
                RBIE=0;
                RBIF=0;//清零中断标志位
                PORTB=0xF0;//低4位全输出零,若有按键按下,则高4位有0读回
                for(i=0;i<16;i++);
                KeyHigh=~PORTB;//读回取反
                KeyHigh=KeyHigh & 0xF0;//保留高4位,低4位清零
                TRISB=0x0F;               
                PORTB=0x0F;//若有按键,则低4位有0读回。
                for(i=0;i<16;i++);
                KeyLow=~PORTB;
                KeyLow=KeyLow & 0x0F;
                KeyCode=KeyHigh | KeyLow;
                TRISB=0xF0;
                PORTB=0x00;
                PORTD=KeyCode;
                RBIE=1;
                GIE=0;                               
        }
}
//==============================================
void KeyCheck(void)//按键检测函数
{

        if((PORTB & 0xF0)!=0xF0)//如果高4位不全为1,则有新的按键
        {
                PORTD=KeyCode;
                Delay();       
        }
        else PORTD=0x00;
}
//==============================================
void  Delay(void)//延时
{
   int n;
   for(n=0;n<=5000;n++)
   continue;
}
//===============================================
不行啊,这样写的话,只有按着按键的时候才会显示按键码。
而且,仿真的时候,PORTB的高4位和低4位不停的在1111和0000之间循环着。
睡觉去了,明天再研究。
感觉PIC的资料好少啊,51的就多一些。

出0入0汤圆

 楼主| 发表于 2010-5-23 11:20:55 | 显示全部楼层
哈哈,不是单片机学的不明白,而是C没有学明白,我调试的时候,发现KeyCurrent的值是正常,而KeySaved的值在函数KeyCheck()中正常,可是出了函数的范围就又归零了。因为函数中重声明了KeyCurrent和KeySaved变量,就不再是原来的变量了,所以函数结束,并没有改变外部的KeySaved的值。重新修改函数KeyChek(),终于得到想要的结果了。
不过还有一个问题,就是长时间按着一个按键的话,仿真的时候,PORTB低4位引脚电平不停的循环,然后会有黄色的叹号提示:
Simulation is not running in real time due to excessive CPU load。
如果短按键的话,下面的CPU Load才25%左右,不动作4%左右,长按键80%左右。对照汇编程序看了一下,发现汇编是在中断处理结束的时候才清除中断标志位的,把清除中断标志位放到中断函数的末尾,程序终于运行正常了。
还是要学好C,呵呵,基础不扎实啊。
有始有终,下面是修改好的C程序。
//=============头文件及配置===================
#include<pic.h>
__CONFIG(HS & PROTECT & PWRTEN & BOREN & WDTDIS);
//============全局变量====================
unsigned char KeyCode[8];
unsigned char KeySaved=0x00;
unsigned char KeyCurrent=0x00;
//===========函数声明======================
void KeyCheck(void);
void Delay(void);
//===========主函数========================
main()
{
        TRISB=0xF0;//PORTB高4位输入,低4位输出
        TRISD=0x00;//PORTD全输出
        PORTD=0x00;//PORTD清零
        PORTB=0xF0;//PORTB清零,PORTB=B'11110000'
        RBPU=0;//在C里,NOT_RBPU位即RBPU位,开启PORTB的内部弱上拉
        RBIE=1;//开启PORTB端口引脚状态变化中断
        GIE=1;//开启总中断
        while(1)
        {
                PORTD=0x00;
                PORTB=0xF0;
                KeyCheck();//按键检测
        }               
}
//==============================================
void interrupt RbInt(void)
{
        unsigned char ScanCode=0xF7;//定义按键扫描
        unsigned int k;
        if(RBIE && RBIF)//判断中断使能和中断标志位
        {
                //RBIF=0;//清零中断标志位,先清除的话问题多多
                if((PORTB & 0xF0)!=0xF0)//如果有按键按下
                {
                        for(k=0;k<4;k++)
                        {
                                PORTB=ScanCode;//输出初始扫描值,PORTB的引脚上逻辑电平高4为不变
                                if((PORTB & 0xF0)!=0xF0)
                                {
                                        KeyCode[KeyCurrent]=PORTB;
                                        break;
                                }
                                else
                                {
                                        ScanCode=ScanCode>>1;//扫描码循环右移
                                }
                        }
                        KeyCurrent++;//当前按键存储偏移位置加1
                        KeyCurrent=KeyCurrent & 0x07;//确保按键存储偏移位置小于8                               
                 }
        }
        RBIF=0;//清零中断标志位,中断处理完毕再清除,好像就正常了
}
//==============================================
void   KeyCheck(void)//按键检测函数
{
        if(KeyCurrent==KeySaved)
        {
                PORTD=0x00;
        }
        else
        {
                PORTD=KeyCode[KeySaved];//读保存的按键码
                Delay();//延时显示
                PORTD=0x00;
                KeySaved = KeyCurrent;//已有按键偏移位置加1,与当前按键偏移位置同步
         }
}
//==============================================
void  Delay(void)//延时
{
   int n;
   for(n=0;n<=5000;n++)
   continue;
}
//====================================================

出0入0汤圆

发表于 2010-5-23 23:08:20 | 显示全部楼层
here is my idea, implemented in C.

==========cod===================
#define KEY_PORT                        PORTA                //leds on porta. needs to be able to cover the keypad.
#define KEY_SET(bits)                KEY_PORT |= (bits)        //set bits
#define KEY_CLR(bits)                KEY_PORT &=~(bits)        //clear bits
#define KEY_FLP(bits)                KEY_PORT ^= (bits)        //flip bits
#define KEY_IN(bits)                TRISA |= (bits)                //bits as input
#define KEY_OUT(bits)                TRISA &=~(bits)                //bits as output
#define KEY_VERT                        0b110000                        //verticle bits
#define KEY_HORI                        0b000111                        //horizontal bits

unsigned char key_read(unsigned char in_bits, unsigned char out_bits) {                //output on out_bits and read in_bits
        KEY_IN(in_bits);                                                                //set in_bits to be input
        KEY_SET(out_bits); KEY_OUT(out_bits);                         //output 1 on out_bits
        return KEY_PORT & in_bits;
}

unsigned char key_detect(void) {                                        //return the cycle count
        unsigned char tmp1, tmp2;
        tmp2=key_read(KEY_HORI, KEY_VERT);                                //read horizontal scan
        tmp1=key_read(KEY_VERT, KEY_HORI);                                //read vertical scan
        return tmp1 | tmp2;
}

===========================
it reads a matrix keypad without scanningn it. Essentially, it sets the vertical bits (KEY_VERT), and reads the horizontal bits to tmp2 - you know which column has been pressed;

it then repeats the same process but sets the horizontal bits and reads the row.

here is the implementation of it.


(原文件名:16F684 Keypad.PNG)

in this particular case, keypad "8" was pushed. key_detect() returns a value of 0b100001=0x21=33, which is correctly displayed by the lcd.

all you need to do is to look up a table, using the value returned by key_detect() to give you the key pressed.

this approach has the advantage of being fast, and being flexible: you can arbitrarily assign pin-column relationship, sometimes for pcb layout reasons.

hope it helps.

出0入0汤圆

发表于 2010-5-23 23:18:38 | 显示全部楼层
now, it is the same code, with RA5/RA0 swap'd, so the values of KEY_HORI/KEY_VERT changed to

#define KEY_VERT                        0b010001                        //verticle bits
#define KEY_HORI                        0b100110                        //horizontal bits

KEY_VERT basically says that the columns are connected to RA0 and RA4; and KEY_HORI says that the rows are connected to RA5, RA2 and RA1.

the rest of the code is the same.

so when keypad "7" was pushed, key_detect() reports that the RA5 row and RA4 column is pushed (set). thus the value of 48 shows up on the lcd.


(原文件名:16F684 Keypad 2.PNG)

this approach beats out the traditional scanning approach by a long shot, :)

出0入0汤圆

 楼主| 发表于 2010-5-24 09:35:17 | 显示全部楼层
你的方法可以显示按键码,不过测试的时候,那个按键端口不停的闪来闪去的,而且CPU  LOAD的数值也不正常。
是在中断中判断按键码,然后在中断外得到中断时的按键码。

出0入0汤圆

发表于 2010-5-24 09:59:20 | 显示全部楼层
because I was polling the port.

what you can do is to use change on port (portb for example). in the interrupt, you set a flag. and in the main loop(), you poll the port based on the flag.

fairly easy.

出0入0汤圆

 楼主| 发表于 2010-5-24 10:26:33 | 显示全部楼层
你的意思是说在中断中增加一个标志位,这个标志位用来控制按键检测程序。
然后在按键检测程序中控制PORTB的输入输出,来实现按键检测?我试验一下。
还有,想问一个问题,我的7楼的修改完的程序,中,在中断里,如果我先清除中断标志位,程序运行就不正常,而在中断结束时,清除中断标志位,程序就正常,能说明一下么?
我只是看汇编程序是在中断结束时清中断标志位的,才这样修改的。

出0入0汤圆

 楼主| 发表于 2010-5-24 12:11:03 | 显示全部楼层
回复【11楼】millwood0
because i was polling the port.
what you can do is to use change on port (portb for example). in the interrupt, you set a flag. and in the main loop(), you poll the port based on the flag.
fairly easy.

-----------------------------------------------------------------------

你的方法对我来说,还是有点难。

出0入0汤圆

发表于 2010-5-25 09:21:02 | 显示全部楼层
this hopefully will get you on the right track.

============code===============
#include <htc.h>
#include <string.h>
#include "lcd_3wi.h"
#include "delay.h"

__CONFIG(MCLRDIS & WDTDIS & BORDIS & PWRTEN & INTIO);

#define LOOP_PIN                        (1<<5)                                //led indicator, on portC
#define KEY_PORT                        PORTA                                //leds on porta. needs to be able to cover the keypad.
#define KEY_DIR                                TRISA
#define KEY_SET(bits)                KEY_PORT |= (bits)        //set bits
#define KEY_CLR(bits)                KEY_PORT &=~(bits)        //clear bits
#define KEY_FLP(bits)                KEY_PORT ^= (bits)        //flip bits
#define KEY_IN(bits)                KEY_DIR |= (bits)                //bits as input
#define KEY_OUT(bits)                KEY_DIR &=~(bits)                //bits as output
#define KEY_COL                                0b110000                        //column connection bits
#define KEY_ROW                                0b000111                        //row connection bits
#define sleep()                                asm("sleep")                //sleep macro

unsigned char vRAM[17];                                //lcd buffer
const unsigned char str0[]="16F684 KeyScan 2";
const unsigned char str1[]="k=           ";

void mcu_init(void ) {                                //reset the mcu
        ANSEL=0x00;                                                //all pins gpio
        CMCON0=0x07;                                        //analog comparators off
        IRCF2=1, IRCF1=1, IRCF0=0;                //running at 4mhz
        LCD_DIR &=~LOOP_PIN;                                //LOOP_PIN as output
        LCD_CLR(LOOP_PIN);                                //clear loop_pin
}

void uctoa(char *s, unsigned char ul, unsigned char length) {        //convert unsigned long to a string, 3 dps
        unsigned char i;
       
        i=length;
        do {
//                if (i==(length-3)) s[i--]='.';
                s[i--]=ul % 10 + '0';
                ul = ul / 10;
        } while (ul);
}

unsigned char key_read(unsigned char in_bits, unsigned char out_bits) {                //output on out_bits and read in_bits
        KEY_IN(in_bits);                                                                //set in_bits to be input
        KEY_SET(out_bits); KEY_OUT(out_bits);                         //output 1 on out_bits
        return KEY_PORT & in_bits;
}

unsigned char key_detect(void) {                                        //return the cycle count
        unsigned char tmp1, tmp2;
        tmp2=key_read(KEY_ROW, KEY_COL);                                //read horizontal scan
        tmp1=key_read(KEY_COL, KEY_ROW);                                //read vertical scan
        return tmp1 | tmp2;
}

void
main(void)
{        unsigned char t1;
        unsigned char i=0;

        mcu_init();                                                        //initialize the mcu
        lcd_init();                                                        //initialize the lcd
        strcpy(vRAM, str0); lcd_display(LCD_Line0, vRAM);
        while (1){
                KEY_DIR &=~KEY_ROW;                                //row as output
                KEY_PORT |=KEY_ROW;                                //set key_row
                if (KEY_PORT & KEY_COL) {                        //see if a key is pressed
                        t1=key_detect();                        //read the kaypad
                        strcpy(vRAM, str1);
                        uctoa(&vRAM[2], i++, 4);
                        uctoa(&vRAM[8], t1, 4);
                        lcd_display(LCD_Line1, vRAM);
        //                LED_EMIT(LED_A, LED_K); delay_us(t1>>4);
        //                simple_pwm(t1>>4, LED_A, LED_K);
                }
                LCD_FLP(LOOP_PIN);
                //do something else
                //delay_ms(100);
                //TODO Auto-generated main function
        }
}
============end of code=================

the code energies KEY_ROW, and then reads back KEY_COL to see if a key is pressed.

if a key is pressed, it goes into key_detect() to see which key is pressed and displays it on the lcd.


here is the sim.


(原文件名:16F684 keypad detect 3.PNG)

出0入0汤圆

 楼主| 发表于 2010-5-25 15:57:06 | 显示全部楼层
unsigned char key_detect(void)
{
        unsigned char tmp1, tmp2;
        //KEY_ROW =B'000111';KEY_COL=B'110000',假设按下按键为4,则低3位为101,高2位为10,按键码为101 101
        //tmp2=key_read(KEY_ROW, KEY_COL); //扫描行
        TRISA= TRISA | KEY_ROW;//TRISA= 111000 | 000111 = 111111 全输入,
        PORTA= PORTA | KEY_COL;//PORTA= 000101 | 110000 = 110101  ,实际引脚000101,寄存器 110101
        TRISA = TRISA & (~KEY_COL);//TRISA= 111101 & 001111=001101 ,PORTA=110101,引脚100101
        temp2= PORTA & KEY_ROW;//temp2= 110101 & 000111=000101 就是按键码的低 3 位
        //tmp1=key_read(KEY_COL, KEY_ROW); //扫描列
        TRISA = TRISA | KEY_COL;//TRISA = 001101 | 110000 = 111101除按键按下行为输出,其余均为输入
        PORTA = PORTA | KEY_ROW;//PORTA = 100101 | 000111 = 100101
        TRISA = TRISA & (~KEY_ROW);//TRISA=111101 & 111000=111000
        temp1 = PORTA & KEY_COL;//temp1 = 100101 & 110000=100000 就是按键码高2位
        return tmp1 | tmp2; //返回按键码
}
这么理解是否正确?我再试验一下。

出0入0汤圆

 楼主| 发表于 2010-5-25 16:14:41 | 显示全部楼层
//=============头文件及配置===================
#include<pic.h>
__CONFIG(HS & PROTECT & PWRTEN & BOREN & WDTDIS);
//============全局变量====================
unsigned char KeyFlag=0x00;
unsigned char KeyHigh=0x00;
unsigned char KeyLow=0x00;
unsigned char KeyCode=0x00;
//===========函数声明======================
void KeyCheck(void);
void Delay(void);
//===========主函数========================
main()
{
        TRISB=0xF0;//PORTB高4位输入,低4位输出
        TRISD=0x00;//PORTD全输出
        PORTD=0x00;//PORTD清零
        PORTB=0x00;//PORTB清零,PORTB=B'11110000'
        RBPU=0;//在C里,NOT_RBPU位即RBPU位,开启PORTB的内部弱上拉
        RBIE=1;//开启PORTB端口引脚状态变化中断
                RBIF=0;
        GIE=1;//开启总中断
        while(1)
        {
            KeyCheck();//按键检测
        }
}
//==============================================
void interrupt RbInt(void)
{
        if(RBIE && RBIF)//判断中断使能和中断标志位
        {
                        KeyFlag=0x01;
        }
        RBIF=0;//清零中断标志位,中断处理完毕再清除,好像就正常了
}
//==============================================
void   KeyCheck(void)//按键检测函数
{
        if(KeyFlag==0x01)
    {                
            TRISB=TRISB | 0x0F;
            PORTB=PORTB |0xF0;
            TRISB=TRISB & 0x0F;

            KeyLow=PORTB & 0x0F;

            TRISB=TRISB | 0xF0;
            PORTB=PORTB | 0x0F;
            TRISB=TRISB & 0xF0;
       
            KeyHigh=PORTA & 0xF0;

        KeyCode = KeyLow | KeyHigh;
                PORTD=KeyCode;
                Delay();
            KeyFlag=0x00;
    }
    else
    {
        KeyCode=0x00;               
    }        
}
//==============================================
void  Delay(void)//延时
{
   int n;
   for(n=0;n<=5000;n++)
   continue;
}
//====================================================
我这样修改的,可是,按键了,没有反应啊!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 11:43

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

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