[PIC®/AVR®/dsPIC®产品] PIC16F1939的IO口

[复制链接]
 楼主| pizizhu1234 发表于 2014-8-27 10:53 | 显示全部楼层 |阅读模式
INT8U Key_Scan()
{
    TRISB=0xF8;     //
    ANSELB=0x00;
    PORTB=0xF8;     // PORTB &= 0xF8;
    nWPUEN=0;
    WPUB=0xF8;

    TRISA=0x60;     //
    LATA=0x60;

    INT8U temp,the_key=-1;

    temp=PORTB;
//    LCD_PRINT_NUM(1,5,temp);
    if(0xF8!=temp)
    {
        Delay(800);
//        temp=PORTB;
//        LCD_PRINT_NUM(1,10,temp);
//        if(0xF8!=temp)
//        {
            LATA=0x6E;
            NOP();            NOP();
            temp=PORTB;
            switch (temp)
            {
                case 0xF0:the_key=0;break;                case 0xE8:the_key=1;break;
                case 0xD8:the_key=2;break;                case 0xB8:the_key=3;break;
                case 0x78:the_key=4;break;
            }

            LATA=0x6D;
            NOP();            NOP();
            temp=PORTB;
            switch (temp)
            {
                case 0xF0:the_key=5;break;                case 0xE8:the_key=6;break;
                case 0xD8:the_key=7;break;                case 0xB8:the_key=8;break;
                case 0x78:the_key=9;break;
            }

            LATA=0x6B;
            NOP();            NOP();
            temp=PORTB;
            switch (temp)
            {
                case 0xF0:the_key=10;break;                case 0xE8:the_key=11;break;
                case 0xD8:the_key=12;break;                case 0xB8:the_key=13;break;
                case 0x78:the_key=14;break;
            }

//            TRISA=0x60;     //
            LATA=0x67;
            NOP();            NOP();
            temp=PORTB;
//            LCD_PRINT_NUM(1,15,temp);
            switch (temp)
            {

                case 0xF0:the_key=15;break;                case 0xE8:the_key=16;break;
                case 0xD8:the_key=17;break;                case 0xB8:the_key=18;break;
                case 0x78:the_key=19;break;
            }

            while(0xF8!=temp)
            {
                Delay(800);
                LATA=0x60;
                NOP();                NOP();
                temp=PORTB;
                while(0xF8!=temp)
                {
                    Delay(800);
                    LATA=0x60;
                    NOP();                    NOP();
                    temp=PORTB;
                }
                Delay(800);
            }
//        }
    }
    return the_key;
}

初学PIC.在LATA=0x67的那一段代码扫描不到按键.其他正常显示.求高手帮忙看看哪里的问题.程序还有别的问题也可以指点一下


yewuyi 发表于 2014-8-27 11:03 | 显示全部楼层
你看不看手册?

LATA是输出锁存器,它怎么可能做输入信号读取使用呢?
yewuyi 发表于 2014-8-27 11:03 | 显示全部楼层
读,应该是PORTA
zhimagod 发表于 2014-8-27 13:29 | 显示全部楼层
注意PIC的A口一般3号脚只能输入不能输出
你这个片子没去看过,你自己验证下
 楼主| pizizhu1234 发表于 2014-8-27 13:52 | 显示全部楼层
yewuyi 发表于 2014-8-27 11:03
你看不看手册?

LATA是输出锁存器,它怎么可能做输入信号读取使用呢?

LATA=0x67;是作输出脚的.A口输出,B口读.A0-A3输出.用B3-B7去读.
 楼主| pizizhu1234 发表于 2014-8-27 13:57 | 显示全部楼层
zhimagod 发表于 2014-8-27 13:29
注意PIC的A口一般3号脚只能输入不能输出
你这个片子没去看过,你自己验证下 ...

temp=PORTB;
    if(0xF8!=temp)
    {
        Delay(800);

            LATA=0x67;
            NOP();            NOP();
            temp=PORTB;
            switch (temp)
            {

                case 0xF0:the_key=15;break;                case 0xE8:the_key=16;break;
                case 0xD8:the_key=17;break;                case 0xB8:the_key=18;break;
                case 0x78:the_key=19;break;
            }
}
我这样写读出来就是对的.太奇怪了.
 楼主| pizizhu1234 发表于 2014-8-27 14:03 | 显示全部楼层
RA0
1. VCAP (由配置字寄存器使能)
2. SEG12 (LCD)
3. SRNQ (SR锁存器)
4. C2OUT (比较器)
5. RA0
RA1
1. SEG7 (LCD)
2. RA1
RA2
1. COM2 (LCD)
2. DACOUT (DAC)
3. RA2
RA3
1. COM3 (LCD) ,仅 28 引脚器件
2. SEG15 (LCD)
3. RA3

数据手册看过无数遍了.没找到什么原因.不存在硬件不对的情况.板子是前辈设计的.前辈的程序能扫出来.但是没有源程序.
 楼主| pizizhu1234 发表于 2014-8-27 14:04 | 显示全部楼层
最重要的是其他口都能正常的读取.唯独A=0x67;的时候读不出来.
tergy2012 发表于 2014-8-27 16:46 | 显示全部楼层
程序,看不懂这些代码,学习学习
zhimagod 发表于 2014-8-28 08:05 | 显示全部楼层
帮你猜一下:看看是不是被编译器优化掉了……
 楼主| pizizhu1234 发表于 2014-8-28 12:12 | 显示全部楼层
本帖最后由 pizizhu1234 于 2014-8-28 12:13 编辑

谢谢各位.自己想到问题所在了.
while(0xF8!=temp)
这句前面加上
LATA=0x60;
NOP();            NOP();
temp=PORTB;
就搞定了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

31

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部