#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(