📄 main._c
字号:
//包含所需头文件
#include <ioM16v.h>
#include <macros.h>
#include "delay.h"
#include "LCD1602.H"
#include "boxing.h"
/*------宏定义------*/
#define uchar unsigned char
#define uint unsigned int
#define DAC_DATA PORTB
#define DAC_DDR DDRB
uint Adverage_vol;
long adc_vol=0;
long read_vol=0;
unsigned int adc_calc(void);
void control(void);
uchar ad_is_ok=0;
void adc_init(void);
unsigned char ad_flag=0;
uint AD_COUNT=0;
uint counter=0;
uint time_delay=0;
uint key_is_ok=0;
uint key_value1=16;
uint key_value2=16;
uint Set_Value=10;
uchar Set_Value_H;
uchar Set_Value_L;
uint VOL_L=0;
uint VOL_H=0;
uint VOL_H0=0;
uint VOL_L0=0;
uchar VOL_P=0;
uchar real_vol=0;
uchar clear_flag=0;
uchar ahead_flag=0;
uchar back_flag=0;
uint setting_val;
uchar ENTER=0;
static uchar state=0,cn=0;
uint SET_VALUE[4];
uchar welcome[] = {"volt-source"}; //开机欢迎文字
uchar st[] = {"System-starting"};
uchar setting[] = {"set:"}; //设定值
uchar measure[] = {"Measure:"}; // 测量值
uchar error[]={"error"};
void system_init()
{
Write_Position(1,1);
Write_String(welcome);
Write_Position(2,1);
Write_String(st);
delay_nms(1500);
Clear_Screen;
}
//用于将十进制数转换成IO口上的二进制数
uchar dec_to_bin(uint data)
{
uint i=0;
uint temp=0;
uchar temp1=0x00;
temp=data;
for(;i<8;i++)
{
if((temp%2)==1)
{
temp1 |=(1<<i);
}
if((temp%2)==0)
{
temp1 &=~(1<<i);
}
temp =temp/2;
}
return (temp1);
}
void Display_VOL(void)
{
// Set_Value=10*SET_VALUE[1]+SET_VALUE[3];
Set_Value_H=Set_Value/10+0x30;
Set_Value_L=Set_Value%10+0x30;
Write_Position(1,1);
Write_String(setting);
Write_Position(1,5);
Write_Data(Set_Value_H);
Write_String(".");
Write_Data(Set_Value_L);
Write_String("v");
adc_vol=Adverage_vol*2+40;//作为补偿电压值
VOL_H0=adc_vol/1000+0x30;
VOL_H=adc_vol/100%10+0x30;
VOL_L0=adc_vol/10%10+0x30;
Write_Position(2,1);
Write_String("real_vol:");
Write_Position(2,10);
Write_Data(VOL_H0);
Write_Data(0x2e);
Write_Data(VOL_H);
Write_Data(VOL_L0);
Write_Position(2,14);
Write_String("v");
}
#define key_mask 0b00001111
uint KeyScan(void)
{
static uint key_value,key_line;
uint key_return=16;
uchar i;
DDRD=0xf0;
key_line=0b00010000;
for(i=1;i<=4;i++)
{
PORTD=~key_line;
PORTD=~key_line;
key_value=key_mask&PIND;
if(key_value==key_mask)
key_line<<=1;
else
break;
}
delay_nms(5);
if(key_value==(key_mask&PIND))
{
switch(key_line|key_value)
{
case 0b00011110:key_return=7;
break;
case 0b00011101:key_return=8;
break;
case 0b00011011:key_return=9;
break;
case 0b00010111:key_return=11;
break;
case 0b00101110:key_return=4;
break;
case 0b00101101:key_return=5;
break;
case 0b00101011:key_return=6;
break;
case 0b00100111:key_return=10;
break;
case 0b01001110:key_return=1;
break;
case 0b01001101:key_return=2;
break;
case 0b01001011:key_return=3;
break;
case 0b01000111:key_return=12;
break;
case 0b10001110:key_return=0;
break;
case 0b10001101:key_return=13;//小数点
break;
case 0b10001011:key_return=14;//ENTER
break;
case 0b10000111:key_return=15;//启动自动扫描
break;
}
}
return key_return;
}
void read_keyvalue()
{
uint temp=0;
uint i=0;
uchar keycode=16;
keycode=KeyScan();
if(((keycode >=0)&&(keycode <=9)&&(cn < 4))||((keycode ==13)&&(cn == 1)))
{
cn++;
switch(keycode)
{
case 0:temp=0;SET_VALUE[cn]=temp;break;
case 1:temp=1;SET_VALUE[cn]=temp;break;
case 2:temp=2;SET_VALUE[cn]=temp;break;
case 3:temp=3;SET_VALUE[cn]=temp;break;
case 4:temp=4;SET_VALUE[cn]=temp;break;
case 5:temp=5;SET_VALUE[cn]=temp;break;
case 6:temp=6;SET_VALUE[cn]=temp;break;
case 7:temp=7;SET_VALUE[cn]=temp;break;
case 8:temp=8;SET_VALUE[cn]=temp;break;
case 9:temp=9;SET_VALUE[cn]=temp;break;
case 13:temp=0x2e;SET_VALUE[cn]=temp;break;
}
if((cn==2)&&(SET_VALUE[2]!=0x2e))
{
Write_Position(1,5);
Write_String(error);
}
Set_Value=10*SET_VALUE[1]+SET_VALUE[3];
Display_VOL();
}
if(cn == 3)//输入预定电压值完毕
{
if(KeyScan()==14)//等待ENTER键按下
{
cn=0;
ENTER=1;
}
}
if(KeyScan()==11)
{
ahead_flag=1;
}
if(KeyScan()==10)
{
back_flag=1;
}
if(KeyScan()== 12)
{
clear_flag=1;
}
}
static uchar auto_flag=0;
void signal_function(void)
{
switch(auto_flag)
{
case 0:Write_Position(1,12);
Write_String("off");
if(KeyScan()==15)
auto_flag=1;
break;
case 1:
Write_Position(1,12);
Write_String("+ ");
if(Set_Value<99)
{
Set_Value++;
DAC_DATA=Set_Value;
control();
}
else
auto_flag=2;
if(KeyScan()==15)
auto_flag=2;
break;
case 2:
Write_Position(1,12);
Write_String("- ");
if(Set_Value>0)
{
Set_Value--;
DAC_DATA=Set_Value;
control();
}
else
auto_flag=1;
if(KeyScan()==15)
auto_flag=3;
break;
case 3:Write_Position(1,12);
Write_String("squ");
while(auto_flag ==3)
{
DAC_DATA=0x00;
delay_nms(50);
DAC_DATA=0xff;
delay_nms(10);
if(KeyScan()==15)
auto_flag=4;
}
break;
case 4:
Write_Position(1,12);
Write_String("saw");
while(auto_flag == 4)
{
uint i=255;
for(;i>0;i--)
{
DAC_DATA=i;
delay_nus(10);
}
if(KeyScan()==15)
auto_flag=0;
}
break;
/* case 4:
Write_Position(1,12);
Write_String("sin");
for(;auto_flag == 4;)
{
uint i;
for(i=0;i<=200;i++)
{
DAC_DATA=Sin[i];
delay_nus(10);
if(KeyScan()==15)
auto_flag=5;
}
break;*/
}
}
void function_DAC()
{
if(ENTER==1)
{
ENTER=0;
DAC_DATA=Set_Value;
control();
}
if(ahead_flag)
{
ahead_flag=0;
if(Set_Value<99)
{
Set_Value++;
DAC_DATA=Set_Value;
control();
}
}
if(back_flag)
{
back_flag=0;
if(Set_Value>0)
{
Set_Value--;
DAC_DATA=Set_Value;
control();
}
}
if(clear_flag)
{
uint i=0;
clear_flag=0;
auto_flag=0;
cn=0;
Clear_Screen;
for(i=0;i<4;i++)
{
SET_VALUE[i]=0;
}
Set_Value=0;
DAC_DATA=Set_Value;
control();
}
}
uint temp_vol=0;
uint temp_value=0;
uchar temp_H,temp_L;
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
unsigned long int voltage;
voltage=adc_calc();
Adverage_vol=voltage;
ad_flag=1;
}
void control(void)
{
temp_vol=2*Adverage_vol+45;
temp_vol=temp_vol/100;
temp_value=Set_Value;
if(cn ==0)
{
while(temp_vol < Set_Value)
{
if(temp_value>=255);
else
temp_value++;
DAC_DATA=temp_value;
ADCSRA|=BIT(ADSC);
while(!ad_flag);
ad_flag=0;
temp_vol=(unsigned int)2*Adverage_vol+40;
temp_vol=(unsigned int)temp_vol/100;
}
while(temp_vol> Set_Value)
{
if(temp_value <=0) ;
else
temp_value--;
DAC_DATA=temp_value;
ADCSRA|=BIT(ADSC);
while(!ad_flag);
ad_flag=0;
temp_vol=(unsigned int)2*Adverage_vol+40;
temp_vol=(unsigned int)temp_vol/100;
}
}
}
//端口初始化
void port_init(void)
{
PORTA = 0x00;//低三位作为1602控制端
DDRA = 0x07;//低三位作为1602控制端
PORTD = 0x0F;//矩阵键盘的接口
DDRD = 0xF0;
PORTB = 0x00;//DAC0832的数据控制端
DDRB = 0xFF;//DAC0832的数据控制端
PORTC = 0x00;//PC口作为1602的数据端
DDRC = 0xFF;//PC口作为1602的数据端
}
//定时器T0初始化
void timer0_init(void)
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0x25;//初始值
OCR0 = 0xC0;//匹配值
TIMSK |= 0x02;//中断允许
TCCR0 = 0x04;//启动定时器
}
//T0比较中断服务程序
#pragma interrupt_handler timer0_comp_isr:20
void timer0_comp_isr(void)
{
//中断发生时刻在TCNT0=OCR0
if(++counter>=4)
{
counter=0;
key_is_ok=1;
}
if(++AD_COUNT>=5)
{
AD_COUNT=0;
ad_is_ok=1;
}
}
void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR = 0x00;
GICR = 0x00;
port_init();
Initialize_LCD();
timer0_init();
adc_init();
SEI();//开全局中断
}
//主函数
void main(void)
{
uint i=0,keycode=16;
init_devices();
//在这继续添加你的代码
system_init();
DAC_DDR=0xff;
DAC_DATA=Set_Value;
while(1)
{
Display_VOL();
function_DAC();
control();
signal_function();
control();
if(key_is_ok)
{
read_keyvalue();
key_is_ok=0;
}
if(ad_is_ok)
{
ad_is_ok=0;
ADCSRA|=BIT(ADSC);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -