📄 main.c
字号:
#define _MAIN_
#include <iom16.h>
#include "lcd.h"
#include "main.h"
#include "key.h"
#include "count.h"
#include <string.h>
#include <stdio.h>
unsigned char flag_on = 0;//开关机状态;0关机(关机只是进入省电状态并不是真正意义的关机),1开机
unsigned char flag_start = 0;//开始抽酒;0暂停,1开始
unsigned char flag_stop = 0;//停止否?0初始值,1停止
void delay_ms(unsigned int time)
{
}
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0xFF;
PORTD = 0x7d;
DDRD = 0xFF;
HC575_CLK_LOW;
Valve_L;
Pump_L;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
MCUCR|=0x02;
GIFR=0xff;
GICR=0x40;
SREG|=0x80;
}
//初始化定时器
void init_tc1_16(void)
{
TCCR1A=0x00;
TCCR1B=0x02; // 8 devide 1.45us
//TCNT1H=0xfd; //1ms foxs == 11.0529,系统时钟2分频
//TCNT1L=0x4e;
TCNT1H=0xf8; //0xfd; //`1ms
TCNT1L=0xcc; //0x4e;
//TIMSK|=0x80; //TOIE1;
TIMSK|=0x04; //TOIE1;
}
//开机;不用电池就用不着休眠
void power_on(void)
{
}
//关机
void power_off(void)
{
}
//暂停,酒泵电磁阀流量计都关掉并记录下当前抽酒数量
void pause(void)
{
Valve_L;
Pump_L;
Meter_L;
//pulse =
}
//停止,酒泵电磁阀流量计都关掉
void stop(void)
{
Valve_L;
Pump_L;
Meter_L;
}
//删除;清屏并且要将输入的字符清除
void delete(void)
{
//Lcd_Command(0x01); //ready clr
}
#pragma vector=TIMER1_OVF_vect
__interrupt void Timer_1(void)
{
TCNT1H=0xf8; //0xfd; //`1ms
TCNT1L=0xcc; //0x4e;
Free_Count ++;
if(machine_status == MACHINE_PAUSE)
{
Machine_Pause_Count++;
if((Machine_Pause_Count > 0) && ((Machine_Pause_Count < 500)))
{
Extern |= WORK_LED;
}
else
if((Machine_Pause_Count >= 500) && ((Machine_Pause_Count < 1000)))
{
Extern &= ~WORK_LED;
}
else
{
Machine_Pause_Count = 0;
}
}
if(pulse < want_to_draw_pulse)
{
times ++;
}
if(Beep_Begin == 1)
{
if(Beep_Times_Count < Beep_Times)
{
Beep_Time_Count ++;
if((Beep_Time_Count > 0) && ((Beep_Time_Count < Beep_Time)))
{
Extern |= SPK;
}
else
if((Beep_Time_Count >= Beep_Time) && ((Beep_Time_Count < 2 * Beep_Time)))
{
Extern &= ~SPK;
}
else
if(Beep_Time_Count >= 2 * Beep_Time)
{
Beep_Times_Count ++;
Beep_Time_Count = 0;
}
}
else
{
Extern &= ~SPK;
Beep_Begin = 0;
Beep_Time_Count = 0;
Beep_Times_Count = 0;
}
}
}
void init_usart(void)
{
UCSRB=0x00;
UCSRA=0x00;
//UCSRC=0x86;
//UCSRC=0x86;
UBRRH=0x00;
UBRRL=95; //9600
UCSRB=0x0;
UCSRB|=0x08; //TXEN;
UCSRA|=0x20; //UDRE;
//UCSRB|=0x20; //UDRIE;
}
#pragma vector=USART_UDRE_vect
__interrupt void UART_TX (void)
{
if(Tx_Ptr >= Tx_Len)
Tx_status |= SEND_OK; //发送完毕标志置位
else
UDR = Tx_Buff[Tx_Ptr++];
}
#pragma vector=USART_RXC_vect
__interrupt void UART_RX (void)
{
unsigned char data;
data=UDR;
if(Rx_Count < 50)
Rx_Buff[Rx_Count++] = data;
}
void main(void)
{
init_devices();
init_prog();//初始化一次
clear_prog();//清显示RAM
init_tc1_16();
//init_usart();
Key_Init();
//display_prog();
Lcd_write_hanzi_string_GH(0,4,"欢迎光临");
Lcd_write_hanzi_string_GH(1,0,"数量:");//数量:
meter = METER;
if(meter == 0.0)
METER = meter = 107.512;
want_to_draw = Want_To_Draw;
if(want_to_draw == 0.0)
Want_To_Draw = want_to_draw = 100000.0;
AmountToPulse(want_to_draw);
//sprintf(Disp_Buff,"%6.1f",want_to_draw);
//Lcd_write_string(1,6,(unsigned char*)&Disp_Buff);
clear_area(1,6,9);
Print_Disp(1,6,want_to_draw,1);
Lcd_write_hanzi_string_GH(2,0,"常数:");//数量:
//sprintf(Disp_Buff,"%3.3f",meter);
//Lcd_write_string(2,6,(unsigned char*)&Disp_Buff);
clear_area(2,6,9);
Print_Disp(2,6,meter,3);
have_drawed = 0.0;
times = 0;
have_drawed_int = 0;
have_drawed_decimal = 0;
Machine_Pause_Count = 0;
Extern_Driver(WORK_LED,ON);
Extern_Driver(ERR_LED,ON);
Extern_Driver(SPK,ON);
Extern_Driver(RST_LCD,LOW);
Free_Count = 0;
do{}
while(Free_Count < 10);
Extern_Driver(RST_LCD,HIGH);
Free_Count = 0;
do{}
while(Free_Count < 1000);
Extern_Driver(WORK_LED,OFF);
Extern_Driver(ERR_LED,OFF);
Extern_Driver(SPK,OFF);
while(1)
{
ReadKey();
if(key_status == KEY_RELEASE)
{
key_status = KEY_NO;
key_action();
}
if((machine_status == MACHINE_DRAW) || (machine_status == MACHINE_RESTART))
{
if(pulse < want_to_draw_pulse) //没有抽完
{
{
Extern |= WORK_LED;
Extern_Driver(Dog , ON);
if(times >= 100)
{
PulseToAmount(pulse);
Lcd_write_hanzi_string_GH(2,0,"已抽:");//已抽:
clear_area(2,6,9);
Print_Disp(2,6,have_drawed,1);
times = 0;
}
}
}
else//抽完
if(pulse >= want_to_draw_pulse)
{
//关酒泵,电磁阀
//DDRD = 0xf3;
//PORTD = 0x0C;
//MCUCR = 0x3A;//省电模式
Valve_L;
Pump_L;
GICR = 0x40;//关中断1,不允许计量
machine_status = MACHINE_STOP;
clear_prog();
Lcd_write_hanzi_string_GH(0,4,"欢迎光临");//欢迎光临
Lcd_write_hanzi_string_GH(1,0,"数量:");//数量:
want_to_draw = Want_To_Draw;
AmountToPulse(want_to_draw);
clear_area(1,6,9);
Print_Disp(1,6,want_to_draw,1);
//sprintf(Disp_Buff,"%6.1f",want_to_draw);
//Lcd_write_string(1,6,(unsigned char*)&Disp_Buff);
Lcd_write_hanzi_string_GH(3,0,"完成:");//抽酒完成!
PulseToAmount(pulse);
clear_area(3,6,9);
Print_Disp(3,6,want_to_draw,1);
//sprintf(Disp_Buff,"%6.1f",have_drawed);
//Lcd_write_string(3,6,(unsigned char*)&Disp_Buff);
times = 0;
want_to_draw = 0.0;
want_to_draw_pulse = 0;
have_drawed = 0.0;
pulse = 0;
Extern_Driver(WORK_LED,OFF);
Beep(1000,1);
//WORK_LED_OFF;
//HC575_CLK_HIGH;
//HC575_CLK_LOW;
//Machine_Pause_Count = 0;
}
}
//if (machine_status == MACHINE_PAUSE)
Extern_Driver(Dog , ON);
}
}
unsigned char Print_Disp(unsigned char X1,unsigned char Y1,double Counts,unsigned char Dot_Num)
{
unsigned long Int_Counts;
unsigned long Dot_Counts;
Int_Counts = (unsigned long)(Counts); //整数部分
Lcd_set_XY(X1,Y1);
AmountToLcd(Int_Counts); //整数部分
Lcd_write_char('.');
if(Dot_Num == 1)
{
Dot_Counts = (unsigned long)((Counts - Int_Counts) * 10) ;//小数部分,只取1位
AmountToLcd(Dot_Counts); //小数部分
}
if(Dot_Num == 3)
{
Dot_Counts = (unsigned long)((Counts - Int_Counts) * 1000) ;//小数部分,只取3位
Lcd_write_char((Dot_Counts / 100) + 0x30);
Dot_Counts = Dot_Counts % 100;
Lcd_write_char((Dot_Counts / 10) + 0x30);
Dot_Counts = Dot_Counts % 10;
Lcd_write_char((Dot_Counts % 100) + 0x30);
//AmountToLcd(Dot_Counts); //小数部分
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -