標(biāo)題:
基于pic16f877a的電壓輸出并顯示
[打印本頁(yè)]
作者:
Daoist
時(shí)間:
2017-7-16 10:16
標(biāo)題:
基于pic16f877a的電壓輸出并顯示
捕獲.PNG
(50.23 KB, 下載次數(shù): 178)
下載附件
2017-7-16 10:14 上傳
程序源碼如下
#include <pic.h>
//引腳定義
#define din RC7 //顯示串行數(shù)據(jù)輸入端
#define load RC6 //顯示數(shù)據(jù)鎖存端
#define clk RC5 //顯示時(shí)鐘輸入端
#define DecodeMode 0x09 //譯碼模式
#define Intensity 0x0a //亮度
#define ScanLimit 0x0b //掃描界限
#define ShutDown 0x0c //掉電模式
#define DisplayTest 0x0f //顯示測(cè)試
#define ShutdownMode 0x00 //掉電方式
#define NormalOperation 0x01 //正常操作方式
#define DecodeDigit 0xff //譯碼位數(shù)設(shè)置
#define IntensityGrade 0x08 //顯示亮度級(jí)別設(shè)置
#define ScanDigit 0x07 //掃描位數(shù)設(shè)置
#define TestMode 0x01 //顯示測(cè)試方式
#define TextEnd 0x00 //顯示測(cè)試結(jié)束,正常工作
unsigned char votAJU = 0x00; //是否使用CVRR位置,由RD7控制
unsigned char votCounter =0; //電壓輸出計(jì)數(shù)器
//4MHz下以ms為單位的延時(shí)
void delayMS(unsigned int ms)
{
int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<70;j++);
}
}
//向max7219寫入一個(gè)字節(jié)
void Write_Max7219_byte(unsigned char DATA) //LED寫數(shù)據(jù)函數(shù)
{
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寫入指定位置的數(shù)據(jù),address為位置,dat為數(shù)據(jù)
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); //設(shè)置譯碼模式
Write_Max7219(Intensity,IntensityGrade); //設(shè)置亮度
Write_Max7219(ScanLimit,ScanDigit); //設(shè)置掃描界限
Write_Max7219(ShutDown,NormalOperation); //設(shè)置電源工作模式
Write_Max7219(DisplayTest,TextEnd); //顯示測(cè)試寄存器,寫入00H,實(shí)現(xiàn)正常工作
}
//顯示函數(shù)
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; //設(shè)置端口B為弱上拉電阻,RB為下降沿觸發(fā)中斷
GIE = 1;
INTE = 1;
//允許RB0/INT中斷
}
void initPORT(void) //初始化端口D
{
TRISB0 = 1; //RB0為輸入
TRISC = 0x00; //設(shè)置為輸出
PORTC = 0x00; //輸出都為0
TRISD7 = 0; //RD7為輸入
}
void interrupt INTISR(void)
{
if(INTF == 1) //如果是外部中斷
{
INTF = 0; //清除標(biāo)志
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;
剩下的可下載文件觀看
復(fù)制代碼
作者:
anyeshenren
時(shí)間:
2018-6-13 22:18
6666666666666666
作者:
yyght
時(shí)間:
2018-6-28 14:25
在那里下載?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1