首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

4×4矩阵按键扫描,不知哪里出错?解决方案

2012-02-05 
44矩阵按键扫描,不知哪里出错?44 矩阵按键扫描(行线接 P1.0~P1.4; 列线接P1.5~P1.7;列线(P1.5~P1.7)通过接

4×4矩阵按键扫描,不知哪里出错?
4×4 矩阵按键扫描(行线接 P1.0~P1.4; 列线接P1.5~P1.7;列线(P1.5~P1.7)通过接上拉电阻拉电源),无法返回按键值,不知哪里出错?
接线图:

源码:

C/C++ code
// 键盘扫描函数,无按键返回 16,有键按下返回键值.uchar keyscan(void){        // row: 行号  Column: 列号  num: 按键号     // row_data: 行状态 Column_data: 列状态    uchar row, Column, num, row_data, Column_data;    P1 = 0xf0;    // 将行线(P1.0 ~ P1.3)拉低     if((P1 & 0xf0) != 0xf0)    // 有键按下    {        delay();            // 消抖    }    if((P1 & 0xf0) != 0xf0)    // 消抖后还是有键按下,则查找键值    {        row_data = 0xfe;    // 首行扫描字送变量 row_data        row = 0;        // 首行号送 row            while(1)        {                P1 = row_data;        // 行扫描字送 P1 口            Column_data = P1;    // 读入 P1 口的列状态                        if((Column_data & 0x10) == 0)            {                Column = 0;      // 第 0 列有键按下,第 0 列首号送 Column                break;            }            else if((Column_data & 0x20) == 0)            {                Column = 1;      // 第 1 列有键按下,第 1 列首号送 Column                break;            }            else if((Column_data & 0x40) == 0)            {                Column = 2;      // 第 2 列有键按下,第 2 列首号送 Column                break;            }        else if(Column_data & 0x80 == 0)        {            Column = 3;            // 第 3 列有键按下,第 3 列首号送 Column            break;        }                        row += 4;         // 扫描行号加 4 (第2行从 4 开始排列:0 4 8 12)            row_data <<= 1;        // 扫描下一行          //_crol_(row_data, 1);        }                  num = row + Column;        // 将行号与列号相加,求键号                    do        {            P1 = 0xf0;        delay();         }while((P1 & 0xf0) != 0xf0);   // 等待释放按键              return num;    }    return 16;}


[解决办法]
1)row_data <<= 1; 实现的是左移(不是循环左移), 
可以改成row_data = (row_data<<1)| 0x01;
2)另外if((P1 & 0xf0) != 0xf0) // 有键按下
{ delay(); } // 消抖
应该改成:
if((P1 & 0xf0) == 0xf0)
return 16; //无键按下
delay(); // 消抖



[解决办法]
keil软件里面有一个自带的_rol_函数的啊,就是用来循环左移用的。
[解决办法]
MARK 你按第一行也没反应么?

热点排行