找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索

單片機(jī)+aip650做一個(gè)孵化器的溫控,按鍵響應(yīng)不知怎么搞求助

查看數(shù): 4689 | 評(píng)論數(shù): 24 | 收藏 2
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請(qǐng)稍候......
發(fā)布時(shí)間: 2022-11-2 21:05

正文摘要:

aip650做一個(gè)孵化器的溫控,溫度顯示搞定了,按鍵響應(yīng)不知怎么搞。有會(huì)的嗎?請(qǐng)高手指點(diǎn)下。 單片機(jī)源程序如下: #include <absacc.h> #include <intrins.h> #include <STC89C5xRC.H> //定義常量 #d ...

回復(fù)

ID:680729 發(fā)表于 2022-11-16 07:17
不懂啊,跟棒錘差不了多少。
ID:213173 發(fā)表于 2022-11-16 06:32
jzcjz 發(fā)表于 2022-11-15 21:45
跟這爛芯片杠上了,重新把代碼手工輸了一遍。但還是不行。請(qǐng)各位高人指點(diǎn)迷津。

這么多警告不解決,你還想正常運(yùn)行?


ID:680729 發(fā)表于 2022-11-15 21:45
跟這爛芯片杠上了,重新把代碼手工輸了一遍。但還是不行。請(qǐng)各位高人指點(diǎn)迷津。
  1. /**********************************手工輸入********
  2. 名稱:aip650的驅(qū)動(dòng)
  3. 時(shí)間:2022-11-13
  4. 版本:

  5. **************************************************/
  6. //頭文件
  7. #include <STC89X52RC.H>
  8. #include <absacc.h>
  9. #include  <intrins.h>

  10. /*************************************************
  11.              常量、變量定義區(qū)


  12. ***************************************************/
  13. //常量定義
  14. #define true 1
  15. #define  false 0
  16. #define  uchar unsigned char
  17. #define  uint unsigned int

  18. //數(shù)組定義
  19. uchar Display_Code[13]={0xf5,0x05,0x73,0x57,0x87,0xd6,0xf6,0x45,0xf7,0xd7,0x08,0x02,0x00};
  20.          //共陰數(shù)碼管段碼 0,   1,  2,  3,  4 , 5,   6,  7,  8,  9,  .,   -,  不亮
  21. uchar  Display_16Code[16]={0xf5,0x05,0x73,0x57,0x87,0xd6,0xf6,0x45,0xf7,0xd7,0xe7,0xb6,0xf0,0x37,0xf2,0xe2};
  22. //16進(jìn) 制段碼(用于顯示鍵值)0,   1,   2,  3,  4,  5,   6, 7,  8,   9,  a,   b,   c,   d,   e,   f
  23. uchar Dig_Bit_Code[4]={0x6a,0x6e,0x6c,0x68};//650位碼
  24. uchar Light_Level_Code[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};//亮度調(diào)節(jié)

  25. uchar keyvalue;
  26. uint wendu;//用于存儲(chǔ)溫度值

  27. uint h;//溫度計(jì)算使用
  28. uint temp;//溫度返回值
  29. /***************************溫度小數(shù)部分用查表法*****************/
  30. uchar ditab[16]=
  31. {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  32. uchar temp_data[2]={0x00,0x00};//讀出溫度暫存
  33. uchar display[5]={0x00,0x00,0x00,0x00,0x00};//顯示單元數(shù)據(jù),共4個(gè)數(shù)據(jù)和一個(gè)運(yùn)算暫用

  34. //定義IO口
  35. sbit   SDA=P3^7;
  36. sbit   SCL=P3^6;

  37. sbit    DQ=P1^0;      //ds18b20溫度輸入口
  38. sbit    DIN=P1^1;     //LED小數(shù)點(diǎn)控制

  39. /**********************************函數(shù)定義區(qū)************************************/
  40. //I2C相關(guān)
  41. /*******************************************************************************
  42. 功能:I2CWait
  43. 描述:I2C延時(shí)
  44. 參數(shù):
  45. 返回:
  46. *******************************************************************************/
  47. void I2CWait(void)
  48. {_nop_();_nop_();_nop_();_nop_();
  49. }




  50. /*******************************************************************************
  51. 功能:I2CStart
  52. 描述:開啟I2C總線
  53. 參數(shù):
  54. 返回:位變量,1=I2C總線可用,0=不可用
  55. *******************************************************************************/
  56. bit I2CStart(void)
  57. {   
  58.         SDA=1;
  59.         SCL=1;
  60.         I2CWait();
  61. if(!SDA)
  62.         return false;//SDA線為低電平則總線忙,退出
  63.                 SDA=0;
  64.         I2CWait();
  65.         while(SDA)
  66.                 return false;//SDA線為高電平則總線出錯(cuò),退出
  67.         SCL=0;
  68.         I2CWait();
  69.         return true;

  70. }

  71. /*******************************************************************************
  72. 功能:I2CStop(void)
  73. 描述:關(guān)閉I2C總線
  74. 參數(shù):
  75. 返回:
  76. *******************************************************************************/
  77. void I2CStop(void)
  78. {
  79.   SDA=0;
  80.         SCL=0;
  81.         I2CWait();
  82.         SCL=1;
  83.         I2CWait();
  84.         SDA=1;

  85. }


  86. /*******************************************************************************
  87. 功能:I2CSendAck
  88. 描述:發(fā)送ACK信號(hào)
  89. 參數(shù):
  90. 返回:
  91. *******************************************************************************/
  92. void I2CSendAck(void)
  93. {
  94.         SDA=0;
  95.         SCL=0;
  96.         I2CWait();
  97.         SCL=1;
  98.         I2CWait();
  99.         SCL=0;
  100. }


  101. /*******************************************************************************
  102. 功能:I2CSendNoAck
  103. 描述:發(fā)送  No Ack
  104. 參數(shù):
  105. 返回:
  106. *******************************************************************************/
  107. void I2CSendNoAck(void)
  108. {   
  109.         SDA=1;
  110.         SCL=0;
  111.         I2CWait();
  112.         SCL=1;
  113.         I2CWait();
  114.         SCL=0;        
  115.         
  116. }

  117. /*******************************************************************************
  118. 功能:I2CWaitAck
  119. 描述:讀取ACK信號(hào)
  120. 參數(shù):
  121. 返回:位變量, 1=有ACK,0=無ACK
  122. *******************************************************************************/
  123. bit I2CWaitAck(void)
  124. {
  125.      uchar errtime=255;
  126.         SCL=0;
  127.         SDA=1;
  128.         I2CWait();
  129.         SCL=1;
  130.         I2CWait();
  131.         while(SDA)
  132.         {
  133.                 errtime--;
  134.                 if(!errtime)
  135.                         SCL=0;
  136.                 return false;
  137.         }
  138.         SCL=0;
  139.         return true;
  140.     }

  141. /*******************************************************************************
  142. 功能:I2CSendByte
  143. 描述:向總線發(fā)送一個(gè)字節(jié)
  144. 參數(shù):待發(fā)送字節(jié)demand,發(fā)送順序指示order
  145.                  order=1,從HI-->LO發(fā)送8bit數(shù)
  146.                  order=0,從LO-->HI發(fā)送8bit數(shù)
  147. 返回:
  148. *******************************************************************************/
  149. void I2CSendByte(uchar demand,bit order)
  150.                 {
  151.                         uchar i=8;
  152.                         if(order)
  153.                         {
  154.                                 while(i--)
  155.                                 {
  156.                                         SCL=0;
  157.                                         _nop_();
  158.                                         SDA=(bit)(demand&0x80);
  159.                                         demand<<=1;
  160.                                         I2CWait();
  161.                                         SCL=1;
  162.                                         I2CWait();
  163.                                 }
  164.                                 SCL=0;
  165.                         }
  166.                         else
  167.                         {
  168.                                 while(i--)
  169.                                 {
  170.                                         SCL=0;
  171.                                         _nop_();
  172.                                         SDA=(bit)(demand&0x01);
  173.                                         demand>>=1;
  174.                                         I2CWait();
  175.                                         SCL=1;
  176.                                         I2CWait();
  177.                                 }
  178.                                 SCL=0;
  179.                         }
  180.                 }

  181. /*******************************************************************************
  182. 功能:I2CReceiveByte
  183. 描述:從總線讀一個(gè)字節(jié)
  184. 參數(shù):
  185. 返回:
  186. *******************************************************************************/
  187. uchar I2CReceiveByte(void)
  188. {
  189.         uchar i=8;
  190.         uchar ddata=0;
  191.         SDA=1;
  192.         while(i--)
  193.         {
  194.                 ddata>>=1;//數(shù)據(jù)從低位開始讀取
  195.                 SCL=0;
  196.                 I2CWait();
  197.                 SCL=1;
  198.                 I2CWait();//從低位開始 ddata|=SDA;ddata>>=1
  199.                 if(SDA)
  200.                 {
  201.                                    ddata|=0x80;
  202.                 }
  203.         }
  204.         SCL=0;
  205.              return ddata;
  206. }


  207. /*******************************************************************************
  208. 功能:從650讀鍵值
  209. 描述:
  210. 參數(shù):
  211. 返回:uchar鍵值
  212. *******************************************************************************/
  213. uchar AipReadKey()
  214. {
  215.                   uchar key;
  216.                      I2CStart();
  217.                      I2CSendByte(0x4f,1);
  218.                  if(I2CWaitAck())
  219.                                          {
  220.                                              key=I2CReceiveByte();
  221.                                                 
  222.                                            I2CSendAck();
  223.                                          }
  224.              I2CStop();
  225.                                          return key;
  226. }

  227. /*******************************************************************************
  228. 功能:向650發(fā)送地址,和數(shù)據(jù)
  229. 描述:
  230. 參數(shù):
  231. 返回:
  232. *******************************************************************************/
  233. void Aip650_Set(uchar add,uchar dat)
  234. {
  235.   //寫顯存必須從高地址開始寫
  236.         I2CStart();
  237.         I2CSendByte(add,1);
  238.         I2CSendAck();
  239.         I2CSendByte(dat,1);
  240.         I2CSendAck();
  241.         I2CStop();

  242. }


  243. /*******************************************************************************
  244. 功能:驅(qū)動(dòng)數(shù)碼管顯示數(shù)字
  245. 描述:位碼數(shù)組中選擇對(duì)應(yīng)的位地址,在段碼數(shù)組中選擇對(duì)應(yīng)數(shù)字的段碼發(fā)送給650
  246. 參數(shù):
  247. 返回:
  248. *******************************************************************************/
  249. void Aip650_DisPlay(uchar Dig_Bit,uchar Display_num)
  250. {
  251.         Aip650_Set(Dig_Bit_Code[Dig_Bit-1],Display_Code[Display_num]);

  252.          }



  253. /*******************************************************************************
  254. 功能:驅(qū)動(dòng)數(shù)碼管顯示16進(jìn)制數(shù)的代碼
  255. 描述:
  256. 參數(shù):
  257. 返回:
  258. *******************************************************************************/
  259. void Aip650_DisPlay16(uchar Dig_Bit16,uchar Display_num16)
  260. {   
  261.      Aip650_Set(Dig_Bit_Code[Dig_Bit16-1],Display_16Code[Display_num16]);



  262.            }





  263. /*******************************************************************************
  264. 功能:650清屏
  265. 描述:
  266. 參數(shù):
  267. 返回:
  268. *******************************************************************************/
  269. void Aip650_CLR()
  270. {
  271.     uchar i;
  272.         for(i=0;i<4;i++)
  273.         {
  274.         Aip650_Set(Dig_Bit_Code[i],0x00);
  275.         }

  276. }

  277. /*******************************************************************************
  278. 功能:設(shè)置顯示亮度
  279. 描述:
  280. 參數(shù):
  281. 返回:
  282. *******************************************************************************/
  283. void Light_Level_Set(uchar level)
  284. {
  285.         Aip650_Set(0x48,Light_Level_Code[level-1]);
  286. }


  287. /*******************************************************************************
  288. 功能:delay 延時(shí)程序 11us
  289. 描述:
  290. 參數(shù):
  291. 返回:
  292. *******************************************************************************/
  293. void delay(uint t)
  294. {
  295. for(;t>0;t--);
  296. }

  297. /*******************************************************************************
  298. 功能:Ds18b20 復(fù)位函數(shù)
  299. 描述:
  300. 參數(shù):
  301. 返回:
  302. *******************************************************************************/
  303. void ow_reset(void)
  304. {
  305. uchar presence=1;
  306.         while(presence)
  307.         {while(presence)
  308.                 {
  309.                         DQ=1;
  310.                         _nop_();_nop_();//從高拉到低
  311.                         DQ=0;
  312.                         delay(50);//550us
  313.                         DQ=1;
  314.                         delay(6);//66us
  315.                         presence=DQ;//presence=0復(fù)位成功,繼續(xù)下一步
  316.                 }
  317.                 delay(45);//延時(shí)500us
  318.                 presence=~DQ;
  319.         }
  320.         DQ=1;  //拉高電平
  321. }


  322. /*******************************************************************************
  323. 功能:Ds18b20寫命令函數(shù)
  324. 描述:向總線上寫1個(gè)字節(jié)
  325. 參數(shù):
  326. 返回:
  327. *******************************************************************************/
  328. void write_byte(uchar val)
  329. {
  330. uchar i;
  331.         for(i=8;i>0;i--)
  332.         {DQ=1;_nop_();_nop_();//從高拉低
  333.         DQ=0; _nop_();_nop_();_nop_();_nop_();//5us
  334.                 DQ=val&0x01;// 最低位移出
  335.         delay(6);//66us
  336.         val=val/2;//右移一位}
  337. }
  338. DQ=1;
  339. delay(1);
  340. }


  341. /*******************************************************************************
  342. 功能:從18b20總線上讀1字節(jié)
  343. 描述:
  344. 參數(shù):
  345. 返回:value
  346. *******************************************************************************/
  347. uchar read_byte(void)
  348. {
  349. uchar i;
  350.         uchar value=0;
  351.         for(i=8;i>0;i--)
  352.         {
  353.                 DQ=1;_nop_();_nop_();
  354.                 value>>=1;
  355.                 DQ=0;_nop_();_nop_();_nop_();_nop_();//4us
  356.                 DQ=1;_nop_();_nop_();_nop_();_nop_();//4us
  357.                 if(DQ)value|=0x80;
  358.                 delay(6);
  359.         }
  360.         
  361.         DQ=1;
  362.         return(value);
  363. }



  364. /*******************************************************************************
  365. 功能:讀出溫度
  366. 描述:
  367. 參數(shù):
  368. 返回:
  369. *******************************************************************************/
  370. read_temp()
  371. {
  372. ow_reset();
  373.         delay(200);//總線復(fù)位
  374.         write_byte(0xcc);//發(fā)命令
  375.         write_byte(0x44);//發(fā)轉(zhuǎn)換命令
  376.         ow_reset();
  377.         delay(1);
  378.         write_byte(0xcc);//發(fā)命令
  379.         write_byte(0xbe);
  380.         temp_data[0]=read_byte();//讀溫度的低字節(jié)
  381.         temp_data[1]=read_byte();//讀溫度的高字節(jié)
  382.         temp=temp_data[1];
  383.         temp<<=8;
  384.         temp=temp|temp_data[0];// 兩字節(jié)合成一個(gè)整型變量
  385.         return temp;
  386. }





  387. /*******************************************************************************
  388. 功能:溫度處理
  389. 描述:二進(jìn)制數(shù)的高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一個(gè)字,這個(gè)字節(jié)轉(zhuǎn)換為十進(jìn)制后,
  390. 就是溫度的百、十、個(gè)位值,而剩下的低字節(jié)的低半字節(jié)轉(zhuǎn)化成十進(jìn)制后,就是溫度值的小數(shù)部分。
  391. 參數(shù):
  392. 返回:
  393. *******************************************************************************/
  394. void work_temp(uint tem)
  395. {
  396.         uchar n=0;
  397.         if(tem>6348)          //溫度正負(fù)判斷
  398.         {tem=65536-tem;n=1;}   //負(fù)溫度求補(bǔ)碼,標(biāo)志位置1
  399.         display[4]=tem&0x0f;
  400.         display[0]=ditab[display[4]];//存入小數(shù)部分的顯示值
  401.         display[4]=tem>>4;
  402.         display[3]=display[4]/100;//取百位數(shù)據(jù)暫存
  403.         display[1]=display[4]%100;//取后兩位數(shù)據(jù)暫存
  404.         display[2]=display[1]/10;//取十位數(shù)據(jù)暫存
  405.         display[1]=display[1]%10;
  406.         /***********符號(hào)位顯示判斷*************************/
  407.         if(!display[3])
  408.         {
  409.         display[3]=0x0c;     //最高位為0時(shí)不顯示
  410.           if(!display[2])
  411.         {
  412.         display[2]=0x0c;     //次高位為0時(shí)不顯示
  413.         }
  414.         if(n)
  415.         {display[3]=0x0b;}    //負(fù)溫度時(shí)最高位顯示“-”
  416. }
  417. }

  418. /*******************************************************************************
  419. 功能:顯示溫度
  420. 描述:處理溫度數(shù)值,發(fā)送650
  421. 參數(shù):
  422. 返回:
  423. *******************************************************************************/
  424. void xianshiwendu(uint tem1)
  425. {
  426.          work_temp(tem1);
  427.           Aip650_CLR();
  428.          Light_Level_Set(4);
  429.          Aip650_DisPlay(2,10);//顯示小數(shù)點(diǎn)
  430.          Aip650_DisPlay(3,display[2]);//十位
  431.    Aip650_DisPlay(2,display[1]);//個(gè)位
  432.    Aip650_DisPlay(1,display[0]);//小數(shù)
  433. }


  434. /*******************************************************************************
  435. 功能:顯示鍵值
  436. 描述:將按鍵的16進(jìn)制代碼送顯示
  437. 參數(shù):
  438. 返回:
  439. *******************************************************************************/
  440. void xianshijianzhi(uchar key1)
  441. {uchar a,b;
  442.         a=key1&0x0f;
  443.         Aip650_ClR();
  444.         Light_Level_Set(4);
  445.         Aip650_DisPlay16(1,a);
  446.         b=key1>>4;
  447.         b=b&0x0f;
  448.         Aip650_DisPlay(2,b);
  449. }





  450. /******************************主函數(shù)*****************************************
  451. 功能:
  452. 描述:
  453. 參數(shù):
  454. 返回:
  455. *******************************************************************************/
  456. void main()
  457. {
  458.     P3=0xff;
  459.          P1=0xff;
  460.          
  461.          
  462.           while(1)
  463.                 {Aip650_CLR();
  464.           Light_Level_Set(4);
  465.                         Aip650_DisPlay(1,8);
  466.                 Aip650_DisPlay(2,8);        
  467.                 Aip650_DisPlay(3,8);        
  468.                         //keyvalue=AipReadKey();
  469.                         P16=~P16;
  470.                         P17=~P17;
  471.                         delay(150);
  472.                                                 //wendu=read_temp();

  473.                         //xianshiwendu(wendu);
  474.                         //xianshijianzhi(keyvalue);        
  475.   //if(wendu>29)
  476.                 //P13=~P13;
  477.                         }

  478. }
復(fù)制代碼
ID:161164 發(fā)表于 2022-11-13 17:38

ID:680729 發(fā)表于 2022-11-13 08:53
抓到鬼了。同樣的代碼,手工輸入的運(yùn)行正常,復(fù)制粘貼的,編譯無錯(cuò)但刷進(jìn)去不能運(yùn)行。

#include <STC89C5xRC.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit   key=P1^3;


void Delay(uint x)
{uchar t;
        while(x--)
        {
        for(t=0;t<120;t++);}
}
/*void delay(uint t)
{
  for (;t>0;t--);
}*/
/*main()
{key=0;
while(1)
{Delay(150);
key=~key;}
}
*/

void main()
{   
                //P3=0xFF;
          key=0;
        while(1);
        {
                Delay(150);
                 
                key=~key;


                         
        };
               
         
   
         
   }
ID:680729 發(fā)表于 2022-11-11 22:05
換蕊片,換單片機(jī),查軟件,為什么本來是可以點(diǎn)亮的,為什么就不亮了。吐血啊。數(shù)碼管也是好的。沒思路了。嗨。
ID:680729 發(fā)表于 2022-11-10 21:38
現(xiàn)在數(shù)碼管干脆就不亮了,更換蕊片也不行,難道單片機(jī)壞了?換一片也不亮,搞什么鬼。跟我過不去啊。
ID:213173 發(fā)表于 2022-11-6 10:28
jzcjz 發(fā)表于 2022-11-5 23:49
鍵值摸清楚了,分別是a0,a4,ac,a8,b4,b8. 但是能顯示,switch 和顯示函數(shù)一塊兒用就能掃到鍵,單獨(dú)switch又 ...

不存在650跟不上單片機(jī)的速度問題,這是用STC8G1K08驅(qū)動(dòng)TM1650的單鍵控制時(shí)鐘設(shè)置的局部代碼:
  1. //==============TM1650驅(qū)動(dòng)部分=====================
  2. //us延時(shí)函數(shù)
  3. void Delay_us(unsigned int i)//@12MHz
  4. {
  5.         while(--i)
  6.         {
  7.                 _nop_();
  8.                 _nop_();
  9.         }
  10. }
  11. //開始信號(hào)
  12. void Start1650(void)
  13. {
  14.         CLK = 1;
  15.         DIO = 1;
  16.         Delay_us(5);
  17.         DIO = 0;
  18. }
  19. //寫一個(gè)字節(jié) 高位在前低位在后
  20. void WrByte1650(uchar oneByte)
  21. {
  22.         uchar i;
  23.         CLK = 0;
  24.         Delay_us(1);
  25.         for(i=0;i<8;i++)
  26.         {
  27.                 oneByte = oneByte<<1;
  28.                 DIO = CY;
  29.                 CLK = 0;
  30.                 Delay_us(5);
  31.                 CLK = 1;
  32.                 Delay_us(5);
  33.                 CLK = 0;
  34.         }
  35. }
  36. //應(yīng)答ACK信號(hào)
  37. void Ask1650(void)
  38. {
  39.         uchar timeout = 1;
  40.         CLK = 1;
  41.         Delay_us(5);
  42.         CLK = 0;
  43.         while((DIO)&&(timeout<=100))
  44.         {
  45.                 timeout++;
  46.         }
  47.         Delay_us(5);
  48.         CLK = 0;
  49. }
  50. //停止信號(hào)
  51. void Stop1650(void)
  52. {
  53.         CLK = 1;
  54.         DIO = 0;
  55.         Delay_us(5);
  56.         DIO = 1;
  57. }
  58. //寫顯示地址和數(shù)據(jù)
  59. void Set1650(uchar add,uchar dat)
  60. {                                          
  61.         Start1650();     //開始
  62.         WrByte1650(add); //寫地址
  63.         Ask1650();       //應(yīng)答
  64.         WrByte1650(dat); //寫數(shù)據(jù)
  65.         Ask1650();       //應(yīng)答
  66.         Stop1650();      //停止
  67. }
  68. //顯示命令格式:空位  亮度等級(jí)位   7/8段位  空位  開關(guān)位
  69. //顯示命令格式: 0    1   1   1     1/0     0 0    1/0

  70. //初始化1650
  71. void Init1650()
  72. {
  73.         Set1650(0x48,0x31); //3級(jí)亮度 開顯示
  74. }
  75. //掃描1650按鍵
  76. uchar Scan1650_Key()
  77. {  
  78.         uchar i;
  79.         uchar rekey;
  80.         Start1650();     //開始
  81.         WrByte1650(0x49);//讀按鍵命令 0100 1111
  82.         Ask1650();                 //應(yīng)答
  83.         for(i=0;i<8;i++)
  84.         {
  85.                 CLK = 1;
  86.                 rekey<<=1;
  87.                 if(DIO)rekey++;
  88.                 Delay_us(5);
  89.                 CLK = 0;
  90.         }
  91.         Ask1650();                  //應(yīng)答
  92.         Stop1650();       //停止
  93.         return rekey;     //返回鍵值
  94. }
  95. //按鍵服務(wù)函數(shù)
  96. void key_service()
  97. {
  98.         static uint time=0;  //計(jì)數(shù)變量
  99.         temp=Scan1650_Key(); //讀取鍵值
  100.         if(temp==0x4E)       //按鍵按下
  101.         {
  102.                 time++;
  103.                 if(time>=key_L)  //長按
  104.                 {
  105.                         switch(KeySec)
  106.                         {
  107.                                 case 1: TIME[2]++;if(TIME[2]>23)TIME[2]=0; break;
  108.                                 case 2: TIME[1]++;if(TIME[1]>59)TIME[1]=0; break;
  109.                         }
  110.                         time=key_I;  //連+間隔
  111.                         num=500;     //自復(fù)位變量賦值(5秒)
  112.                 }
  113.         }
  114.         else                                //松手
  115.         {
  116.                 if(time>key_S && time<key_I)//短按
  117.                 {
  118.                         num=500;    //自復(fù)位變量賦值(5秒)
  119.                         KeySec++;
  120.                         if(KeySec>3)
  121.                         {
  122. //                                KeySec=0;
  123.                                 num=1;
  124.                         }
  125.                 }
  126.                 time=0;
  127.         }
  128. }
復(fù)制代碼
ID:680729 發(fā)表于 2022-11-5 23:49
鍵值摸清楚了,分別是a0,a4,ac,a8,b4,b8. 但是能顯示,switch 和顯示函數(shù)一塊兒用就能掃到鍵,單獨(dú)switch又不行了。可能真的是650跟不上單片機(jī)的速度。怎么解決呢?
ID:213173 發(fā)表于 2022-11-5 22:06
jzcjz 發(fā)表于 2022-11-5 21:46
按鍵有反應(yīng)了。顯示值不太對(duì)。
uchar  Display_16code[16]={0xf5,0x05,0x73,0x57,0x87,0xd6,0xf6,0x45,0xf ...

曾經(jīng)使用TM1650,也不清楚是新舊版本,按鍵無反應(yīng)。后用數(shù)碼管顯示鍵值觀察,與手冊(cè)不一致。但修改按鍵服務(wù)函數(shù)與之對(duì)應(yīng)后按鍵功能正常。
ID:680729 發(fā)表于 2022-11-5 21:46
按鍵有反應(yīng)了。顯示值不太對(duì)。
uchar  Display_16code[16]={0xf5,0x05,0x73,0x57,0x87,0xd6,0xf6,0x45,0xf7,0xd7,0xbf,0xbe,0xf8,0x3f,0xfa,0xba};
//0,    1,   2 ,  3,  4,    5,   6,   7,   8,    9,  a,  b,c,d,e,f
/*******************************************************
功能:讀鍵值
描述:
參數(shù):
返回:鍵值
********************************************************/
///*
unsigned char AipReadKey()
{
        unsigned char key;
  //AiP650_Set(0x4f,0x00);

   I2CStart();       
   I2CSendByte(0x4f,1);
        // I2CWaitAck() ;
        //if(I2CWaitAck())
        //I2CSendByte(0x00,1);
        if(I2CWaitAck())
        {key=I2CReceiveByte();
                       
        I2CSendAck();
        //if(I2CWaitAck())       
  //{ I2CSendByte(0x00,1);
       
                                //}
        }
        I2CStop();
return key;}//*/
/******************顯示鍵值*************************************
功能:將鍵值發(fā)送650顯示


****************************************************************/
void xianshijianzhi(uchar key1)
{uchar a,b;
         a=key1&0x0f;
    AiP650_CLR();   
                  Light_Level_Set(4);
         
         AiP650_DisPlay(1,a);
        b=key1>>4;
         b=b&0x0f;
          
          Light_Level_Set(4);
         
         AiP650_DisPlay(2,b);
         
}
ID:680729 發(fā)表于 2022-11-5 20:56
uchar  Display_16code[16]={0xf5,0x05,0x73,0x57,0x87,0xd6,0xf6,0x45,0xf7,0xd7,0xbf,0xbe,0xf8,0x3f,0xfa,0xba};
/******************顯示鍵值*************************************
功能:將鍵值發(fā)送650顯示


****************************************************************/
void xianshijianzhi(uchar key1)
{uchar a,b;
         a=key1&0x0f;
    AiP650_CLR();   
                  Light_Level_Set(4);
         
         AiP650_DisPlay(2,Display_16code[a-1]);
        b=key1>>4;
         b=b&0x0f;
          
          Light_Level_Set(4);
         
         AiP650_DisPlay(1,Display_16code[b-1]);
         
}


鍵值顯示22,按鍵無變化。不懂意思,難道讀不出鍵值?
ID:680729 發(fā)表于 2022-11-5 09:14
看了蕊片,是FDZY650,它與aip650不同?沒有資料。引腳和aip650是一樣的,就不知按鍵代碼是不是一樣。
ID:680729 發(fā)表于 2022-11-4 15:17
一時(shí)搞不定,試了好多方法,心累啊。水平有限,現(xiàn)丑現(xiàn)丑。
ID:220661 發(fā)表于 2022-11-4 07:43
另外,現(xiàn)在的51單片機(jī)速度有點(diǎn)快,IIC速度太快了擴(kuò)展芯片跟不上。表現(xiàn)為顯示正常按鍵讀不到,別問我怎么知道的。
ID:213173 發(fā)表于 2022-11-4 06:27
jzcjz 發(fā)表于 2022-11-3 22:07
按鍵沒反應(yīng),鍵值都試了一遍。
keyvalue=AipReadKey();
     switch(keyvalue)

要按照廠家推薦的硬件電路,DIG端串接2K電阻,否則無法正常讀取鍵值。你的數(shù)碼管已經(jīng)能正常顯示數(shù)字,可以用來顯示鍵值,以判斷讀鍵是否正確。TM1650分新舊版本,鍵碼不同,AIP650是不是也有新舊版本不得而知。
ID:680729 發(fā)表于 2022-11-3 22:07
按鍵沒反應(yīng),鍵值都試了一遍。
keyvalue=AipReadKey();
     switch(keyvalue)
                         {case 0x45:
                                 Light_Level_Set(4);
                                 AiP650_DisPlay(2,1);
                  break;
                                          case  0x55:
                                                 Light_Level_Set(4);
                                         AiP650_DisPlay(2,2);
                 break;
                                         case 0x5d:                           
                                                Light_Level_Set(4);
                                         AiP650_DisPlay(2,3);
                break;
                                          case 0x65:  
                                                Light_Level_Set(4);
                                         AiP650_DisPlay(2,4);
                  break;
                                          case 0x6d:
                                                 Light_Level_Set(4);
                                         AiP650_DisPlay(2,5);
                                         break;
                   case 0x75:
                 Light_Level_Set(4);
                         AiP650_DisPlay(2,6);
                                
                                                           
                         break;
                 
                       
                         
                         
                         ; }                         
                }
ID:213173 發(fā)表于 2022-11-3 21:12
jzcjz 發(fā)表于 2022-11-3 16:28
不是讀按鍵,是按鍵響應(yīng)的。它那個(gè)按鍵的碼表好像不對(duì)啊。


最多28個(gè)鍵
void key_service()
{

        num=AipReadKey();
        switch(num)
        {
                case 0x44: /*任務(wù) 1*/ break;
                case 0x4c: /*任務(wù) 2*/ break;
                case 0x54: /*任務(wù) 3*/ break;
                case 0x5c: /*任務(wù) 4*/ break;
                ......     /*任務(wù) n*/ break;
                case 0x77: /*任務(wù)28*/ break;
        }

}
ID:883242 發(fā)表于 2022-11-3 19:18
按鍵和溫度是完全不相關(guān)的兩件事,不存在“aip650按鍵程序的例子”,樓主還是先靜下心來,想想你需要你幾個(gè)按鍵,每個(gè)按鍵是干什么用的。你的項(xiàng)目需要哪些功能,這些按鍵是否能夠全部滿足。
ID:680729 發(fā)表于 2022-11-3 16:28
不是讀按鍵,是按鍵響應(yīng)的。它那個(gè)按鍵的碼表好像不對(duì)啊。
ID:161164 發(fā)表于 2022-11-3 12:01
jzcjz 發(fā)表于 2022-11-3 11:16
有aip650按鍵程序的例子嗎?

這樣改看看



ID:680729 發(fā)表于 2022-11-3 11:16
有aip650按鍵程序的例子嗎?
ID:123289 發(fā)表于 2022-11-3 09:15
1、先編個(gè)【按鍵】程序,識(shí)別到XX鍵被按下了。
2、再編個(gè)【響應(yīng)】程序,即按鍵后,你想干的活。
3、列個(gè)EXCEL表,列出XX鍵、或組合鍵分別要干的活。
4、運(yùn)行【按鍵】程序,識(shí)別按鍵,再分別調(diào)用列表中的【響應(yīng)】。

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

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

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