打印
[PIC®/AVR®/dsPIC®产品]

PIC16F1939的IO口

[复制链接]
3148|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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号脚只能输入不能输出
你这个片子没去看过,你自己验证下

使用特权

评论回复
5
pizizhu1234|  楼主 | 2014-8-27 13:52 | 只看该作者
yewuyi 发表于 2014-8-27 11:03
你看不看手册?

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

LATA=0x67;是作输出脚的.A口输出,B口读.A0-A3输出.用B3-B7去读.

使用特权

评论回复
6
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;
            }
}
我这样写读出来就是对的.太奇怪了.

使用特权

评论回复
7
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

数据手册看过无数遍了.没找到什么原因.不存在硬件不对的情况.板子是前辈设计的.前辈的程序能扫出来.但是没有源程序.

使用特权

评论回复
8
pizizhu1234|  楼主 | 2014-8-27 14:04 | 只看该作者
最重要的是其他口都能正常的读取.唯独A=0x67;的时候读不出来.

使用特权

评论回复
9
tergy2012| | 2014-8-27 16:46 | 只看该作者
程序,看不懂这些代码,学习学习

使用特权

评论回复
10
zhimagod| | 2014-8-28 08:05 | 只看该作者
帮你猜一下:看看是不是被编译器优化掉了……

使用特权

评论回复
11
pizizhu1234|  楼主 | 2014-8-28 12:12 | 只看该作者
本帖最后由 pizizhu1234 于 2014-8-28 12:13 编辑

谢谢各位.自己想到问题所在了.
while(0xF8!=temp)
这句前面加上
LATA=0x60;
NOP();            NOP();
temp=PORTB;
就搞定了.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

31

帖子

0

粉丝