找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2782|回复: 14
收起左侧

这个单片机矩阵键盘的程序,为什么一半工作 一半不工作呢?

  [复制链接]
ID:350005 发表于 2019-11-15 21:15 | 显示全部楼层 |阅读模式
uchar KeyScan(void)  
{
uchar cord_h,cord_l;
P2=0x0f;           
cord_h=P2&0x0f;   
if(cord_h!=0x0f)   
{
  DelayMs(10);        
  if((P2&0x0f)!=0x0f)
  {
    cord_h=P2&0x0f;  
    P2=cord_h|0xf0;
    cord_l=P2&0xf0;  

    while((P2&0xf0)!=0xf0);

    return(cord_h+cord_l);
   }
  }return(0xff);     
}

uchar KeyPro(void)
{
switch(KeyScan())
{
  case 0xee:return '1';break;
  case 0xed:return '4';break;
  case 0xeb:return '7';break;
  case 0xe7:return '.';break;

  case 0xde:return '2';break;
  case 0xdd:return '5';break;
  case 0xdb:return '8';break;
  case 0xd7:return '0';break;

  case 0xbe:return '3';break;
  case 0xbd:return '6';break;
  case 0xbb:return '9';break;
  case 0xb7:return '=';break;

  case 0x7e:return '+';break;
  case 0x7d:return '-';break;
  case 0x7b:return '*';break;
  case 0x77:return '/';break;

  default:return 0xff;break;
}
}

回复

使用道具 举报

ID:123289 发表于 2019-11-16 08:06 | 显示全部楼层
你是如何看出一半未工作的呢?
回复

使用道具 举报

ID:25310 发表于 2019-11-16 08:13 | 显示全部楼层
检查下硬件吧,仿真的还是调板子?
回复

使用道具 举报

ID:394424 发表于 2019-11-16 08:30 | 显示全部楼层
是不是看门狗复位了
回复

使用道具 举报

ID:394424 发表于 2019-11-16 08:38 | 显示全部楼层
是不是看门狗复位了
回复

使用道具 举报

ID:330198 发表于 2019-11-16 09:36 | 显示全部楼层
硬件问题
回复

使用道具 举报

ID:546770 发表于 2019-11-16 09:57 | 显示全部楼层
我怎么感jio只能执行到第一条呢??
回复

使用道具 举报

ID:546770 发表于 2019-11-16 10:14 | 显示全部楼层
emmmm,错了错了,刚刚那条不算,你的cord_I应该永远都是0xf0,
回复

使用道具 举报

ID:245004 发表于 2019-11-16 23:17 | 显示全部楼层
uchar code Tab_PortKeyOut[4]={0xdf,0xef,0xbf,0x7f};//列线扫描电压,分为第1,2,3,4根列线
for(i = 0; i < 4; i++)
    {
        P2 = Tab_PortKeyOut[i];     //输出扫描电位。
回复

使用道具 举报

ID:213173 发表于 2019-11-17 14:17 | 显示全部楼层
你这个程序的写法是玩不转的,给你改写,用数码管显示仿真。
无标题.jpg

  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. unsigned char code table[]={//共阴数码管段码"0~f-."
  5.                 0x3f,0x06,0x5b,0x4f,
  6.                 0x66,0x6d,0x7d,0x07,
  7.                 0x7f,0x6f,0x77,0x7c,
  8.                 0x39,0x5e,0x79,0x71,0x40,0x80};

  9. void delayms(uint k)
  10. {
  11.         uint i,j;
  12.         for(i=k;i>0;i--)
  13.                 for(j=125;j>0;j--);
  14. }

  15. uchar KeyScan()  
  16. {
  17.         uchar cord_h,cord_l;
  18.         P2=0x0f;               
  19.         if(P2!=0x0f)   
  20.         {
  21.                 delayms(10);
  22.                 if(P2!=0x0f)
  23.                 {
  24.                         cord_l=P2;  
  25.                         cord_l|=0xf0;
  26.                         P2=cord_l;  
  27.                         cord_l=P2;   
  28.                         cord_h=cord_l;
  29.                         while(P2==cord_l);
  30.                         return cord_h;
  31.                 }
  32.         }
  33. }

  34. void KeyPro()
  35. {
  36.         static uchar num=16;
  37.         switch(KeyScan())
  38.         {
  39.                 case 0xee:num= 0;break;
  40.                 case 0xed:num= 1;break;
  41.                 case 0xeb:num= 2;break;
  42.                 case 0xe7:num= 3;break;
  43.                
  44.                 case 0xde:num= 4;break;
  45.                 case 0xdd:num= 5;break;
  46.                 case 0xdb:num= 6;break;
  47.                 case 0xd7:num= 7;break;
  48.                
  49.                 case 0xbe:num= 8;break;
  50.                 case 0xbd:num= 9;break;
  51.                 case 0xbb:num=10;break;
  52.                 case 0xb7:num=11;break;
  53.                
  54.                 case 0x7e:num=12;break;
  55.                 case 0x7d:num=13;break;
  56.                 case 0x7b:num=14;break;
  57.                 case 0x77:num=15;break;
  58.        
  59.                 default:break;
  60.         }
  61.         P0=table[num];
  62. }

  63. void main()
  64. {
  65.         while(1)
  66.         {
  67.                 KeyPro();
  68.         }
  69. }
复制代码




回复

使用道具 举报

ID:93224 发表于 2019-11-17 15:44 | 显示全部楼层
建议参考网上现成的程序
回复

使用道具 举报

ID:245004 发表于 2019-11-17 21:47 | 显示全部楼层
原来你们的写法不同啊,学习一下你们的写法:
  1. #include <intrins.h>
  2. #include <reg51.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. #define KEY_LENGTH 16
  6. uchar code TableKeyData[2][KEY_LENGTH] = {
  7.     {0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb, 0xb7, 0x7e, 0x7d, 0x7b, 0x77},
  8.     {'1', '4', '7', '.', '2', '5', '8', '0', '3', '6', '9', '=', '+', '-', '*', '/'}
复制代码



回复

使用道具 举报

ID:245004 发表于 2019-11-18 08:27 | 显示全部楼层
提交的时候很完整,怎么出来就显示不全了,重新提交一下:
  1. #include <intrins.h>
  2. #include <reg51.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. #define KEY_LENGTH 16
  6. uchar code TableKeyData[2][KEY_LENGTH] = {
  7.     {0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb, 0xb7,0x7e, 0x7d, 0x7b, 0x77},
  8.     {'1', '4', '7', '.', '2', '5', '8', '0', '3', '6', '9', '=', '+', '-', '*', '/'}};
  9. #define ID_KEY_DATA 0
  10. #define ID_KEY_NAME 1

  11. // @12.000MHz
  12. void Delay10ms(void) {
  13.   uchar i, j;

  14.   i = 20;
  15.   j = 113;
  16.   do {
  17.     while (--j) {
  18.     }
  19.   } while (--i);
  20. }

  21. uchar KeyScan(void) {
  22.   uchar ucData;
  23.   uchar i;

  24.   // 全部列下拉
  25.   P2 = 0x0f;
  26.   _nop_();
  27.   ucData = P2;
  28.   if (ucData == 0x0f) {
  29.     return KEY_LENGTH;
  30.   }
  31.   Delay10ms();
  32.   // 确定无抖动干扰
  33.   if (P2 != ucData) {
  34.     return KEY_LENGTH;
  35.   }
  36.   // 释放列下拉,转换为当前按键的行下拉
  37.   P2 = ucData | 0xf0;
  38.   _nop_();
  39.   // 读取键值
  40.   ucData = P2;
  41.   Delay10ms();
  42.   // 确定按键唯一准确
  43.   if (P2 != ucData) {
  44.     return KEY_LENGTH;
  45.   }
  46.   // 查表确定按键索引(ID),查到有效ID则退出,否则索引等于KEY_LENGTH
  47.   for (i = 0; i < KEY_LENGTH; i++) {
  48.     if (ucData == TableKeyData[ID_KEY_DATA][i]) {
  49.       break;
  50.     }
  51.   }
  52.   // 重置全部列下拉
  53.   P2 = 0x0f;
  54.   _nop_();
  55.   // 等待按键释放
  56.   while (P2 != 0x0f) {
  57.   }
  58.   // 返回按键ID
  59.   return i;
  60. }

  61. void main(void) {
  62.   uchar ucKey;

  63.   while (1) {
  64.     ucKey = KeyScan();
  65.     if (ucKey < KEY_LENGTH) {
  66.       P1 = ucKey;   // 临时测试,用P1观察结果
  67.       // 可以送显示结果,或者串口发送结果,或用swicth执行按键任务...
  68.       // LcdDisplay(0, 0, TableKeyData[ID_KEY_NAME][ucKey]);
  69.     }
  70.   }
  71. }
复制代码



回复

使用道具 举报

ID:644158 发表于 2019-11-18 11:15 | 显示全部楼层
检查下硬件吧,仿真的还是调板子?
回复

使用道具 举报

ID:350005 发表于 2019-11-30 16:58 | 显示全部楼层
嗯 可以了  是我硬件的错误  
谢谢大家
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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