📄 dianzifuzai.txt
字号:
#include <iom64v.h>
#include <macros.h>
#include <slavr.h>
/*****常用符号定义 ******/
#define uchar unsigned char
#define uint unsigned int
uchar jsq; //计数器,控制负载是否工作
uchar keys; //判断键盘输入位数
uchar s[4],sd; //键盘输入位数寄存器
uchar fxjd; //方向键数值输入位计数器
uchar sx1=0,sx2=0,sx3=0,sx4=18; //方向键输入位数寄存器
uchar dian=0; //小数点输入判断,无法两次输入小数点
uchar ling=0; //零输入判断,在小数点未按下时无法连续两次输入零
uint change=0; //电压检测切换标志位
uchar work=0; //控制负载是否工作
uchar work_fs; //工作方式寄存器
uchar sb[4]; //设定值寄存器
uchar sj_dy[6]; //实际电压寄存器
uchar sj_dl[6]; //实际电流寄存器
uchar data_js; //单片机接受PC机发送数据寄存器
uchar data_js_bz; //单片机串口接收标志
uint sj_dyz,sj_dlz; //实际电压值、实际电流值
uchar fs_dyz,fs_dlz,fs_dzz,fs_glz;
float sj_dzz,sj_glz; //实际采样电流、电压值后计算的电流值
uint sj_dzz_fs,sj_glz_fs;
uint enactment; //设定值
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 // 定义数码管1 register 数码管1寄存器
//#define Digit1 0x02 // 定义数码管2 register 数码管2寄存器
//#define Digit2 0x03 // 定义数码管3 register 数码管3寄存器
//#define Digit3 0x04 // 定义数码管4 register 数码管4寄存器
//#define Digit4 0x05 // 定义数码管5 register 数码管5寄存器
//#define Digit5 0x06 // 定义数码管6 register 数码管6寄存器
//#define Digit6 0x07 // 定义数码管7 register 数码管7寄存器
//#define Digit7 0x08 // 定义数码管8 register 数码管8寄存器
#define DecodeMode 0x09 // 定义解码控制 register 译码模式寄存器
#define Intensity 0x0a // 定义显示亮度 register 亮度寄存器
#define ScanLimit 0x0b // 定义扫描限制 register 扫描位数寄存器
#define ShutDown 0x0c // 定义"shutdown"模式 register 低功耗模式寄存器
#define DisplayTest 0x0f // 定义"display test"模式 register 显示测试寄存器
#define ShutdownMode 0x00 // 低功耗方式
#define NormalOperation 0x01 // 正常操作方式
#define ScanDigit 0x07 // 扫描位数设置,显示8位数码管
#define DecodeDigit 0x00 // 译码设置,8位均为BCD码
#define IntensityGrade 0x0a // 亮度级别设置
#define TestMode 0x01 // 显示测试模式
#define TextEnd 0x00 // 显示测试结束,恢复正常工作模式
uchar Digit[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //数码管1~8寄存器
/**显示缓存区(数码管显示源代码)**/
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};// 显示缓存区
//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);
/******单片机初始化**********/
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
}
/* 延时t微秒 */
void delay_us(int t)
{
do
t--;
while(t>1);
}
/*延时t毫秒*/
void delay_ms(unsigned int t)
{
while(t!=0)
{
delay_us(1000);
t--;
}
}
/* 向第一个MAX7219写入字节(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
}
}
}
/* 第一个向MAX7219写入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
PORTB&=~(1<<1); //LOAD=0
NOP();
SendChar(addr);
NOP();
SendChar(num);
NOP();
PORTB|=(1<<1); // 锁存进相应寄存器
}
/*第一个MAX7219初始化 */
void InitDisplay (void)
{
WriteWord (ScanLimit,ScanDigit); // 设置扫描界限
WriteWord (DecodeMode,DecodeDigit); // 设置译码模式
WriteWord (Intensity,IntensityGrade); // 设置亮度
WriteWord (ShutDown,NormalOperation); // 设置为正常工作模式
}
/* 向第二个MAX7219写入字节(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
}
}
}
/* 向第二个MAX7219写入字(16位)*/
void WriteWord1 (uchar addr,uchar num)
{
PORTB&=~(1<<4); //LOAD=0
NOP();
SendChar1(addr);
NOP();
SendChar1(num);
NOP();
PORTB|=(1<<4); // 锁存进相应寄存器
}
/* 第二个MAX7219初始化 */
void InitDisplay1 (void)
{
WriteWord1 (ScanLimit,ScanDigit); // 设置扫描界限
WriteWord1 (DecodeMode,DecodeDigit); // 设置译码模式
WriteWord1 (Intensity,IntensityGrade); // 设置亮度
WriteWord1 (ShutDown,NormalOperation); // 设置为正常工作模式
}
/* 向第二个MAX7219写入字节(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
}
}
}
/* 向第三个MAX7219写入字(16位)*/
void WriteWord2 (uchar addr,uchar num)
{
PORTB&=~(1<<7); //LOAD=0
NOP();
SendChar2(addr);
NOP();
SendChar2(num);
NOP();
PORTB|=(1<<7); // 锁存进相应寄存器
}
/* 第三个MAX7219初始化 */
void InitDisplay2 (void)
{
WriteWord2 (ScanLimit,ScanDigit); // 设置扫描界限
WriteWord2 (DecodeMode,DecodeDigit); // 设置译码模式
WriteWord2 (Intensity,IntensityGrade); // 设置亮度
WriteWord2 (ShutDown,NormalOperation); // 设置为正常工作模式
}
/**测试状态指示灯及蜂鸣器子程序**/
void dkcs(void)
{
uchar i;
PORTD&=~(1<<1);
for(i=0;i<=4;i++)
{
PORTG&=~(1<<i);
}
}
/**关闭测试状态指示灯及蜂鸣器子程序**/
void gbcs(void)
{
uchar i;
PORTD|=(1<<1);
for(i=0;i<=4;i++)
{
PORTG|=(1<<i);
}
}
/**数码管初始化显示子程序**/
void csh(void)
{
uchar i,j;
i=28;
PORTG&=~(1<<0); //默认为横流模式 横流模式指示灯点亮
/**将三个数码管全部关闭**/
for (j=0;j<=7;j++)
{
WriteWord (Digit[j],DisBuffer[i]);
WriteWord1 (Digit[j],DisBuffer[i]);
WriteWord2 (Digit[j],DisBuffer[i]);
}
//第一个数码管初始化 显示“-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]);
//第二个数码管初始化 显示“-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]);
//第三个数码管初始化 显示“-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]);
}
/****键盘扫描函数****/
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++) //扫描前三个口
{
PORTC&=~(1<<i); //键盘线扫描
scancode=PORTC&0x07; //屏蔽高五位
delay_ms(40); //延时去抖
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++) //扫描后两个口
{
PORTA&=~(1<<i); //键盘线扫描
scancode=PORTA&0xc0; //屏蔽第六位
scancode=scancode>>6;
scancode=scancode&0x03;
delay_ms(40); //延时去抖
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子函数**/
/*******调用该函数后状态切换到横流模式********/
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子函数**/
/*******调用该函数后状态切换到横压模式********/
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子函数**/
/*******调用该函数后状态切换到横功率模式********/
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子函数**/
/*******调用该函数后状态切换到横阻模式********/
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -