📄 pic-595.c
字号:
#include <pic.h>
#define CLK_595 RC3 // 移位时钟----------74HC595 11#
//#define LOAD_595 RC4 //锁存时钟----------74HC595 12#
#define LOAD_595 RC0 //锁存时钟----------74HC595 12#
#define DATA_595 RC5 //数据--------------74HC595 14#
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
unsigned int ADC_Value;
unsigned long a;
unsigned char flag;
void delay_1ms(void);
void delay_nms(unsigned int n);
void sendbyte(unsigned int data);
void out595(void);
void spiintial(void);
void Display(unsigned int dat,unsigned char DotPosition,unsigned char ClearZeroFlag);
//---------------8位2进制段代码对应数码管笔段 hcdb afge----------------//
const displaycode[] = {0x82,0xaf,0xc4,0x85,0xa9,0x91,0x90,0xa7,0x80,0x81,
0xa0,0x98,0xd2,0x8c,0xd0,0xf0,0xfd,0xff};//0-9,A-F,-,全灭
uchar PortCode[8] = {0,0,0,0,0,0,0,0};
void delay_1ms(void)
{
unsigned int b;
for (b=0;b<150;b++);
}
void delay_nms(unsigned int n)
{
unsigned int c=0;
for (c=0;c<n;c++)
delay_1ms();
}
/**************************************************595显示程序*****************************************************/
/*SPI显示子程序*/
void Display(unsigned int dat,unsigned char DotPosition,unsigned char ClearZeroFlag)
{
unsigned char i;
for(i = 0; i != 8; i++)
{
if(i == DotPosition)/// 小数点处理
{
PortCode[i] = (displaycode[(dat%10)]&0x7f);
}
else
PortCode[i] = displaycode[dat%10];
if(ClearZeroFlag&&(!dat)&&(i>DotPosition)) PortCode[i]=0xff;
dat /= 10;
}
sendbyte(PortCode[0]);
sendbyte(PortCode[1]);
sendbyte(PortCode[2]);
sendbyte(PortCode[3]);
sendbyte(PortCode[4]);
sendbyte(PortCode[5]);
sendbyte(PortCode[6]);
sendbyte(PortCode[7]);
out595();
}
void sendbyte(unsigned int data) //595 发送数据函数
{
LOAD_595 =1;
SSPBUF=data; /*启动发送*/
while(SSPIF==0); /*等待发送完毕*/
SSPIF=0; /*清除SSPIF标志*/
}
void out595(void) // 打开锁存,显示
{
LOAD_595=0;
asm("nop");
LOAD_595=1;
}
/*********************************ADC转换***********************************************/
/*
void interrupt timer0_ADC_isr(void)
{
// unsigned int ADC_Value;
//unsigned char i;
if(T0IF==1)//TMR0定时1mS时间到
{
T0IF=0;//清TMR0溢出标志位
TMR0=256-4;//重新装入TMR0的定时1mS初值
//共阴数码管动态显示扫描程序段
PORTD=LEDDATA[LEDBuffer[ScanLEDCount]];
PORTE=ScanLEDCount;
ScanLEDCount++;
if(ScanLEDCount==sizeof(LEDBuffer))ScanLEDCount=0;
}
if(ADIF==1)//AD转换结束
{
ADIF=0;//清A/D转换结束标志
ADC_Value=(unsigned int)ADRESH*256+ADRESL;//读取A/D转换的结果
ADGO=1;//启动A/D转换开始
}
}
*/
/***********************************************************************************/
/***********************************************************************************/
void spiintial(void) //spi初始化
{
SSPCON=0x32; //主控方式,空闲时时钟为高电平,时钟为:Fosc/4
SSPSTAT=0xc0; //SCK上升沿数据传送。
TRISC3=0; //SCK时钟输出引脚。
TRISC0=0; //输出锁存器控制脉冲(595-12)
TRISC5=0; //串行数据输出引脚。
//INTCON= 0x80;// GIE=1,开总中断,595显示不用开中断
}
void adcintial(void) //ad初始化
{
ADCS1=1;//设置ADC的时钟为fosc/32
ADCS0=0;
CHS2=0;//选择A/D转换的通道0
CHS1=0;
CHS0=0;
//ADCON1: ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
ADFM=1;//转换的数据格式为右对齐
PCFG3=0;//设置AN0-AN5为模拟输入端,RE0(AN5)-RE2(AN7)为数字IO,VREF+=VDD,VREF-=VSS
PCFG2=0;
PCFG1=1;
PCFG0=0;
/*
TMR0=256-4;//定时1mS的初值装入TMR0
T0CS=0;
PSA=0; ///分频器
T0IF=0;//清TMR0溢出标志
T0IE=1;//允许TMR0溢出中断
*/
ADIF=0;//清A/D转换结束标志
ADIE=1;//允许A/D转换中断
PEIE=1;//启动中断的第二梯队
//GIE=1;//CPU开中断
// ADON=1;//启动A/D工作
// ADGO=1;//A/D转换开始
}
/*****************************************************************************************************
主函数
****************************************************************************************************/
void main()
{
spiintial(); //SPI初始化
adcintial(); //ad初始化
PEIE=1;//启动中断的第二梯队
GIE=1;//CPU开中断
ADON=1;//启动A/D工作
ADGO=1;//A/D转换开始
while(1)
{
if(ADIF==1)//AD转换结束
{
ADIF=0;//清A/D转换结束标志
ADC_Value=(unsigned int)ADRESH*256+ADRESL;//读取A/D转换的结果
ADGO=1;//启动A/D转换开始
}
a++;
Display(a,3,0);
delay_nms(50);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -