程序源码如下
#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;
上一篇:LCD+PIC单片机12864串行显示程序
下一篇:PIC 16f877a PORTB State Change Interrupt仿真与源码
推荐阅读最新更新时间:2024-11-02 11:21
设计资源 培训 开发板 精华推荐
- AD8034AR高速单位增益峰值检测器的典型应用电路
- ICE3BS02 使用 ICE3BS02 设计 SMPS Adapter 以通过共模雷电浪涌测试
- 正方形版-FE.1S一拖四集线器
- ADA4610-2BRZ-RL 正峰值检波器运算放大器的典型应用电路
- TDA7292 40 W + 40 W 立体声放大器的典型应用,带静音和待机功能
- GD32F450扩展板
- 具有备用电池的 LTC3245HMSE 宽输入电压 5V 电源的典型应用电路
- STEVAL-ISA101V1,使用 L5973D 的演示板,具有 4 V/36 V 输入电压范围的 2 A 直流降压开关稳压器
- LT3763HFE 1A、五个 LED 驱动器的典型应用电路
- AD8532ARZ-REEL 用于多媒体和汽车应用的单电源、平衡线路驱动器的典型应用