stevenzhou1999 发表于 2008-4-8 15:00:17

求助:4*4键盘状态机程序问题

用proteus仿真没问题,可实际写到片子里就一点都不工作,读pinc口电平不能和预期的一样,这是怎么回事呢,请老师帮忙,谢谢
用的是8mhz内部晶振



/*-------------------------------------------------------------------------
                              键盘扫描程序
---------------------------------------------------------------------------*/
unsigned char read_keyboard(void)
{         
static unsigned char key_state = 0, key_value, key_line;
unsigned char key_return = No_key,i;
      switch (key_state)
      {
                case 0:
                                             key_line = 0b00000001;
                        for (i=1; i<=4; i++)                                        // 扫描键盘
                        {         
                              PORTC = ~key_line;                              // 输出行线电平
                              PORTC = ~key_line;                                        // 必须送2次!!!(注1)
                           key_value = Key_mask & PINC;                // 读列电平
                              if (key_value == Key_mask)
                                        key_line <<= 1;                              // 没有按键,继续扫描
                              else
                              {
                                        key_state++;// 有按键,停止扫描
                                        break;                                                // 转消抖确认状态
                              }
                        }
                        break;
                case 1:
                        
                        if (key_value == (Key_mask & PINC))                // 再次读列电平,
                        {      
                              switch (key_line | key_value)                // 与状态0的相同,确认按键
                              {                                                                // 键盘编码,返回编码值
                                        case 0b11101000:
                                                key_return = 0;
                                                break;
                                        case 0b11100100:
                                                key_return = 1;
                                                break;
                                       case 0b11010100:
                                                key_return = 2;
                                                break;
                                       case 0b10110100:
                                                key_return = 3;
                                                break;
                                       case 0b11100010:
                                                key_return = 4;
                                                break;
                                        case 0b11010010:
                                                key_return = 5;
                                                break;
                                       case 0b10110010:
                                                key_return = 6;
                                                break;
                                       case 0b11100001:
                                                key_return = 7;
                                                break;
                                        case 0b11010001:
                                                key_return = 8;
                                                break;
                                       case 0b10110001:
                                                key_return = 9;
                                                break;
                                       case 0b11011000:
                                                key_return = 10;
                                                break;
                                        case 0b10111000:
                                                key_return = 11;
                                                break;
                                        case 0x78:
                                                key_return = 12;
                                                break;
                                        case 0x74:
                                                key_return = 13;
                                                break;
                                        case 0x72:
                                                key_return = 14;
                                                break;
                                        case 0x71:
                                                key_return = 15;
                                                break;
                              }
                              key_state++;                              // 转入等待按键释放状态
                        }
                        else
                              key_state--;                              // 两次列电平不同返回状态0,(消抖处理)
                        break;                                                
                case 2:         
                                                      // 等待按键释放状态
                        PORTC = 0b00000000;                        // 行线全部输出低电平
                        PORTC = 0b00000000;                        // 重复送一次
                        if ( (Key_mask & PINC) == Key_mask)
                              key_state=0;
                                                      // 列线全部为高电平返回状态0
                        break;
      }
      return key_return;
}



在主程序中
                key=read_keyboard(); //读键盘

machao 发表于 2008-4-8 23:00:24

如果是M16,禁止了JTAG吗?

stevenzhou1999 发表于 2008-4-9 08:34:02

谢谢你 ,马老师,已经正常运行了

taishandadi 发表于 2008-4-11 20:05:22

最好把你如何解决的写写,这样其他人可以参考下思路。

stevenzhou1999 发表于 2008-4-15 08:09:27

用双龙的烧写软件,如图
把jtagen项点上,提示你要关闭jtag功能么,确定就好了
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_252242.JPG
(原文件名:jtag.JPG)

taishandadi 发表于 2008-4-18 10:59:23

谢谢。

machao 发表于 2008-4-18 16:14:10

偶的书中如此的强调,在开始就给出了注意,为什么就不看书呢?
页: [1]
查看完整版本: 求助:4*4键盘状态机程序问题