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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

問下我的單片機+LCD1602顯示函數怎么編寫完成?

[復制鏈接]
跳轉到指定樓層
樓主
這是我的C語言程序:
#include <reg51.h>
        #include <string.h>
        #define uchar unsigned char
        #define uint  unsigned int
        #define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
        sbit RS  = P2^0;
        sbit RW  = P2^1;
        sbit EN  = P2^2;
        sbit SPK = P3^7;
        //12個鍵盤按鍵字符總表
        //注意串空間應設為6字節,因為最長串為5,設為5時會使部分長串無法附帶串結束標志'\0'
        uchar code KeyPad_Chars[12][6] =
        {"1 ","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ","*","0+","#"};
        uchar code Line1[] = " Mobile KeyPad  "; //固定顯示字符串
        uchar code Line2[] = "KEY_CHAR:      ";
        uchar KeyNo = -1;        //鍵位0~11
        uchar Inner_Idx = 0;     //同鍵位的內部索引
        uchar tSpan = 0;         //同鍵位連續按鍵的時間間隔
// 延時
        //-----------------------------------------------------------------
        void DelayMS(uint ms)
        {
          uchar i;
          while(ms--) for(i = 0; i < 50; i++);
        }
        //-----------------------------------------------------------------
        // 限于篇幅,這里省略了部分LCD顯示控制函數,讀者可自行補充完整.
        // uchar Get_LCD_Status()
        // void Busy_Waiting()
        // void Write_LCD_DATA(uchar dat)
        // void Write_LCD_Command(uchar cmd)
        // void Init_LCD()
        // void Set_LCD_POS(uchar position)
        //-----------------------------------------------------------------
        //-----------------------------------------------------------------
        // 鍵盤矩陣掃描
        //-----------------------------------------------------------------
        void Keys_Scan()
        {
            //高四位置0,放入四行
            P1 = 0x0F; DelayMS(1);
            //按鍵后00001111將變成0000XXXX,X中1個為0,3個仍為1
            //判斷按鍵發生于0~3列中的哪一列
            switch (P1)
    {
              case 0x0E: KeyNo = 0; break;
              case 0x0D: KeyNo = 1; break;
              case 0x0B: KeyNo = 2; break;
            }
            //低四位置0,放入四列
            P1 = 0xF0; DelayMS(1);
            //按鍵后11110000將變成XXXX0000,X中1個為0,3個仍為1
            //對0~3行分別附加起始值0,4,8,12
            switch (P1)
            {
              case 0xE0: KeyNo += 0; break;   //此行可省,這里為了對稱而保留
              case 0xD0: KeyNo += 3; break;
              case 0xB0: KeyNo += 6; break;
              case 0x70: KeyNo += 9;
            }
        }
        //-----------------------------------------------------------------
        // 蜂鳴器
        //-----------------------------------------------------------------
        void Beep()
        {
          uchar i;
          for(i = 0; i < 60; i++)
          {
            SPK = !SPK; DelayMS(1);
          }
          SPK = 1;
          DelayMS(100);
        }
        //-----------------------------------------------------------------
        // 定時器0跟蹤同位按鍵的時間間隔
        //-----------------------------------------------------------------
        void T0_INT() interrupt 1
{
          TH0 = -50000  / 256;
          TL0 = -50000  % 256;
          //tSpan最大值限制在41及即以上即可
          //不加限制時會使某次較長的延時累加超過255后,累加又從0開始
          //而程序判斷時它可能剛好還在40以內,
          //從而導致較長的延時卻被誤斷為較短的延時
          if (tSpan < 50 ) tSpan++; else TR0 = 0;
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar i,Pre_KeyNo = -1;
          IE = 0x82;
          TMOD = 0x01;
          TH0 = -50000  / 256;
          TL0 = -50000  % 256;
          P0 = P2 = 0xFF;
          DelayMS(10);
          Init_LCD();                        //初始化
          Set_LCD_POS(0);                    //顯示第一行
          for(i = 0; i < 16; i++)
            Write_LCD_DATA(Line1[ i]);
          Set_LCD_POS(0x40);                 //顯示第二行
  for(i = 0; i < 16; i++)
            Write_LCD_DATA(Line1);
          Set_LCD_POS(0x40);                 //顯示第二行
          for(i = 0; i < 16; i++)
            Write_LCD_DATA(Line2);
          while(1)
          {
              P1 = 0xF0;
              //有鍵按下則掃描,否則不作任何處理
              if(P1 != 0xF0) Keys_Scan(); else continue;
              if (Pre_KeyNo != KeyNo)         //按下新按鍵
              {
                Pre_KeyNo = KeyNo;
                tSpan = 0;                   //時間間隔歸0
                Inner_Idx = 0;               //按鍵內部索引歸0
                TR0 = 1;                      //按下新按鍵時啟動計時
              }
              else                            //否則按下的是相同位置按鍵
              {
                //同位按鍵時間間隔在50ms×40=2s以內則認為是連續按鍵
                //否則按鍵內字符索引歸0
                if (tSpan <= 40)
                Inner_Idx = (Inner_Idx + 1) % strlen(KeyPad_Chars[KeyNo]);
                else
                Inner_Idx = 0;
                tSpan = 0;
              }
              Set_LCD_POS(0x4B);
              Write_LCD_DATA(KeyPad_Chars[KeyNo][Inner_Idx]); //顯示按鍵字符
      Beep();
              DelayMS(400);
          }
        }


當中出現的遺漏:




編譯之后出現的錯誤:



這是我的部分電路圖:

求大神幫我解決!!!!!!!!!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:584814 發表于 2019-12-13 07:37 | 只看該作者
你是忙KEY派來的逗13么 ,這么大段空白程序也不寫明接口就讓人填空
回復

使用道具 舉報

板凳
ID:721871 發表于 2020-6-24 09:41 | 只看該作者
   uchar code KeyPad_Chars[12][6] =
        {"1 ","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ","*","0+","#"};這一句是啥意思呀,有人解釋一下嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品jizz在线观看老狼 | 午夜精品一区二区三区在线观看 | 成人免费一级 | 草在线| 欧美不卡在线 | 欧美性生交大片免费 | 欧美日韩黄色一级片 | 国产精品视频999 | 久久综合久色欧美综合狠狠 | 欧美 日韩 国产 在线 | 亚洲国产精品va在线看黑人 | 污视频在线免费观看 | 久久综合久久久 | 天天操 天天操 | 免费av在线网站 | 精品国产精品国产偷麻豆 | 精品国产乱码久久久久久影片 | 国产精品我不卡 | 国家一级黄色片 | 久久精品国产久精国产 | 国产精品一区二区福利视频 | 日韩羞羞 | 欧美精品久久久 | 亚洲免费观看视频网站 | 日韩欧美国产电影 | 色中文在线 | 一区二区三区中文字幕 | 精品免费在线 | 久久久久久国产精品 | 成年人在线观看 | 91久久久久久久久久久 | 国产高清区 | 欧美成人高清 | 一区二区免费在线视频 | 精品久久久999 | 国产美女免费视频 | 国产日韩欧美电影 | 精品欧美一区二区久久久伦 | 丁香综合 | 一区二区高清 | 碰碰视频 |