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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1935|回復: 8
打印 上一主題 下一主題
收起左側

單片機矩陣按鍵和串口配合使用問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1007138 發表于 2022-3-9 19:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我想問的是為什么只能用hex模式來發送而且怎么才能實現我不點串口助手的發送,只要我一按下按鍵就能發送到我的pc呢?

單片機源程序如下:
#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

uchar code duan[16] = {0x3f,0x06,0x5b,0x4f,
                                                0x66,0x6d,0x7d,0x07,
                                                0x7f,0x6f,0x77,0x7c,
                                                0x39,0x5e,0x79,0x71};
uchar KeyValue;

void delay(uint z) {
        uint y;
        for (;z>0;z--)
                for (y = 0; y < 110; y++);
}

void chuankouInit() {
        TMOD = 0x20;
        TH1 = 243;
        TL1 = 243;
        TR1 = 1;
        SCON = 0x50;
        PCON = 0x80;  //倍波特率
        ES = 1;
        EA = 1;
}

void keypros() {
        //uint a;
        P1 = 0xf0;                                  //0xff不行,一定要控制變量先行后列或者先列后行否則要列出所有情況
        if (P1!=0xf0) {
                delay(10);
                if (P1!= 0xf0) {
                        switch (P1) {
                                case (0x70): KeyValue = 3;break;
                                case (0xb0): KeyValue = 2;break;
                                case (0xd0): KeyValue = 1;break;
                                case (0xe0): KeyValue = 0;break;
                        }
                        P1 = 0x0f;
                        if (P1!=0x0f) {
                                switch (P1) {
                                        case (0x07): KeyValue += 12;break;
                                        case (0x0b): KeyValue += 8;break;
                                        case (0x0d): KeyValue += 4;break;
                                        case (0x0e): KeyValue += 0;break;        
                                }
                        }                        
                }
        }
//        while ((a < 50) && (P1!=0x0f)) {
//                delay(10);
//                a++;
//        }        
}

void main() {        
        chuankouInit();
        while (1) {
                keypros();
                P0 = ~duan[KeyValue];
        }               
}

void chuankou() interrupt 4 {
        uchar receiveData;
        receiveData = KeyValue;
        RI = 0;                   //收完

        SBUF = KeyValue;
        while (!TI);
        TI = 0;   //發完
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2022-3-9 22:11 | 只看該作者
先假設你的矩陣按鍵和串口設置代碼正確

  1. void keypros() {
  2.     //uint a;
  3.     P1 = 0xf0;                                  //0xff不行,一定要控制變量先行后列或者先列后行否則要列出所有情況
  4.     if (P1!=0xf0) {
  5.         delay(10);
  6.         if (P1!= 0xf0) {
  7.             switch (P1) {
  8.             case (0x70):
  9.                 KeyValue = 3;
  10.                 break;
  11.             case (0xb0):
  12.                 KeyValue = 2;
  13.                 break;
  14.             case (0xd0):
  15.                 KeyValue = 1;
  16.                 break;
  17.             case (0xe0):
  18.                 KeyValue = 0;
  19.                 break;
  20.             }
  21.             P1 = 0x0f;
  22.             if (P1!=0x0f) {
  23.                 switch (P1) {
  24.                 case (0x07):
  25.                     KeyValue += 12;
  26.                     break;
  27.                 case (0x0b):
  28.                     KeyValue += 8;
  29.                     break;
  30.                 case (0x0d):
  31.                     KeyValue += 4;
  32.                     break;
  33.                 case (0x0e):
  34.                     KeyValue += 0;
  35.                     break;
  36.                 }
  37.                                                                 KeyUpdated = 1;
  38.             }
  39.         }
  40.     }
  41. //        while ((a < 50) && (P1!=0x0f)) {
  42. //                delay(10);
  43. //                a++;
  44. //        }
  45. }
  46. bit Hex_En = 0;
  47. void main() {
  48.     chuankouInit();
  49.     while (1) {
  50.         keypros();
  51.         P0 = ~duan[KeyValue];
  52.         if(KeyUpdated)
  53.         {
  54.             while (TI);
  55.             if(Hex_En)
  56.             {
  57.                 SBUF = KeyValue;///不+'0'發數值,+'0'發字符
  58.             } else {
  59.                 if(KeyValue < 10)
  60.                 {
  61.                     SBUF = KeyValue + '0';///不+'0'發數值,+'0'發字符
  62.                 } else {
  63.                     SBUF = KeyValue + 0x37;//10 + 0x37 = 0x41 = 'A'
  64.                 }
  65.             }
  66.             KeyUpdated = 0;
  67.         }
  68.     }
  69. }

  70. void chuankou() interrupt 4 {
  71.     uchar receiveData;
  72.     receiveData = KeyValue;
  73.     if(RI)
  74.     {
  75.         RI = 0;                   //收完
  76.     }
  77.     if(TI)
  78.     {
  79.         TI = 0;   //發完
  80.     }
  81. }
復制代碼



回復

使用道具 舉報

板凳
ID:213173 發表于 2022-3-10 06:35 | 只看該作者
串口發送放在按鍵松手后
  1. #include <reg52.h>

  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;

  4. uchar code duan[] = {0x3f,0x06,0x5b,0x4f,
  5.                         0x66,0x6d,0x7d,0x07,
  6.                         0x7f,0x6f,0x77,0x7c,
  7.                         0x39,0x5e,0x79,0x71};
  8. uchar KeyValue;

  9. void delay(uint z)
  10. {
  11.         uint y;
  12.         for (;z>0;z--)
  13.                 for (y = 0; y < 110; y++);
  14. }

  15. void chuankouInit()
  16. {
  17.         TMOD = 0x20;
  18.         TH1 = 243;
  19.         TL1 = 243;
  20.         TR1 = 1;
  21.         SCON = 0x50;
  22.         PCON = 0x80;  //倍波特率
  23.         ES = 1;
  24.         EA = 1;
  25. }

  26. void keypros()
  27. {
  28.         P3 = 0xf0;//0xff不行,一定要控制變量先行后列或者先列后行否則要列出所有情況
  29.         if (P3!=0xf0)
  30.         {
  31.                 delay(10);
  32.                 if (P3!= 0xf0)
  33.                 {
  34.                         switch (P3)
  35.                         {
  36.                                 case (0x70): KeyValue = 3;break;
  37.                                 case (0xb0): KeyValue = 2;break;
  38.                                 case (0xd0): KeyValue = 1;break;
  39.                                 case (0xe0): KeyValue = 0;break;
  40.                         }
  41.                         P3 = 0x0f;
  42.                         switch (P3)
  43.                         {
  44.                                 case (0x07): KeyValue += 12;break;
  45.                                 case (0x0b): KeyValue += 8;break;
  46.                                 case (0x0d): KeyValue += 4;break;
  47.                                 case (0x0e): KeyValue += 0;break;        
  48.                         }                       
  49.                         while(P3 != 0x0f);
  50.                         SBUF = KeyValue;
  51.                         while (!TI);
  52.                         TI = 0;   //發完
  53.                 }
  54.         }
  55. }

  56. void main()
  57. {        
  58.         chuankouInit();
  59.         while (1)
  60.         {
  61.                 keypros();
  62.                 P0 = ~duan[KeyValue];
  63.         }               
  64. }

  65. void chuankou() interrupt 4
  66. {
  67.         uchar receiveData;
  68.         receiveData = KeyValue;
  69.         RI = 0;                   //收完
  70. }
復制代碼
回復

使用道具 舉報

地板
ID:1007138 發表于 2022-3-10 12:05 | 只看該作者
lkc8210 發表于 2022-3-9 22:11
先假設你的矩陣按鍵和串口設置代碼正確

感謝,懂了,但是為什么有些數據會不正常顯示呢?出現一個口,然后多按幾次有正常了,這是我單片機的問題還是串口助手問題還是什么?
回復

使用道具 舉報

5#
ID:1007138 發表于 2022-3-10 12:05 | 只看該作者
wulin 發表于 2022-3-10 06:35
串口發送放在按鍵松手后

感謝,懂了,但是為什么有些數據會不正常顯示呢?出現一個口,然后多按幾次有正常了,這是我單片機的問題還是串口助手問題還是什么?
回復

使用道具 舉報

6#
ID:1007138 發表于 2022-3-10 12:05 | 只看該作者
wulin 發表于 2022-3-10 06:35
串口發送放在按鍵松手后

感謝,懂了,但是為什么有些數據會不正常顯示呢?出現一個口,然后多按幾次有正常了,這是我單片機的問題還是串口助手問題還是什么?
回復

使用道具 舉報

7#
ID:161164 發表于 2022-3-10 17:13 | 只看該作者
小小彩姬 發表于 2022-3-10 12:05
感謝,懂了,但是為什么有些數據會不正常顯示呢?出現一個口,然后多按幾次有正常了,這是我單片機的問題 ...

感覺是晶振問題
如果用的是12MHz的晶振會有誤差的
每當需要串口通訊時
最好用11.0952MHz或倍數的晶振
回復

使用道具 舉報

8#
ID:1007138 發表于 2022-3-10 17:46 | 只看該作者
lkc8210 發表于 2022-3-10 17:13
感覺是晶振問題
如果用的是12MHz的晶振會有誤差的
每當需要串口通訊時

haode,xiexie
回復

使用道具 舉報

9#
ID:121859 發表于 2022-3-10 18:06 | 只看該作者
發送程序放到中斷外面,比如按鍵檢測那里就可以了。現在的情況是必須要接收到一個數據才能發送鍵值。想要發送ASCII碼 ,可以將鍵值+0x30
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩久久久 | 精品一区二区久久久久久久网精 | 中文二区| 日韩一区二 | 草草网 | 久久成人一区 | 91视频在线 | 黄网站色大毛片 | 黄片毛片| 欧美国产中文字幕 | 久久se精品一区精品二区 | 一级黄在线观看 | 超碰在线人人干 | 91久久精品一区二区三区 | 一区二区三区在线免费观看 | 亚洲高清一区二区三区 | 看a网站| 欧美精品久久久 | a级片在线 | 国产午夜精品一区二区三区嫩草 | 精品国产一区一区二区三亚瑟 | 久久成人精品视频 | 啪啪网页 | 中文字幕在线一区二区三区 | 成人免费观看男女羞羞视频 | 91极品尤物在线播放国产 | 国产高清视频在线观看 | 欧美人妖网站 | 91免费小视频 | 妞干网视频| 欧美 日韩 中文 | 亚洲福利精品 | 久久亚洲精品久久国产一区二区 | 国产精品免费在线 | 日韩一区二区三区在线观看 | 狠狠久久综合 | 国产1区 | 91av视频| 欧美国产亚洲一区二区 | 国产成人精品一区二区三区在线 | 久久久激情视频 |