⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是一个AVR的单片机程式。能实现对一个中断端口进行计数、显示。有比较全面的按键功能。
💻 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 + -