捕獲.PNG (50.23 KB, 下載次數: 178)
下載附件
2017-7-16 10:14 上傳
程序源碼如下
- #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;
- 剩下的可下載文件觀看
復制代碼
|