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