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

📄 key.c

📁 这是一个AVR的单片机程式。能实现对一个中断端口进行计数、显示。有比较全面的按键功能。
💻 C
📖 第 1 页 / 共 2 页
字号:
#define _KEY_
#include <iom16.h>
#include <string.h>
#include "lcd.h"
#include "main.h"
#include "key.h"
#include "count.h"
#include <stdio.h>

//全局变量
extern double have_drawed;//已经抽酒的数量
extern long want_to_draw_pulse;//想要抽酒量的脉冲数
extern long pulse;
extern unsigned int have_drawed_int;
extern unsigned int  have_drawed_decimal;
//double bak;//保存想抽酒的数量,用于暂停时求还剩下多少没抽
unsigned char KeySet[]=
{
0x31,0x32,0x33,0x34,//1,2,3,4
0x35,0x36,0x37,0x38,//5,6,7,8
0x39,0x30,0x2E//9,0,.
};


//键盘初始化
void Key_Init(void)
{
 DDRD = 0xF3;//PD2(INT0)IN
 MCUCR = 0x3A;//省电模式
 //GICR = 0x40;//允许外部INT0中断,低电平触发
 DDRA = 0xF0;//反转PORTB I/O方向.PA0~3输入(行),PA4~7输出(列)
 PORTA = 0x0F;//置行为低电平。行为输出,低电平;列为输入,高电平
    //want_to_draw = 0.0;
    meter = 107.512;
    len = 0;
    len = 0;
    KeyDown = 0;
    num = 0;
    flag = 0;
    flag1 = 0;
    key_status = KEY_NO;
    Key_Len = KEY_LEN_OIL;
    Key_Dot = 0;
    Key_In = 0.0;
    machine_status = MACHINE_STOP;
}

//将键盘输入的数量转换为want_to_draw
void draw(void)
{
 	 unsigned int temp = len;
	 //unsigned int i = 0;
	 if(temp >= 1)//输入数量的情况
	 {
        want_to_draw = Key_In ;
     }
	 else//temp<=0没有输入数量直接抽酒,表示无限抽酒,先用1000000表示无限大
	 {
	    want_to_draw = 1000000;
	 }
	 AmountToPulse(want_to_draw);
     num = 0;
	 len = 0;
	 flag = 0;
	 //bak = want_to_draw;
}

#pragma vector=INT0_vect
__interrupt void INT0_vect_isr(void)
{
}

void ReadKey(void)
{
     unsigned char b;
     unsigned char temp;
     unsigned char i;

     PORTA = 0x0f;
     temp = PINA & 0x0F;
     //temp = (~temp) & 0x0f;
        switch(key_status)
        {
            case KEY_NO:
                if(temp != 0x0f)
                {
                    key_status = KEY_START;
                    Key_Temp = temp;
                }
                break;
            case KEY_START:
               if(temp == 0x0f)
                  key_status = KEY_NO;
               else
               if(Key_Temp == temp)
                  key_status = KEY_PRESS;
                break;
            case KEY_PRESS:
              for(i = 0; i < 4; i++)
              {                         //高4位为输出,低4位为输入,高4位一次输出低电平
                b = (~(1 << (4 + i))) | 0x0f;
                //temp = 1 << i | 0xf0;
                PORTA = b;
                asm("NOP");
                asm("NOP");
                asm("NOP");
                asm("NOP");
                b = PINA & 0x0f;
                if(b != 0x0f)
                   break;
              }
                if(temp == 0x0e)
                    Key = i;
                else
                if(temp == 0x0d)
                    Key = 4 + i;
                else
                if(temp == 0x0b)
                    Key = 8 + i;
                else
                if(temp == 0x07)
                    Key = 12 + i;
                key_status = KEY_WAIT;
                break;
            case     KEY_WAIT:
                if(temp == 0x0f)
                  key_status = KEY_RELEASE;
                break;
            default:
                break;
            }
}

void key_action()
{
     KeyDown = 0;
     //数字键
     switch (Key)
     {
         case 0:    // 0
         case 1:    // 1
         case 2:    // 2
         case 3:    // 3
         case 4:    // 4
         case 5:    // 5
         case 6:    // 6
         case 7:    // 7
         case 8:    // 8
         case 9:    // 9
            if((machine_status == MACHINE_SET_OIL) || (machine_status == MACHINE_SET_CON ))
            {
                  if( len < Key_Len)
                  {
                      if(Key_Dot == 0)
                      {
                            if(Int_Key_In  <  Int_Key_Len)
                            {
                               array[len] = Key+0x30;
                               Key_In *= 10.0;
                               Key_In += (double)Key ;
                              len += 1;
                              Int_Key_In ++;
                            }
                            else
                            {
                              Beep(100,3);
                            }
                      }
                      else
                      {
                            if(Dot_Key_In  <  Dot_Key_Len)
                            {
                                array[len] = Key+0x30;
                                Dot_Count /= 10.0;
                                Key_In += ((double)Key ) * Dot_Count;
                                Dot_Key_In ++;
                                len += 1;
                            }
                            else
                            {
                              Beep(100,3);
                            }
                      }
                      array[len] = 0;
                      if(machine_status == MACHINE_SET_OIL)
                      {
                           clear_area(1,6,9);
                           Print_Disp(1,6,Key_In,1);
                      }
                      else
                      {
                           clear_area(1,6,9);
                           Print_Disp(1,6,Key_In,3);
                      }

                  }
            }
              break;
         case 10:   //小数点
            if((machine_status == MACHINE_SET_OIL) || (machine_status == MACHINE_SET_CON ))
            {
                  if(( len < Key_Len) && (Key_Dot == 0))
                  {
                      array[len] = '.';
                      Key_Dot = 1;
                      len += 1;
                      array[len] = 0;
                      Dot_Count = 1.0;
                      Dot_Key_In = 0;
                      if(machine_status == MACHINE_SET_OIL)
                      {
                          Dot_Key_Len = Dot_LEN_OIL;
                          //sprintf(Disp_Buff,"%6.1f",Key_In);
                          //Lcd_write_string(1,6,(unsigned char*)&Disp_Buff);
                           clear_area(1,6,9);
                           Print_Disp(1,6,Key_In,1);
                      }
                      else
                      {
                          Dot_Key_Len = Dot_LEN_CON;
                          //sprintf(Disp_Buff,"%   3.3f",Key_In);
                          //Lcd_write_string(1,6,(unsigned char*)&Disp_Buff);
                           clear_area(1,6,9);
                           Print_Disp(1,6,Key_In,3);
                     }
                  }
            }
              break;

         //cancel       ?
         case 11:
            if(machine_status == MACHINE_SET_OIL)
            {
                   clear_area(1,7,8);
                   Lcd_write_hanzi_string_GH(1,0,"数量:");//数量:
                    len = 0;
                    key_status = KEY_NO;
                    Key_Len = KEY_LEN_OIL;
                    Key_Dot = 0;
                    Key_In = 0.0;
                    Dot_Count = 1.0;
                    Dot_Key_In = 0;
                    Int_Key_In = 0;
                    num = 1;
                    //sprintf(Disp_Buff,"%6.1f",Key_In);
                    //Lcd_write_string(1,6,(unsigned char*)&Disp_Buff);
                    clear_area(1,6,9);
                    Print_Disp(1,6,Key_In,1);
            }
            if(machine_status == MACHINE_SET_CON )  //
            {
                    key_status = KEY_NO;
                    Key_Len = KEY_LEN_OIL;
                    Key_Dot = 0;
                    Key_In = 0.0;
                    Dot_Count = 1.0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -