AVR显示问题

2019-03-24 20:32发布

麻烦大家看下程序,数码管显示,检查了好几遍没发现问题,端口也是正确的,就是无法显示。
位选74hc138,段选74hc595
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
unsigned char table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管

void set(uchar m)          //595
{
uchar n,t;
PORTB&=~BIT(4);
for(n=8;n>0;n--)   //数据写入
{
  
  PORTB&=~BIT(5);
  t=(m&0x80);
  if(t==1)
  {
  PORTB|=BIT(6);
  }
  else
  {
  PORTB&=~BIT(6);
  }
  PORTB|=BIT(5);
  m=(m<<1);
  
}//数据输出
PORTB|=BIT(4);


}

void delay()
{
        unsigned int a,b;
        for(a=30;a>0;a--)
        for(b=240;b>0;b--);
}

void main()
{


DDRB=0xff;           //端口初始化
PORTB=0xff;
PORTB|=BIT(7);      //595清0口,低电平有效
PORTB|=BIT(3);      //138设置端口,高电平有效

      


while(1)
{

PORTB&=~BIT(0);        //设置译码器显示位
PORTB&=~BIT(1);      
PORTB&=~BIT(2);
set(table2[1]);              //数据写入
delay();  
}

}
谢谢!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
hnjylijunz
1楼-- · 2019-03-25 13:46
 精彩回答 2  元偷偷看……
hnjylijunz
2楼-- · 2019-03-25 14:04
T的数值永远不会成为0X01的所以你的代码,出现问题了。如果改成我说的那样如果你 M&0X80=T ,与到的结果是0发送一个低电平。当与到的结果是0X80不是0 进入 else  发送一个1过去了。我说的对吗兄弟
为时不晚
3楼-- · 2019-03-25 19:41
hnjylijunz 发表于 2014-4-25 23:43
T的数值永远不会成为0X01的所以你的代码,出现问题了。如果改成我说的那样如果你 M&0X80=T ,与到的结果是0 ...

谢了先,你说的对,是我上边忘了说了,是需要将两个换过来,程序执行之后是正确的

一周热门 更多>