打印
[AVR单片机]

M16某些口读写问题

[复制链接]
1966|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
szliychlw|  楼主 | 2010-12-8 23:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
airwill| | 2010-12-10 12:49 | 只看该作者
没有道理的, 楼主测试一下, 在什么条件的时候会 "读不到"? 这个跟 DDR* 没有关系.

使用特权

评论回复
板凳
szliychlw|  楼主 | 2010-12-10 21:56 | 只看该作者
是不是某些口有第二功能,在一般的读写中要做一些设置啊

使用特权

评论回复
地板
airwill| | 2010-12-13 21:15 | 只看该作者
读 PIN 的电平是没有关系的.

看 IO 逻辑图, 除了 SLEEP 信号能够关闭输入通道外, 只要使能数字功能, 就一定能够读 PIN 的电平.

使用特权

评论回复
5
szliychlw|  楼主 | 2010-12-15 00:26 | 只看该作者
真的读不了,是不是某些口被禁用了?或者需要把第二功能禁用呢?

使用特权

评论回复
6
恒宇| | 2010-12-15 21:25 | 只看该作者
no你不设置哪来的第二功能?
贴出程序来。

使用特权

评论回复
7
chenczy| | 2010-12-17 17:47 | 只看该作者
上程序最明白

使用特权

评论回复
8
szliychlw|  楼主 | 2010-12-20 22:16 | 只看该作者
本帖最后由 szliychlw 于 2010-12-21 22:44 编辑

#include<iom16v.h>
#include<macros.h>

#define uchar unsigned char
#define uint  unsigned int

#include"DELAY.C"  //延时函数文件
#include"LED.C" //LED显示值函数文件

uchar flag=0;
uchar keydata=0;
/********************************************************************
按键是否存在的扫描函数,按键时为低电平有效
*******************************************************************/
KeyScan()
{
  uchar key;
  key=PINC; //从PC口读取按键
  if(!(key&0X40))   //有按键按下
  {
    Delayms(80);//延时10 MS,去抖动
        key=PINC;
        if(!(key&0X40))
         {
           flag=1;
          }
        else
     {
       flag=0;
     }
   }
   else
   {
     flag=0;
    }
  return flag;
}
/*********************************************************************
键值取得函数
**********************************************************************/
KeyGet()
{
   
        if(KeyScan())
        {
          keydata++;    //单键累加,每按一次累加1
          if(keydata==8)//键值累加到8归零
          keydata=0;
         }
        return keydata;
  }
/**********************************************************************
  主函数
***********************************************************************/
void main()
{
   uchar buffer[]={0,0,0,0};
   uchar keyv;
   DDRC|=(1<<PC6);
   PORTC|=(1<<PC6); //PC6带上拉
   DDRC&=(~(1<<PC6)); //配置PC6为键输入口
   while(1)
   {
   keyv=KeyGet();//获取键值
   switch(keyv)
   {
     case 0: buffer[0]=0;break;  //根据键值累加值送显示
     case 1: buffer[0]=1;break;
     case 2: buffer[0]=2;break;
     case 3: buffer[0]=3;break;
     case 4: buffer[0]=4;break;
     case 5: buffer[0]=5;break;
     case 6: buffer[0]=6;break;
     case 7: buffer[0]=7;break;
         default:break;
         }
         
         LEDdispayer(buffer);//显示
         Delayms(100);
        }
}


//以上是简单的单键累加程序,按键低电平有效。如果我选用的是PC6,按键一次LED显示累加1,但是如果我选用PC5,LED的值一直在累加跳动,根本就不用按键,说明PC5一直处于低电平。换了一个M16 IC还是一样,不知为何?各位大哥帮帮忙,还有我这样写程序风格妥不妥?

使用特权

评论回复
9
CIOneTwo| | 2010-12-21 10:44 | 只看该作者
if(!(key&0X40)) <>if(!(key&0X20))???

使用特权

评论回复
10
szliychlw|  楼主 | 2010-12-21 22:46 | 只看该作者
sorry,试了几个口,没改彻底,但是硬件上跑的效果有了。PC5调试时LED上的数据一直在累加跳动。

使用特权

评论回复
11
帝霸| | 2010-12-21 23:55 | 只看该作者
只有PC5异常吗?

使用特权

评论回复
12
szliychlw|  楼主 | 2010-12-24 21:21 | 只看该作者
还有其他口异常

使用特权

评论回复
13
senzh01| | 2010-12-24 22:43 | 只看该作者
pc口默认是jatg打开。我也是深受其害过!!关闭就好了!!

使用特权

评论回复
14
szliychlw|  楼主 | 2010-12-28 21:48 | 只看该作者
谢谢。除了PC口还有其他口有这种默认第二功能吗,如果是这样的话,刚开始就要先禁用JATG了,但是禁用后JATA仿真和写入这些功能不是用不了了吗?

使用特权

评论回复
15
yangbinge| | 2010-12-30 10:43 | 只看该作者
看看该口是不是有第二功能 ,比如JTAG。

使用特权

评论回复
16
szliychlw|  楼主 | 2011-1-9 21:13 | 只看该作者
像这个JTAG,如果禁用了,写程序,仿真什么的就没办法了吧?

使用特权

评论回复
17
yangbinge| | 2011-1-10 13:45 | 只看该作者
没办法 。你要想用这个IO口,就得禁用 JTAG。
可以用串行下载程序, 不一定非要用JTAG。

使用特权

评论回复
18
宇容创行| | 2011-1-11 21:41 | 只看该作者
也可以在程序里面把jtag做io用

使用特权

评论回复
19
szliychlw|  楼主 | 2011-1-12 00:20 | 只看该作者
M16默认情况下,有几个口的第二功能是启用的呢

使用特权

评论回复
20
张颖宏| | 2011-10-23 19:45 | 只看该作者
谢谢,苦恼几天的C口,终于解决了

使用特权

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

本版积分规则

5

主题

141

帖子

2

粉丝