程序源码如下
#include
//引脚定义
#define din RC7 //显示串行数据输入端
#define load RC6 //显示数据锁存端
#define clk RC5 //显示时钟输入端
#define DecodeMode 0x09 //译码模式
#define Intensity 0x0a //亮度
#define ScanLimit 0x0b //扫描界限
#define ShutDown 0x0c //掉电模式
#define DisplayTest 0x0f //显示测试
#define ShutdownMode 0x00 //掉电方式
#define NormalOperation 0x01 //正常操作方式
#define DecodeDigit 0xff //译码位数设置
#define IntensityGrade 0x08 //显示亮度级别设置
#define ScanDigit 0x07 //扫描位数设置
#define TestMode 0x01 //显示测试方式
#define TextEnd 0x00 //显示测试结束,正常工作
unsigned char votAJU = 0x00; //是否使用CVRR位置,由RD7控制
unsigned char votCounter =0; //电压输出计数器
//4MHz下以ms为单位的延时
void delayMS(unsigned int ms)
{
int i,j;
for(i=0;i
{
for(j=0;j<70;j++);
}
}
//向max7219写入一个字节
void Write_Max7219_byte(unsigned char DATA) //LED写数据函数
{
unsigned char i,k;
load=0;
for(i=8;i>=1;i--)
{
clk=0;
k=DATA&0x80;
if(k==0x80)din=1;
else din=0;
DATA<<=1;
clk=1;
}
}
//向max7219写入指定位置的数据,address为位置,dat为数据
void Write_Max7219(unsigned char address,unsigned char dat)
{
load=0;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
load=1;
}
//初始化max7219
void init_max7219(void)
{
Write_Max7219(DecodeMode,DecodeDigit); //设置译码模式
Write_Max7219(Intensity,IntensityGrade); //设置亮度
Write_Max7219(ScanLimit,ScanDigit); //设置扫描界限
Write_Max7219(ShutDown,NormalOperation); //设置电源工作模式
Write_Max7219(DisplayTest,TextEnd); //显示测试寄存器,写入00H,实现正常工作
}
//显示函数
void displayVoltage(unsigned char temp[4])
{
Write_Max7219(0x01,0x0E);
Write_Max7219(0x02,0x0A);
if(RD7 == 1)
{
Write_Max7219(0x03,1);
}
else if(RD7 == 0)
{
Write_Max7219(0x03,0);
}
else
{
}
Write_Max7219(0x04,0x0F);
Write_Max7219(0x05,(temp[0]|0x80));
Write_Max7219(0x06,temp[1]);
Write_Max7219(0x07,temp[2]);
Write_Max7219(0x08,temp[3]);
}
void initINT(void)
{
OPTION = 0x00; //设置端口B为弱上拉电阻,RB为下降沿触发中断
GIE = 1;
INTE = 1;
//允许RB0/INT中断
}
void initPORT(void) //初始化端口D
{
TRISB0 = 1; //RB0为输入
TRISC = 0x00; //设置为输出
PORTC = 0x00; //输出都为0
TRISD7 = 0; //RD7为输入
}
void interrupt INTISR(void)
{
if(INTF == 1) //如果是外部中断
{
INTF = 0; //清除标志
votCounter++;
if(votCounter > 0x0F) //只有16X2种可能
{
votCounter = 0;
}
}
}
void initVotOut(void)
{
CVRR = 1;
CVR3 = 0;
CVR2 = 0;
CVR1 = 0;
CVR0 = 0; //输出1.25V
CVROE = 1; //输出AN2引脚
CVREN = 1; //开启电压输出
}
void main(void)
{
unsigned char vtemp[4];
initPORT(); //端口初始化
initINT();
initVotOut();
init_max7219(); //MAX7219初始化
vtemp[0] = 0;
vtemp[1] = 0;
vtemp[2] = 0;
vtemp[3] = 0; //输出0V
while (1)
{
delayMS(20);
CVRR = RD7;;
if(votCounter == 0x00) //1.25V或者0V
{
CVR3 = 0;
CVR2 = 0;
CVR1 = 0;
CVR0 = 0;
if(RD7 == 1) //CVRR = 1
{
vtemp[0] = 0;
vtemp[1] = 0;
vtemp[2] = 0;
vtemp[3] = 0; //输出0V
}
else if(RD7 == 0)
{
vtemp[0] = 1;
vtemp[1] = 2;
vtemp[2] = 5;
vtemp[3] = 0; //输出1.25V
}
}
else if(votCounter == 0x01) //0.21或1.41V
{
CVR3 = 0;
CVR2 = 0;
CVR1 = 0;
CVR0 = 1;
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』