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

📄 cgwos_function.h

📁 用于51单片机的2个延时函数,1和4_4矩阵按键函数
💻 H
字号:
#ifndef __CGWOS_FUN_H__
#define __CGWOS_FUN_H__

/*------------------------------------------------------------------------------
        --延时--
说明: 延时时间为1~65535毫秒
*/
void CGWOS_1ms(unsigned int delay_i1)
{
    unsigned int delay_j1;
    unsigned int delay_k1;
    for(delay_j1=delay_i1;delay_j1>0;delay_j1--)
        for(delay_k1=124;delay_k1>0;delay_k1--);
}

/*------------------------------------------------------------------------------
        --延时--
说明: 延时时间为0.1~2.55毫秒
*/
void CGWOS_01ms(unsigned char delay_i2)
{
    unsigned char delay_j2;
    unsigned char delay_k2;
    for(delay_j2=delay_i2;delay_j2>0;delay_j2--)
        for(delay_k2=45;delay_k2>0;delay_k2--);
}
/*------------------------------------------------------------------------------
        --4×4矩阵键盘--

//说明:Px是未定义的端口,使用前必须先对Px定义.

+-----------------------------------+
|     返回值=(~a + ~b)              |
+-----------+--------------+        |   ----------------示例-----------------+
|   行(a)   |     列(b)    |        |
+-----------+--------------+        |
|           | 1110 1111    |==>0x11 |
|           +--------------+        |
|           | 1101 1111    |==>0x21 |   本函数的所有返回值均列在左边的表格中,
| 1111 1110 +--------------+        |   建议用switch()来获取返回值.例如:
|           | 1011 1111    |==>0x41 |
|           +--------------+        |
|           | 0111 1111    |==>0x81 |   switch(jianpan())
+-----------+--------------+        |   {
|           | 1110 1111    |==>0x12 |      case 0x11 : {...} break;
|           +--------------+        |
|           | 1101 1111    |==>0x22 |
| 1111 1101 +--------------+        |
|           | 1011 1111    |==>0x42 |
|           +--------------+        |      ...
|           | 0111 1111    |==>0x82 |
+-----------+--------------+        |
|           | 1110 1111    |==>0x14 |
|           +--------------+        |
|           | 1101 1111    |==>0x24 |      case 0x88 : {...} break;
| 1111 1011 +--------------+        |      default   : ;
|           | 1011 1111    |==>0x44 |    }
|           +--------------+        |
|           | 0111 1111    |==>0x84 |
+-----------+--------------+        |
|           | 1110 1111    |==>0x18 |
|           +--------------+        |
|           | 1101 1111    |==>0x28 |
| 1111 0111 +--------------+        |
|           | 1011 1111    |==>0x48 |
|           +--------------+        |
|           | 0111 1111    |==>0x88 |
+-----------+--------------+--------+

        +5V---------+---+---+---+
                    |   |   |   |
        10K x 4    | | | | | | | |
                   | | | | | | | |
  +-------+         |   |   |   |
  |   Px.0+---------1---2---3---4 <---------------+
  |       |         |   |   |   |                 |
  |   Px.1+---------5---6---7---8                 |
  |       |         |   |   |   |                 |
  |   Px.2+---------9---0---A---B                 |
  |       |         |   |   |   |                 |
  |   Px.3+---------C---D---E---F <---------------|--------------+
  |       |         |   |   |   |                 |              |
  |       |         |   |   |   |                 |              |
  |   Px.4+---------+   |   |   |         初始值  |            移三次
  |       |             |   |   |         1111 1110           1110 1111
  |   Px.5+-------------+   |   |       & 0001 0000         & 0001 0000
  |       |                 |   |       ----------------    ---------------
  |   Px.6+-----------------+   |         0001 0000 != 0      0000 0000 = 0
  |       |                     |             |                   |
  |   Px.7+---------------------+             +---------+---------+
  +-------+                                             |
*///                                                    |
unsigned char CGWOS_key44(void)//                            |
{                          //                           |
    unsigned char a,b;// 行,列                          |
    unsigned int delay_j1;//                            |
    unsigned int delay_k1;//                            |
    Px=0xf0;               //                           |
    if(Px != 0xf0)// 可能有键按下                       |
    {                      //                           |
        for(delay_j1=10;delay_j1>0;delay_j1--)//        |
           for(delay_k1=124;delay_k1>0;delay_k1--);//   |
        if(Px != 0xf0)// 确实有键按下                   |
        {             //                                |
            a=0xfe; // 扫描初值,按Px.0--->Px.3方向扫描  |
            // 判断是否全部扫描完,a的值只能是低四位(行) |
            while((a&0x10) != 0)// ---------------------+
            {
                // Px = 1111 1110 ==> 1111 1101 ==> 1111 1011 ==> 1111 0111
                Px=a;// 输出行扫描码
                // 判断本行是否有键按下;若无,则移一位继续判断;
                // 若有,高四位的其中一位被强制为"0"
                if((Px&0xf0) != 0xf0)// 高四位的其中一位被强制为"0",条件成立
                {
                    b=(Px&0xf0) | 0x0f;//只获取高四位(列)的特征码
                    return((~a) + (~b));// 返回特征字节码(行和列)
                }
                else
                {
                    // C中没有循环移位,"|0x01"就是为了产生循环移位效果,
                    // 防止移位时右端补"0",保证每次只有一行为"0"
                    a=(a << 1)|0x01;// 行扫描码左移一位
                }
            }
        }
    }
    else
    {
        return(0);// 无键按下,返回零
    }
}

#endif

⌨️ 快捷键说明

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