zoukankan      html  css  js  c++  java
  • 指针函数的一个范例,在单片机上运用它能让您的程序结构更明朗清晰,层次感强

    #define ubyte unsigned char
    #define uint unsigned int
    #define ulong unsigned long
    
    ubyte kbCode;                   // 按键编码纪录
    ubyte kbStatus;                 // 键盘当前状态,可以理解为菜单层次
    
    // 按键的四种不同工作状态对应的函数指针对照表,每三字节对应一个按键
    // 每一项包含三个字节,分别代表按键码,键盘状态,对应处理程序编号
    // 本表对应于日常操作,不是修改状态
    ubyte code TAB0[46]={
        0x11,0x00,0x01,             // 按键'1'      func1
        0x12,0x00,0x01,             // 按键'2'      func1
        0x14,0x00,0x01,             // 按键'3'      func1
        0x1a,0x00,0x01,             // 按键'4'      func1
        0x2a,0x00,0x01,             // 按键'5'      func1
        0x4a,0x00,0x01,             // 按键'6'      func1
        0x01,0x00,0x01,             // 按键'7'      func1
        0x02,0x00,0x01,             // 按键'8'      func1
        0x04,0x00,0x01,             // 按键'9'      func1
        0x10,0x00,0x01,             // 按键'0'      func1
        0x20,0x00,0x01,             // 按键'.'      func1
        0x08,0x00,0x02,             // 按键'Clear'  func2
        0x18,0x00,0x03,             // 按键'U/D'    func3
        0x8a,0x01,0x04,             // 按键'shift'  func4
        0x40,0x02,0x05,             // 按键'last'   func5
        0x00};                      // 本表结束标志
    
    ubyte code TAB1[40]={
        0x12,0x03,0x06,             // 按键'2'      func6
        0x14,0x03,0x07,             // 按键'3'      func7
        0x2a,0x03,0x08,             // 按键'5'      func8
        0x4a,0x03,0x09,             // 按键'6'      func9
        0x01,0x03,0x12,             // 按键'7'      func18
        0x8a,0x03,0x14,             // 按键'shift'  func20
        0x11,0x01,0x0a,             // 按键'1'      func10
        0x1a,0x01,0x0b,             // 按键'4'      func11
        0x04,0x01,0x0c,             // 按键'9'      func12
        0x10,0x01,0x0d,             // 按键'0'      func13
        0x80,0x01,0x0e,             // 按键'Enter'  func14
        0x08,0x00,0x02,             // 按键'Clear'  func2
        0x20,0x03,0x13,             // 按键'.'      func19
        0x00};                      // 本表结束标志
    
    ubyte code TAB2[7]={
        0x40,0x02,0x0f,             // 按键'last'   func15
        0x08,0x00,0x02,             // 按键'Clear'  func2
        0x00};                      // 本表结束标志
    
    ubyte code TAB3[40]={
        0x11,0x03,0x10,             // 按键'1'      func16
        0x12,0x03,0x10,             // 按键'2'      func16
        0x14,0x03,0x10,             // 按键'3'      func16
        0x1a,0x03,0x10,             // 按键'4'      func16
        0x2a,0x03,0x10,             // 按键'5'      func16
        0x4a,0x03,0x10,             // 按键'6'      func16
        0x01,0x03,0x10,             // 按键'7'      func16
        0x02,0x03,0x10,             // 按键'8'      func16
        0x04,0x03,0x10,             // 按键'9'      func16
        0x10,0x03,0x10,             // 按键'0'      func16
        0x20,0x03,0x10,             // 按键'.'      func16
        0x08,0x00,0x02,             // 按键'clear'  func2
        0x80,0x01,0x11,             // 按键'Enter'  func17
        0x00};                      // 本表结束标志
    
    ubyte code *TAB[4]={TAB0,TAB1,TAB2,TAB3};       // 总指针表
    
    // 指针函数列表
    code void(code *KeyProcTab[])()={
          NoKey,            /*0#  (00H)#*/
          func1,            /*1#  (01H)#*/
          func2,            /*2#  (02H)#*/
          func3,            /*3#  (03H)#*/
          func4,            /*4#  (04H)#*/
          func5,            /*5#  (05H)#*/
          func6,            /*6#  (06H)#*/
          func7,            /*7#  (07H)#*/
          func8,            /*8#  (08H)#*/
          func9,            /*9#  (09H)#*/
          func10,           /*10# (0AH)#*/
          func11,           /*11# (0BH)#*/
          func12,           /*12# (0CH)#*/
          func13,           /*13# (0DH)#*/
          func14,           /*14# (0EH)#*/
          func15,           /*15# (0FH)#*/
          func16,           /*16# (10H)#*/
          func17,           /*17# (11H)#*/
          func18,           /*18# (12H)#*/
          func19,           /*19# (13H)#*/
          func20            /*20# (14H)#*/
    };
    
    void NoKey()
    {
        return;
    }
    
    void func0()
    {
        ;
    }
    void func1()
    {
        ;
    }
    ....................
    void func20()
    {
        ;
    }
    
    
    //////////////////////////////////////////////////////////////////////
    // 键盘监控,根据当前状态特征指向不同的指针表,并调用相应的函数     //
    //////////////////////////////////////////////////////////////////////
    void mon(ubyte key)
    {
       ubyte code *data pTab;
       kbCode=key;
       pTab=*(TAB+kbStatus);                // 根据当前状态特征指向分指针表
       while(*pTab != key && *pTab != 0)    // 按照按键代码查表
       {
            pTab += 3;                          // 查表
       }
       if(*pTab!=0){
          pTab++;
          kbStatus=*pTab;                       // 取状态特征字节
          pTab++;                               // 指向执行函数
          (*KeyProcTab[*pTab])();               // 指针函数调用
       }
    }
  • 相关阅读:
    Apache Solr学习 第二篇 solr安装(windows)
    Apache Solr学习 第一篇 简介和安装环境准备
    第二篇 redis常用操作命令
    第一篇 redis简介及安装
    使用maven安装jar包到本地仓库时遇到The goal you specified requires a project to execute but there is no POM in this directory错误
    使用Arrays.asList()时遇到的问题
    linux下zookeeper的安装
    第六篇 mybatis的运行原理(3):工厂方法模式,SqlSession的创建
    leetcode 剑指 Offer 35. 复杂链表的复制
    leetcode 112. 路径总和
  • 原文地址:https://www.cnblogs.com/shihao/p/2173288.html
Copyright © 2011-2022 走看看