?? dianzifuzai.txt
字號(hào):
#include <iom64v.h>
#include <macros.h>
#include <slavr.h>
/*****常用符號(hào)定義 ******/
#define uchar unsigned char
#define uint unsigned int
uchar jsq; //計(jì)數(shù)器,控制負(fù)載是否工作
uchar keys; //判斷鍵盤輸入位數(shù)
uchar s[4],sd; //鍵盤輸入位數(shù)寄存器
uchar fxjd; //方向鍵數(shù)值輸入位計(jì)數(shù)器
uchar sx1=0,sx2=0,sx3=0,sx4=18; //方向鍵輸入位數(shù)寄存器
uchar dian=0; //小數(shù)點(diǎn)輸入判斷,無(wú)法兩次輸入小數(shù)點(diǎn)
uchar ling=0; //零輸入判斷,在小數(shù)點(diǎn)未按下時(shí)無(wú)法連續(xù)兩次輸入零
uint change=0; //電壓檢測(cè)切換標(biāo)志位
uchar work=0; //控制負(fù)載是否工作
uchar work_fs; //工作方式寄存器
uchar sb[4]; //設(shè)定值寄存器
uchar sj_dy[6]; //實(shí)際電壓寄存器
uchar sj_dl[6]; //實(shí)際電流寄存器
uchar data_js; //單片機(jī)接受PC機(jī)發(fā)送數(shù)據(jù)寄存器
uchar data_js_bz; //單片機(jī)串口接收標(biāo)志
uint sj_dyz,sj_dlz; //實(shí)際電壓值、實(shí)際電流值
uchar fs_dyz,fs_dlz,fs_dzz,fs_glz;
float sj_dzz,sj_glz; //實(shí)際采樣電流、電壓值后計(jì)算的電流值
uint sj_dzz_fs,sj_glz_fs;
uint enactment; //設(shè)定值
uchar fs_enactment;
uint chazhi;
uint data_yzdl,data_sjdl;
uint data_yzdz,data_sjdz;
uint data_yzdy,data_sjdy;
uint data_yzgl,data_sjgl;
/*****定義MAX7219寄存器*******/
#define NO_OP 0x00 // 定義空操作 register 控操作寄存器
//#define Digit0 0x01 // 定義數(shù)碼管1 register 數(shù)碼管1寄存器
//#define Digit1 0x02 // 定義數(shù)碼管2 register 數(shù)碼管2寄存器
//#define Digit2 0x03 // 定義數(shù)碼管3 register 數(shù)碼管3寄存器
//#define Digit3 0x04 // 定義數(shù)碼管4 register 數(shù)碼管4寄存器
//#define Digit4 0x05 // 定義數(shù)碼管5 register 數(shù)碼管5寄存器
//#define Digit5 0x06 // 定義數(shù)碼管6 register 數(shù)碼管6寄存器
//#define Digit6 0x07 // 定義數(shù)碼管7 register 數(shù)碼管7寄存器
//#define Digit7 0x08 // 定義數(shù)碼管8 register 數(shù)碼管8寄存器
#define DecodeMode 0x09 // 定義解碼控制 register 譯碼模式寄存器
#define Intensity 0x0a // 定義顯示亮度 register 亮度寄存器
#define ScanLimit 0x0b // 定義掃描限制 register 掃描位數(shù)寄存器
#define ShutDown 0x0c // 定義"shutdown"模式 register 低功耗模式寄存器
#define DisplayTest 0x0f // 定義"display test"模式 register 顯示測(cè)試寄存器
#define ShutdownMode 0x00 // 低功耗方式
#define NormalOperation 0x01 // 正常操作方式
#define ScanDigit 0x07 // 掃描位數(shù)設(shè)置,顯示8位數(shù)碼管
#define DecodeDigit 0x00 // 譯碼設(shè)置,8位均為BCD碼
#define IntensityGrade 0x0a // 亮度級(jí)別設(shè)置
#define TestMode 0x01 // 顯示測(cè)試模式
#define TextEnd 0x00 // 顯示測(cè)試結(jié)束,恢復(fù)正常工作模式
uchar Digit[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //數(shù)碼管1~8寄存器
/**顯示緩存區(qū)(數(shù)碼管顯示源代碼)**/
uchar DisBuffer[31]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xfe,0xb0,0xed,0xf9,0xb3,0xdb,0xdf,0xf0,0xff,0xfb,0x00,0x01,0x06};// 顯示緩存區(qū)
//0 1 2 3 4 5 6 7 8 9 A B C D E F P U 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 清屏 - I
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/****** 定義硬件引腳連接******/
#define DIN 0; //定義PB0連接MAX7219 DIN引腳
#define LOAD 1; //定義PB1連接MAX7219 LOAD引腳
#define CLK 2; //定義PB2連接MAX7219 CLK引腳
#define DIN1 3; //定義PB3連接MAX7219 DIN引腳
#define LOAD1 4; //定義PB4連接MAX7219 LOAD引腳
#define CLK1 5; //定義PB5連接MAX7219 CLK引腳
#define DIN2 6; //定義PB6連接MAX7219 DIN引腳
#define LOAD2 7; //定義PB7連接MAX7219 LOAD引腳
#define CLK2 0; //定義PD0連接MAX7219 CLK引腳
void uart0_tx(uchar x);
/******單片機(jī)初始化**********/
void port_init(void)
{
PORTA = 0xE9;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF; //m103 output only
DDRC = 0x07;
PORTD = 0x03;
DDRD = 0x03;
PORTE = 0x00;
DDRE = 0x08;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x1F;
DDRG = 0x1F;
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x98; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x2F; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
}
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
uart0_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/* 延時(shí)t微秒 */
void delay_us(int t)
{
do
t--;
while(t>1);
}
/*延時(shí)t毫秒*/
void delay_ms(unsigned int t)
{
while(t!=0)
{
delay_us(1000);
t--;
}
}
/* 向第一個(gè)MAX7219寫入字節(jié)(8位)*/
void SendChar (uchar ch)
{
uchar i,temp;
NOP();
for (i=0;i<8;i++)
{
temp=ch&0x80;
ch=ch<<1;
if(temp)
{
PORTB|=(1<<0); //DIN=1
PORTB&=~(1<<2); //CLK=0
PORTB|=(1<<2); //CLK=1
}
else
{
PORTB&=~(1<<0); //DIN=0
PORTB&=~(1<<2); //CLK=0
PORTB|=(1<<2); //CLK=1
}
}
}
/* 第一個(gè)向MAX7219寫入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
PORTB&=~(1<<1); //LOAD=0
NOP();
SendChar(addr);
NOP();
SendChar(num);
NOP();
PORTB|=(1<<1); // 鎖存進(jìn)相應(yīng)寄存器
}
/*第一個(gè)MAX7219初始化 */
void InitDisplay (void)
{
WriteWord (ScanLimit,ScanDigit); // 設(shè)置掃描界限
WriteWord (DecodeMode,DecodeDigit); // 設(shè)置譯碼模式
WriteWord (Intensity,IntensityGrade); // 設(shè)置亮度
WriteWord (ShutDown,NormalOperation); // 設(shè)置為正常工作模式
}
/* 向第二個(gè)MAX7219寫入字節(jié)(8位)*/
void SendChar1 (uchar ch)
{
uchar i,temp;
NOP();
for (i=0;i<8;i++)
{
temp=ch&0x80;
ch=ch<<1;
if(temp)
{
PORTB|=(1<<3); //DIN1=1
PORTB&=~(1<<5); //CLK1=0
PORTB|=(1<<5); //CLK1=1
}
else
{
PORTB&=~(1<<3); //DIN1=0
PORTB&=~(1<<5); //CLK1=0
PORTB|=(1<<5); //CLK1=1
}
}
}
/* 向第二個(gè)MAX7219寫入字(16位)*/
void WriteWord1 (uchar addr,uchar num)
{
PORTB&=~(1<<4); //LOAD=0
NOP();
SendChar1(addr);
NOP();
SendChar1(num);
NOP();
PORTB|=(1<<4); // 鎖存進(jìn)相應(yīng)寄存器
}
/* 第二個(gè)MAX7219初始化 */
void InitDisplay1 (void)
{
WriteWord1 (ScanLimit,ScanDigit); // 設(shè)置掃描界限
WriteWord1 (DecodeMode,DecodeDigit); // 設(shè)置譯碼模式
WriteWord1 (Intensity,IntensityGrade); // 設(shè)置亮度
WriteWord1 (ShutDown,NormalOperation); // 設(shè)置為正常工作模式
}
/* 向第二個(gè)MAX7219寫入字節(jié)(8位)*/
void SendChar2 (uchar ch)
{
uchar i,temp;
NOP();
for (i=0;i<8;i++)
{
temp=ch&0x80;
ch=ch<<1;
if(temp)
{
PORTB|=(1<<6); //DIN1=1
PORTD&=~(1<<0); //CLK1=0
PORTD|=(1<<0); //CLK1=1
}
else
{
PORTB&=~(1<<6); //DIN1=0
PORTD&=~(1<<0); //CLK1=0
PORTD|=(1<<0); //CLK1=1
}
}
}
/* 向第三個(gè)MAX7219寫入字(16位)*/
void WriteWord2 (uchar addr,uchar num)
{
PORTB&=~(1<<7); //LOAD=0
NOP();
SendChar2(addr);
NOP();
SendChar2(num);
NOP();
PORTB|=(1<<7); // 鎖存進(jìn)相應(yīng)寄存器
}
/* 第三個(gè)MAX7219初始化 */
void InitDisplay2 (void)
{
WriteWord2 (ScanLimit,ScanDigit); // 設(shè)置掃描界限
WriteWord2 (DecodeMode,DecodeDigit); // 設(shè)置譯碼模式
WriteWord2 (Intensity,IntensityGrade); // 設(shè)置亮度
WriteWord2 (ShutDown,NormalOperation); // 設(shè)置為正常工作模式
}
/**測(cè)試狀態(tài)指示燈及蜂鳴器子程序**/
void dkcs(void)
{
uchar i;
PORTD&=~(1<<1);
for(i=0;i<=4;i++)
{
PORTG&=~(1<<i);
}
}
/**關(guān)閉測(cè)試狀態(tài)指示燈及蜂鳴器子程序**/
void gbcs(void)
{
uchar i;
PORTD|=(1<<1);
for(i=0;i<=4;i++)
{
PORTG|=(1<<i);
}
}
/**數(shù)碼管初始化顯示子程序**/
void csh(void)
{
uchar i,j;
i=28;
PORTG&=~(1<<0); //默認(rèn)為橫流模式 橫流模式指示燈點(diǎn)亮
/**將三個(gè)數(shù)碼管全部關(guān)閉**/
for (j=0;j<=7;j++)
{
WriteWord (Digit[j],DisBuffer[i]);
WriteWord1 (Digit[j],DisBuffer[i]);
WriteWord2 (Digit[j],DisBuffer[i]);
}
//第一個(gè)數(shù)碼管初始化 顯示“-U- 0.000”
WriteWord (Digit[0],DisBuffer[29]);
WriteWord (Digit[1],DisBuffer[17]);
WriteWord (Digit[2],DisBuffer[29]);
WriteWord (Digit[4],DisBuffer[18]);
WriteWord (Digit[5],DisBuffer[0]);
WriteWord (Digit[6],DisBuffer[0]);
WriteWord (Digit[7],DisBuffer[0]);
//第二個(gè)數(shù)碼管初始化 顯示“-I- 0.000”
WriteWord1 (Digit[0],DisBuffer[29]);
WriteWord1 (Digit[1],DisBuffer[30]);
WriteWord1 (Digit[2],DisBuffer[29]);
WriteWord1 (Digit[4],DisBuffer[18]);
WriteWord1 (Digit[5],DisBuffer[0]);
WriteWord1 (Digit[6],DisBuffer[0]);
WriteWord1 (Digit[7],DisBuffer[0]);
//第三個(gè)數(shù)碼管初始化 顯示“-CC-0.000”
WriteWord2 (Digit[0],DisBuffer[29]);
WriteWord2 (Digit[1],DisBuffer[12]);
WriteWord2 (Digit[2],DisBuffer[12]);
WriteWord2 (Digit[3],DisBuffer[29]);
WriteWord2 (Digit[4],DisBuffer[18]);
WriteWord2 (Digit[5],DisBuffer[0]);
WriteWord2 (Digit[6],DisBuffer[0]);
WriteWord2 (Digit[7],DisBuffer[0]);
}
/****鍵盤掃描函數(shù)****/
uchar keyscan(void)
{
uchar scancode,tmpcode,PC;
uchar i;
tmpcode=0;
//PORTA = 0xED;
//DDRA = 0xFF;
PORTA|=(1<<6);
PORTA|=(1<<7);
PORTC = 0xFF; //m103 output only
DDRC = 0x07;
for(i=0;i<3;i++) //掃描前三個(gè)口
{
PORTC&=~(1<<i); //鍵盤線掃描
scancode=PORTC&0x07; //屏蔽高五位
delay_ms(40); //延時(shí)去抖
PC=PINC&0xf8; //判斷是否有按鍵按下
if(PC!=0xf8) //該行有按鍵按下
{
tmpcode=PC&0xf8;
tmpcode=~tmpcode&~scancode;
}
PORTC = 0xFF; //m103 output only
DDRC = 0x07;
}
for(i=6;i<=7;i++) //掃描后兩個(gè)口
{
PORTA&=~(1<<i); //鍵盤線掃描
scancode=PORTA&0xc0; //屏蔽第六位
scancode=scancode>>6;
scancode=scancode&0x03;
delay_ms(40); //延時(shí)去抖
PC=PINC&0xf8; //判斷是否有按鍵按下
if(PC!=0xf8) //該行有按鍵按下
{
tmpcode=PC&0xf8;
tmpcode=tmpcode|scancode;
}
PORTA|=(1<<6);
PORTA|=(1<<7);
//PORTA = 0xED;
//DDRA = 0xFF;
}
return(tmpcode); //返回鍵值
}
/**按鍵CC子函數(shù)**/
/*******調(diào)用該函數(shù)后狀態(tài)切換到橫流模式********/
void ajcc(void)
{
work_fs=11;
keys=7;
sx1=0,sx2=0,sx3=0,sx4=18;
s[0]=0,s[1]=0,s[2]=0,s[3]=0;
dian=0,ling=0;
PORTD&=~(1<<1);
PORTG&=~(1<<0);
PORTG|=(1<<1);
PORTG|=(1<<2);
PORTG|=(1<<3);
PORTG|=(1<<4);
WriteWord2 (Digit[1],DisBuffer[12]);
WriteWord2 (Digit[2],DisBuffer[12]);
WriteWord2 (Digit[4],DisBuffer[18]);
WriteWord2 (Digit[5],DisBuffer[0]);
WriteWord2 (Digit[6],DisBuffer[0]);
WriteWord2 (Digit[7],DisBuffer[0]);
delay_ms(200);
PORTD|=(1<<1);
}
/**按鍵CU子函數(shù)**/
/*******調(diào)用該函數(shù)后狀態(tài)切換到橫壓模式********/
void ajcu(void)
{
work_fs=12;
keys=7;
sx1=0,sx2=0,sx3=0,sx4=18;
s[0]=0,s[1]=0,s[2]=0,s[3]=0;
dian=0,ling=0;
PORTD&=~(1<<1);
PORTG&=~(1<<1);
PORTG|=(1<<0);
PORTG|=(1<<2);
PORTG|=(1<<3);
PORTG|=(1<<4);
WriteWord2 (Digit[1],DisBuffer[12]);
WriteWord2 (Digit[2],DisBuffer[17]);
WriteWord2 (Digit[4],DisBuffer[18]);
WriteWord2 (Digit[5],DisBuffer[0]);
WriteWord2 (Digit[6],DisBuffer[0]);
WriteWord2 (Digit[7],DisBuffer[0]);
delay_ms(200);
PORTD|=(1<<1);
}
/**按鍵CP子函數(shù)**/
/*******調(diào)用該函數(shù)后狀態(tài)切換到橫功率模式********/
void ajcp(void)
{
work_fs=13;
keys=7;
sx1=0,sx2=0,sx3=0,sx4=18;
s[0]=0,s[1]=0,s[2]=0,s[3]=0;
dian=0,ling=0;
PORTD&=~(1<<1);
PORTG&=~(1<<4);
PORTG|=(1<<0);
PORTG|=(1<<1);
PORTG|=(1<<2);
PORTG|=(1<<3);
WriteWord2 (Digit[1],DisBuffer[12]);
WriteWord2 (Digit[2],DisBuffer[16]);
WriteWord2 (Digit[4],DisBuffer[18]);
WriteWord2 (Digit[5],DisBuffer[0]);
WriteWord2 (Digit[6],DisBuffer[0]);
WriteWord2 (Digit[7],DisBuffer[0]);
delay_ms(200);
PORTD|=(1<<1);
}
/**按鍵CR子函數(shù)**/
/*******調(diào)用該函數(shù)后狀態(tài)切換到橫阻模式********/
void ajcr(void)
{
work_fs=14;
keys=7;
sx1=0,sx2=0,sx3=0,sx4=18;
s[0]=0,s[1]=0,s[2]=0,s[3]=0;
dian=0,ling=0;
PORTD&=~(1<<1);
PORTG&=~(1<<3);
PORTG|=(1<<0);
PORTG|=(1<<1);
PORTG|=(1<<2);
PORTG|=(1<<4);
WriteWord2 (Digit[1],DisBuffer[12]);
WriteWord2 (Digit[2],DisBuffer[10]);
WriteWord2 (Digit[4],DisBuffer[18]);
WriteWord2 (Digit[5],DisBuffer[0]);
WriteWord2 (Digit[6],DisBuffer[0]);
WriteWord2 (Digit[7],DisBuffer[0]);
delay_ms(200);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -