搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2008-4-8 15:00:17 | 显示全部楼层 |阅读模式
用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(); //读键盘

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-4-8 23:00:24 | 显示全部楼层
如果是M16,禁止了JTAG吗?

出0入0汤圆

 楼主| 发表于 2008-4-9 08:34:02 | 显示全部楼层
谢谢你 ,马老师,已经正常运行了

出75入4汤圆

发表于 2008-4-11 20:05:22 | 显示全部楼层
最好把你如何解决的写写,这样其他人可以参考下思路。

出0入0汤圆

 楼主| 发表于 2008-4-15 08:09:27 | 显示全部楼层
用双龙的烧写软件,如图
把jtagen项点上,提示你要关闭jtag功能么,确定就好了

(原文件名:jtag.JPG)

出75入4汤圆

发表于 2008-4-18 10:59:23 | 显示全部楼层
谢谢。

出0入0汤圆

发表于 2008-4-18 16:14:10 | 显示全部楼层
偶的书中如此的强调,在开始就给出了注意,为什么就不看书呢?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 14:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表