久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3191|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品乱人伦一区二区三区 | 日韩一级 | 亚洲精品视频一区 | 一级特黄色毛片 | 黄色在线观看 | 日本久久久久久久久 | 超碰97免费在线 | 日本亚洲精品成人欧美一区 | 综合二区 | 在线看无码的免费网站 | 久艹av| 最新国产精品 | 黄色av网站在线免费观看 | 久久久久久国产精品免费免费 | 久99久视频 | 一级黄色毛片 | 天天干视频 | 欧美一区二区三区国产精品 | 欧美亚洲网站 | 四虎成人精品永久免费av九九 | 精国产品一区二区三区四季综 | 亚洲高清电影 | 国产在线一区二区三区 | 一区二区三区四区电影 | 精品蜜桃一区二区三区 | 黄色一级网 | 久久久精 | 久久999| 天天夜夜操 | 在线一区二区三区 | 亚洲日本乱码在线观看 | 中文字幕精品一区二区三区精品 | 亚洲一区在线播放 | 91精品国产综合久久久久 | 精品国产一区二区三区久久 | 精品一区在线 | 免费在线成人 | 国产精品成人一区二区三区 | 91精品久久久久久久久中文字幕 | 美女日批免费视频 | www.日本国产 |