这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 合作大赛 » I0口给我弄糊涂了

共11条 1/2 1 2 跳转至

I0口给我弄糊涂了

助工
2009-12-22 20:55:48     打赏

以下是我程序一段,我本想用P0口前四位和后四位做个4*4的键盘
就在while的后面四名哈,读P0具然出现了0xFF,莫名其妙,难道又是手册没看好?
还是芯片。。。。。。?
  PCR0=0x0F;        //就是这里开始的
  P0 = 0x0F;       
  PUCR0 = 0x0F;
  delay(20);
  middle1 = P0 ; //middle1具然出现了0XFF

以下是我的程序:

#include "REG8051.h"
#include <stdio.h>
#include "INTRINS.h"

sbit LED1=P1^0;
unsigned char i;
unsigned char middle1;
unsigned char middle2;
unsigned char KEYDATA;
void delay(int delaytimes);
void soundpwm();
main()
{
   
    PCON|=0x02;     /* 使能外部时钟 */
 PCR0=0xFF;
 PUCR0 = 0xFF;
 P0=0x00;


    PCR1=0xFF;
    PUCR1 = 0xFF;              //P1带上拉
 P1 = 0x00;
  
 for(i=0;i<3;i++)
    {
     LED1 = 1;
     delay(30000);
     LED1 = 0;
     delay(30000);
    }
 
     while(1)
 {
  //PCR0=(1<<3)|(1<<2)|(1<<1)|(1<<0);
  PCR0=0x0F;
  P0 = 0x0F;
  PUCR0 = 0x0F;
  delay(20);
  middle1 = P0 ;

   
 
   

  if((middle1&0xF0) != 0)
  {
         //LED1 =1;              //LED1亮了
         PCR0 = 0xFF; 
         P0 = 0xF0;
         PUCR0 = 0xF0;
         delay(20);
         middle2 = P0;
         if((middle2 & 0x0f) != 0)
         {
          KEYDATA = middle1 |middle2;
          LED1 = 1;
          soundpwm();   
      }
         else
         {
          LED1 = 0;
         }
  }
 }
 
 
}

   void delay(int delaytimes)
{
  int i;
  for(i=0;i<delaytimes;i++)
  {
     _nop_();
  }
}

void soundpwm()
{
 PWMCKS=0xFC;    /* PWM TIMER period register;conversion freq =system clock/2/512=5kHz;
             PWM pulse freq =11.0592MHz/1024=10.8KHz */
 PWM0L=0x00;     /* 25% */
 PWM0H=0xFD;
 PWM1L=0x00;     /* 50% */
 PWM1H=0xFE;
 PWM2L=0x00;     /* 75% */
 PWM2H=0x00;
}




关键词: 给我弄     涂了    

高工
2009-12-22 23:01:53     打赏
2楼

高手都来给楼主支招吧!


专家
2009-12-23 09:00:21     打赏
3楼
是的,我同意3楼的观点,一般的P0口都需要外加上拉电阻。
除此以外,读了一下你的程序,P0口~P3口都是准双向口,在使用的时候需要先将其赋值为0xFF,即P0=0xFF,然后再将其赋值为你所需要的。这里涉及一个准双向口的概念,建议你在这个时候去了解并学习这方面的知识,你会印象深刻并受益匪浅的。
有了新的消息别忘了到这里和大家分享啊!

助工
2009-12-23 12:45:38     打赏
4楼

楼上的兄弟,我是想4*4键盘,4输出F,4是输入0,你都FF,那不都输出了吗,在说时代明芯的手册已说明了P0是带上拉的啊,你说的FF我都试了,键盘根本扫不出来,全是输出怎么会有输入,


专家
2009-12-23 14:17:50     打赏
5楼
main()
{
   
    PCON|=0x02;     /* 使能外部时钟 */
 PCR0=0xFF;
 PUCR0 = 0xFF;
 P0=0xFF;     //
 delay(20);   //
 P0=0x00;

      .
      .
      .
     while(1)
 {
  //PCR0=(1<<3)|(1<<2)|(1<<1)|(1<<0);
  PCR0=0x0F;
  P0 = 0x0F;
  PUCR0 = 0x0F;
  delay(20);
  middle1 = P0 ;

你这里的P0口应该是先定义以后再赋值,

     while(1)
 {
  //PCR0=(1<<3)|(1<<2)|(1<<1)|(1<<0);
  PCR0=0x0F;
  PUCR0 = 0x0F;
  P0 = 0x0F;
  delay(20);
  middle1 = P0 ;

希望能够帮上你

助工
2009-12-23 15:21:32     打赏
6楼

等我晚上试下哈,先谢了先


助工
2009-12-24 08:56:13     打赏
7楼

试了下,不行. ,我以前用过STC的,没有这么费劲的,难道。。。。。。。。这么老多参赛队,一个没遇到我这样的毛病,还是连句真话都不敢说呢?


专家
2009-12-24 12:03:03     打赏
8楼

菜鸟
2009-12-24 17:42:08     打赏
9楼
给你个建议,你看看是不是电路问题。你在断开和单片机连接时候按下按键,看对应的P0高四位接口位是否为低?

助工
2009-12-24 19:11:31     打赏
10楼

问题解决哈,原来开发板的背面有上拉电阻输,我的按键是拉不过它的,我改进了一下程序,哈,好用了,谢谢,大家,祝大家,圣旦快乐


共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]