程序源码如下
- #include <pic.h>
- //引脚定义
- #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<ms;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;
- 剩下的可下载文件观看
复制代码
|