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

📄 keyboard_rc_int.c

📁 AVR128的键盘控制指令程序
💻 C
📖 第 1 页 / 共 5 页
字号:
--------------------------------------------------------------------------------------*/
flash unsigned char Set_Alarm_Time_Error[] = \
{"设置的每闹一回发出声响次数大于59999,不符合系统要求!请重新键入。"} ;

/*--------------------------------------------------------------------------------------
“没有键入每闹一回发出声响次数值,不符合系统要求!请重新键入。”
--------------------------------------------------------------------------------------*/
flash unsigned char Set_Alarm_Time_Error_2[] = \
{"没有键入每闹一回发出声响次数值,不符合系统要求!请重新键入。"} ;

/*--------------------------------------------------------------------------------------
“准备开始录音,录音段落为:”
--------------------------------------------------------------------------------------*/
flash unsigned char Ready_ISD4000_Record[] = \
{"准备开始录音,录音段落为:"} ;

/*--------------------------------------------------------------------------------------
“开始录音停止录音播放录音”
--------------------------------------------------------------------------------------*/
flash unsigned char Start_ISD4000_Record[] = \
{"开始录音停止录音播放录音"} ;

/*--------------------------------------------------------------------------------------
“开始连续播放提示语音停止连续播放提示语音”
--------------------------------------------------------------------------------------*/
flash unsigned char Start_ISD4000_Continue_Play[] = \
{"开始连续播放提示语音停止连续播放提示语音"} ;



/*==========================================================================================
                        本源程序文件内部使用的局部动态和静态变量定义
==========================================================================================*/
/*--------------------------------------------------------------------------------------
行列式键盘接口键盘编码数值变量:
--------------------------------------------------------------------------------------*/
volatile unsigned char key_code = 0 ;

/*--------------------------------------------------------------------------------------
显示的子菜单数字值变量:
--------------------------------------------------------------------------------------*/
static unsigned char sub_menu_num = 1 ;

/*--------------------------------------------------------------------------------------
显示的菜单列数值变量:
--------------------------------------------------------------------------------------*/
static unsigned char menu_dim_num = 0 ;

/*--------------------------------------------------------------------------------------
允许从键盘键入数字和字符值的变量:
--------------------------------------------------------------------------------------*/
static unsigned char key_in_char = FALSE ;

/*--------------------------------------------------------------------------------------
显示的主测试表格表格页数字值变量:
--------------------------------------------------------------------------------------*/
static unsigned char table_page_num = 0 ;

/*--------------------------------------------------------------------------------------
ISD4000连续放音段落数缓冲区的存储数组变量定义:
--------------------------------------------------------------------------------------*/
static unsigned char isd4000_play_seg[ISD4000_BUF_SIZE] ;


/*
********************************************************************************************
                                     程序指令代码清单
********************************************************************************************
*/
#ifdef KEYBOARD_RC_INT_USE_EXTINT6            // “行列式键盘使用外部中断向量6”条件编译
/*==========================================================================================
函数功能:    本函数用于外部中断请求6中断向量的初始化操作。
备注:        ▲.本函数仅在主函数中调用一次即可。
              ▲.要使能中断还必须在主程序中打开全局中断使能功能,推荐其指令如下:
                  SREG |= BIT7;                       // 使能全局中断
==========================================================================================*/
void  Keyboard_RC_INT6_INIT (void)
{
  register unsigned char temp ;               // 临时寄存器变量
  KEY_RC_IRQ_DDR &= ~KEY_RC_IRQ_PINNum ;      // 设置行列式键盘中断请求端口为输入引脚
  KEY_RC_IRQ_PORT |= KEY_RC_IRQ_PINNum ;      // 使能行列式键盘中断请求引脚的上拉电阻
  temp = SFIOR ;                              // 使能所有I/O端口的上拉电阻
  temp &= ~(1<<PUD) ;
  SFIOR = temp ;
/*--------------------------------------------------------------------------------------
目标器件芯片为 ATmega64和ATmega128 外部中断请求6的初始化操作
--------------------------------------------------------------------------------------*/
#if defined(MCU_TYPE_IS_ATMEGA64) || defined(MCU_TYPE_IS_ATMEGA128)
  temp = EICRB ;                              // 设置外部中断请求6的触发方式为:下降沿触发
  temp |= ((0<<ISC60)|(1<<ISC61)) ;
  EICRB = temp ;
  temp = EIMSK ;                              // 使能外部中断请求6
  temp |= (1<<INT6) ;
  EIMSK = temp ;
  temp = EIFR ;                               // 外部中断请求6标志位清零
  temp |= (1<<INTF6) ;
  EIFR = temp ;
#endif
}
#endif                                        // “KEYBOARD_RC_INT_USE_EXTINT6”条件编译结束

/*==========================================================================================
函数功能:    本函数用于行列式键盘接口的输入/输出引脚的初始化操作。
备注:        ▲.本函数仅在主函数中调用一次即可。
==========================================================================================*/
void  Keyboard_RC_INIT (void)
{
  register unsigned char temp ;               // 临时寄存器变量
  temp = KEY_RC_ROW_DDR ;
  temp &= ~KEY_RC_ROW_RANGE ;
  KEY_RC_ROW_DDR = temp ;                     // 设置行端口为输入端口
  KEY_RC_ROW_PORT = KEY_RC_ROW_RANGE ;        // 使能行端口的上拉电阻
  temp = SFIOR ;                              // 读取特殊功能I/O寄存器中原来设置的内容
  temp &= ~(1<<PUD) ;                         // 使能所有I/O端口的上拉电阻,其余保留原设置
  SFIOR = temp ;                              // 将重新设置的内容写入特殊功能I/O寄存器中
  KEY_RC_COL_1_DDR |= KEY_RC_COL_1_PINNum ;   // 设置第1列线为输出引脚
  KEY_RC_COL_1_PORT &= ~KEY_RC_COL_1_PINNum ; // 置第1列线引脚为低电平
  KEY_RC_COL_2_DDR |= KEY_RC_COL_2_PINNum ;   // 设置第2列线为输出引脚
  KEY_RC_COL_2_PORT &= ~KEY_RC_COL_2_PINNum ; // 置第2列线引脚为低电平
  KEY_RC_COL_3_DDR |= KEY_RC_COL_3_PINNum ;   // 设置第3列线为输出引脚
  KEY_RC_COL_3_PORT &= ~KEY_RC_COL_3_PINNum ; // 置第3列线引脚为低电平
  KEY_RC_COL_4_DDR |= KEY_RC_COL_4_PINNum ;   // 设置第4列线为输出引脚
  KEY_RC_COL_4_PORT &= ~KEY_RC_COL_4_PINNum ; // 置第4列线引脚为低电平
  KEY_RC_COL_5_DDR |= KEY_RC_COL_5_PINNum ;   // 设置第5列线为输出引脚
  KEY_RC_COL_5_PORT &= ~KEY_RC_COL_5_PINNum ; // 置第6列线引脚为低电平
/*--------------------------------------------------------------------------------------
初始化各个标志位
--------------------------------------------------------------------------------------*/
  key_rc_sign = 0x00 ;                        // 行列式键盘接口消息任务标志变量清零
  key_code = 0x00 ;                           // 行列式键盘接口键盘编码数值变量清零
  key_state = 0x00 ;                          // 行列式键盘接口键盘状态数值变量清零
}

/*==========================================================================================
函数功能:    本函数用于行列式键盘接口外部中断请求处理的中断服务程序。
§.本函数将在函数体中隐式修改下面这些相当于出口参数的全局变量和局部静态变量:
出口全局变量:key_rc_sign:KEY_RC_JUDGE --- 键盘任务需要继续判别标志位,出口值=置位。
备注:        ▲.注意:本函数需在设置的行列式键盘接口外部中断请求处理函数中调用。在调用之前
                        需对该中断向量进行初始化,以使能该中断。例:如使用外部中断请求6,可
                        使用上面提供的 Keyboard_RC_INT6_INIT() 函数进行初始化,而将本函数放
                        在外部中断请求6服务程序中。
              ▲.注意:本函数将使能T/C0计数溢出中断。
==========================================================================================*/
void  Keyboard_RC_INT_ISR (void)
{
  register unsigned char temp ;               // 临时寄存器变量
#if defined(MCU_TYPE_IS_ATMEGA16) || defined(MCU_TYPE_IS_ATMEGA32)  || \
    defined(MCU_TYPE_IS_ATMEGA64) || defined(MCU_TYPE_IS_ATMEGA128)
  temp = TIFR ;                               // 读取定时器中断标志寄存器中原来设置的内容
  temp |= (1<<TOV0) ;                         // 清除T/C0溢出标志,其余保留原设置
  TIFR = temp ;                               // 将重新设置的内容写入定时器中断标志寄存器中
  TCNT0 = TC0_OVR_INIT_VALUE ;                // 写入的初始定时数值
  temp = TIMSK ;                              // 读取定时器中断标志寄存器中原来设置的内容
  temp |= (1<<TOIE0) ;                        // 使能T/C0计数溢出中断,其余保留原设置
  TIMSK = temp ;                              // 将重新设置的内容写入定时器中断标志寄存器中
  TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00) ;     // 按CK÷1024预分频因子启动T/C0
#else
#error 错误:函数<Keyboard_RC_INT_ISR>没有启动定时器/计数器0的程序指令代码!!!
#endif
  key_rc_sign |= KEY_RC_JUDGE ;               // 置继续判别标志位
}

/*==========================================================================================
函数功能:    本函数是对行列式键盘接口控制列线电平高/低状态的操作。
函数入口参数:column_num --------- 要控制的列线数字,列线数字从0开始连续取值。
              column_status ------ 单个列线电平高/低状态,仅可取二个值 LOW 或 HIGH 中的一个。
备注:
==========================================================================================*/
static void  Keyboard_RC_Column_Level (Uchar8 column_num,    // 行列式键盘列线数字
                                       Uchar8 column_status) // 单个列线电平高/低状态
{
  if (column_status == HIGH)                  // 检查是否控制单个列线电平为高电平状态?
  {
    switch (column_num)                       // 判断键盘列线数字为多少?
    {
      case 0x00:
      {
        KEY_RC_COL_1_PORT |= KEY_RC_COL_1_PINNum;// 置第1列线引脚为高电平
        break ;
      }
      case 0x01:
      {
        KEY_RC_COL_2_PORT |= KEY_RC_COL_2_PINNum;// 置第2列线引脚为高电平
        break ;
      }
      case 0x02:
      {
        KEY_RC_COL_3_PORT |= KEY_RC_COL_3_PINNum;// 置第3列线引脚为高电平
        break ;
      }
      case 0x03:
      {
        KEY_RC_COL_4_PORT |= KEY_RC_COL_4_PINNum;// 置第4列线引脚为高电平
        break ;
      }
      case 0x04:
      {
        KEY_RC_COL_5_PORT |= KEY_RC_COL_5_PINNum;// 置第5列线引脚为高电平
        break ;
      }
      default:
      {
      }
    }
  }
  else
  {
    switch (column_num)                       // 判断键盘列线数字为多少?
    {
      case 0x00:
      {
        KEY_RC_COL_1_PORT &= ~KEY_RC_COL_1_PINNum;// 置第1列线引脚为低电平
        break ;
      }
      case 0x01:
      {
        KEY_RC_COL_2_PORT &= ~KEY_RC_COL_2_PINNum;// 置第2列线引脚为低电平
        break ;
      }
      case 0x02:
      {
        KEY_RC_COL_3_PORT &= ~KEY_RC_COL_3_PINNum;// 置第3列线引脚为低电平
        break ;
      }
      case 0x03:
      {
        KEY_RC_COL_4_PORT &= ~KEY_RC_COL_4_PINNum;// 置第4列线引脚为低电平
        break ;
      }
      case 0x04:
      {
        KEY_RC_COL_5_PORT &= ~KEY_RC_COL_5_PINNum;// 置第5列线引脚为低电平
        break ;
      }
      default:
      {
      }
    }
  }
}

/*==============

⌨️ 快捷键说明

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