PIC单片机william hill官网
直播中

胡淳

7年用户 23经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

pic12f675+74HC595驱动数码管(求助)

pic12f675与pic12f629两种不同型号的单片机共用一个说明书,675比629多了数模转换,功能要多一些,本人想利用675的数模转换来设计制作一个显示电压、电流、电量的多功能表,首先在利用74HC595来驱动数码管这一关就无法通过,但相同的程序用pic12629则能够顺利通过,本人认为可能是对675的设置没有对,特向高手们求助。以下是我编写的程序:


#include  //pic12f629通过,但pic12f765没有任何反应
__CONFIG(0x3F84);
//两块74HC595级联,前一块驱动段,后一块驱动位,驱动的是共阴四位数码管
//本程序依次驱动八位数码管,显示01234567,12345678,23456789,……,89AbCdEF,.....
#define SH_CP GPIO0  // 74HC595时钟输入
#define DS GPIO1  // 74HC595数据端口
#define ST_CP GPIO4  // 74HC595数据锁存
#define uchar unsigned char
#define uint unsigned int
void delay(uint);
void xians(uchar);

const uchar LED[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//段选
const uchar WEI[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};  //位选

main()
{
uint x,y,z,m;
OPtiON=0b10000000; //禁止弱上拉

WPU= 0x00; //关闭弱上拉

TRISIO=0; //IO 口做输出

CMCON=0x3f; // 设置全部为普通数字IO口 关闭所有比较器

GPIO=0x00; //端口0 输出低电平

while(1)
{
     for(x=0;x<17;x++)
   {  
     for(z=0;z<500;z++)
     {              
      for(y=0;y<8;y++)
      {  
      xians(WEI[y]);
      m=x+y;
      if(m<16);
       else m=m-16;
       xians(LED[m]);
      ST_CP=0;
       asm("NOP");
       asm("NOP");      
      ST_CP=1;
        asm("NOP");
        asm("NOP");
       ST_CP=0;
      }
     }
     delay(20);
  }   
}

}

void delay(uint x)  //短暂延时程序

{

uint a,b;

for(a=x;a>0;a--)

for(b=100;b>0;b--);

}
void xians(uchar udata)  //将数据写入74HC164
{
  uchar i;
   for (i=0;i<8;i++)  
  {
    if(udata&0x80)
    {
      DS=1;
     SH_CP=0;
    asm("NOP");
    asm("NOP");
    SH_CP=1;
    udata = udata<<1;
    }
    else
    {
     DS=0;
    SH_CP=0;
    asm("NOP");
    asm("NOP");
    SH_CP=1;
    udata = udata<<1;
    }

  }
}

回帖(7)

伏尔加的鱼

2018-6-15 18:18:21
动态扫描要在一定时间内完成,建议用中断函数。另外你的74HC595程序代码写了还要看硬件威廉希尔官方网站 是否正确,有输出使能脚和数据寄存器清零引脚,如果连接错了肯定不会正常显示
举报

胡淳

2018-6-16 13:08:26
引用: 伏尔加的鱼 发表于 2018-6-15 18:18
动态扫描要在一定时间内完成,建议用中断函数。另外你的74HC595程序代码写了还要看硬件威廉希尔官方网站 是否正确,有输出使能脚和数据寄存器清零引脚,如果连接错了肯定不会正常显示

谢谢你的指导,硬件威廉希尔官方网站 肯定没有问题,因为我用12f629接上后能够正常显示,所以说问题一定是出在12F675的设置上。
举报

ljmcu

2018-6-17 20:11:02
管脚上拉要记得。
举报

胡淳

2018-6-23 11:35:57
已经解决。在主函数中增加了如下语句:
ANSEL=0X0c;//将IO0(AN0)IO1(AN1)A两个端口作为普通I/O口
同时关闭比较器也很重要:
CMCON=0x07; // 关闭比较器,很重要,特别是低三位全部为1才能关闭比较器,(系统默认低三位全为零)使IO0和IO1为数字口。
举报

朱仁进

2018-6-23 14:49:54
来好好看一下   
举报

CHNlyt

2018-6-23 16:10:08
看不出错误
举报

黃鐙漢

2018-7-11 20:32:42
TRISIO=0; //IO 口做输出

ANSEL = 0x00;         //<===請加入

CMCON=0x3f; // 设置全部为普通数字IO口 关闭所有比较器
举报

更多回帖

发帖
×
20
完善资料,
赚取积分