欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2217|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:660152 發(fā)表于 2019-12-12 16:36 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的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個鍵盤按鍵字符總表
        //注意串空間應(yīng)設(shè)為6字節(jié),因為最長串為5,設(shè)為5時會使部分長串無法附帶串結(jié)束標志'\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;     //同鍵位的內(nèi)部索引
        uchar tSpan = 0;         //同鍵位連續(xù)按鍵的時間間隔
// 延時
        //-----------------------------------------------------------------
        void DelayMS(uint ms)
        {
          uchar i;
          while(ms--) for(i = 0; i < 50; i++);
        }
        //-----------------------------------------------------------------
        // 限于篇幅,這里省略了部分LCD顯示控制函數(shù),讀者可自行補充完整.
        // 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
            //判斷按鍵發(fā)生于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以內(nèi),
          //從而導(dǎo)致較長的延時卻被誤斷為較短的延時
          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;               //按鍵內(nèi)部索引歸0
                TR0 = 1;                      //按下新按鍵時啟動計時
              }
              else                            //否則按下的是相同位置按鍵
              {
                //同位按鍵時間間隔在50ms×40=2s以內(nèi)則認為是連續(xù)按鍵
                //否則按鍵內(nèi)字符索引歸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);
          }
        }


當中出現(xiàn)的遺漏:




編譯之后出現(xiàn)的錯誤:



這是我的部分電路圖:

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表