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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)TM1638按健程序問題請教

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:64817 發(fā)表于 2024-6-4 05:35 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
請教大家 有用過 TM1638按健的嗎?這是自帶的測試程序。。為什么只有第一個(gè)按鍵有用。

單片機(jī)源程序如下:
  1. #ifndef        _TM1638_H
  2. #define        _TM1638_H

  3. #include        <REGX51.H>

  4. #define        DATA_COMMAND        0X40
  5. #define        DISP_COMMAND        0x80
  6. #define        ADDR_COMMAND        0XC0

  7. //TM1638模塊引腳定義
  8. sbit        DIO=P1^0;
  9. sbit        CLK=P1^1;
  10. sbit        STB=P1^2;

  11. //共陰數(shù)碼管顯示代碼
  12. unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  13.                            0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};


  14. void TM1638_Write(unsigned char        DATA)                        //寫數(shù)據(jù)函數(shù)
  15. {
  16.         unsigned char i;
  17.         for(i=0;i<8;i++)
  18.         {
  19.                 CLK=0;
  20.                 if(DATA&0X01)
  21.                         DIO=1;
  22.                 else
  23.                         DIO=0;
  24.                 DATA>>=1;
  25.                 CLK=1;
  26.         }
  27. }
  28. unsigned char TM1638_Read(void)                                        //讀數(shù)據(jù)函數(shù)
  29. {
  30.         unsigned char i;
  31.         unsigned char temp=0;
  32.         DIO=1;        //設(shè)置為輸入
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 temp>>=1;
  36.                 CLK=0;
  37.                 if(DIO)
  38.                         temp|=0x80;
  39.                 CLK=1;
  40.         }
  41.         return temp;
  42. }
  43. void Write_COM(unsigned char cmd)                //發(fā)送命令字
  44. {
  45.         STB=0;
  46.         TM1638_Write(cmd);
  47.         STB=1;
  48. }
  49. unsigned char Read_key(void)
  50. {
  51.         unsigned char c[4],i,key_value=0;
  52.         STB=0;
  53.         TM1638_Write(0x42);                           //讀鍵掃數(shù)據(jù) 命令
  54.         for(i=0;i<4;i++)               
  55.                 c[i]=TM1638_Read();
  56.         STB=1;                                                   //4個(gè)字節(jié)數(shù)據(jù)合成一個(gè)字節(jié)
  57.         for(i=0;i<4;i++)
  58.                 key_value|=c[i]<<i;
  59.         for(i=0;i<8;i++)
  60.                 if((0x01<<i)==key_value)
  61.                         break;
  62.         return i;
  63. }
  64. void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址寫入數(shù)據(jù)
  65. {
  66.         Write_COM(0x44);
  67.         STB=0;
  68.         TM1638_Write(0xc0|add);
  69.         TM1638_Write(DATA);
  70.         STB=1;
  71. }
  72. /*
  73. void Write_oneLED(unsigned char num,unsigned char flag)        //單獨(dú)控制一個(gè)LED函數(shù),num為需要控制的led序號,flag為0時(shí)熄滅,不為0時(shí)點(diǎn)亮
  74. {
  75.         if(flag)
  76.                 Write_DATA(2*num+1,1);
  77.         else
  78.                 Write_DATA(2*num+1,0);
  79. }          */
  80. void Write_allLED(unsigned char LED_flag)                                        //控制全部LED函數(shù),LED_flag表示各個(gè)LED狀態(tài)
  81. {
  82.         unsigned char i;
  83.         for(i=0;i<8;i++)
  84.                 {
  85.                         if(LED_flag&(1<<i))
  86.                                 //Write_DATA(2*i+1,3);
  87.                                 Write_DATA(2*i+1,1);
  88.                         else
  89.                                 Write_DATA(2*i+1,0);
  90.                 }
  91. }

  92. //TM1638初始化函數(shù)
  93. void init_TM1638(void)
  94. {
  95.         unsigned char i;
  96.         Write_COM(0x8b);       //亮度 (0x88-0x8f)8級亮度可調(diào)
  97.         Write_COM(0x40);       //采用地址自動加1
  98.         STB=0;                           //
  99.         TM1638_Write(0xc0);    //設(shè)置起始地址

  100.         for(i=0;i<16;i++)           //傳送16個(gè)字節(jié)的數(shù)據(jù)
  101.                 TM1638_Write(0x00);
  102.         STB=1;
  103. }
  104. #endif
復(fù)制代碼
  1. #include        <REGX51.H>
  2. #include        <tm1638.h>

  3. unsigned char num[8];                //各個(gè)數(shù)碼管顯示的值

  4. int main(void)
  5. {
  6.         unsigned char i;
  7.         init_TM1638();                                   //初始化TM1638
  8.         for(i=0;i<8;i++)
  9.         Write_DATA(i<<1,tab[0]);                       //初始化寄存器
  10.         
  11.         while(1)
  12.         {
  13.                 i=Read_key();                          //讀按鍵值
  14.                 if(i<8)
  15.                 {
  16.                         num[i]++;
  17.                         while(Read_key()==i);                       //等待按鍵釋放
  18.                         if(num[i]>15)
  19.                         num[i]=0;
  20.                         Write_DATA(i*2,tab[num[i]]);
  21.                         Write_allLED(1<<i);
  22.                 }
  23.         }
  24. }

復(fù)制代碼



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

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2024-6-4 17:45 | 只看該作者
請?zhí)峁┙泳圖
回復(fù)

使用道具 舉報(bào)

板凳
ID:1109793 發(fā)表于 2024-6-4 18:54 | 只看該作者
這不是就只能有8個(gè)按鍵嗎?我怎么記得可以支撐很多按鍵的啊。為啥要合成一個(gè)字節(jié)?
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2024-6-4 19:40 | 只看該作者
你確定這是 自帶的測試程序?

        for(i=0;i<4;i++)
                key_value|=c[i]<<i;
        for(i=0;i<8;i++)
                if((0x01<<i)==key_value)
                        break;
        return i;

這兩段 確定不是你自己的 “發(fā)明” ? 我不認(rèn)為“自帶的測試程序” 能有這樣奇葩的操作……
回復(fù)

使用道具 舉報(bào)

5#
ID:64817 發(fā)表于 2024-6-5 03:48 | 只看該作者
xiaobendan001 發(fā)表于 2024-6-4 18:54
這不是就只能有8個(gè)按鍵嗎?我怎么記得可以支撐很多按鍵的啊。為啥要合成一個(gè)字節(jié)?

掃描鍵盤必須是1-4個(gè)字節(jié)。他是把每個(gè)字節(jié)里有用的按鍵狀態(tài)合為 1個(gè)字節(jié)了。
回復(fù)

使用道具 舉報(bào)

6#
ID:64817 發(fā)表于 2024-6-5 03:48 | 只看該作者
188610329 發(fā)表于 2024-6-4 19:40
你確定這是 自帶的測試程序?

        for(i=0;i


這不是就只能有8個(gè)按鍵嗎?我怎么記得可以支撐很多按鍵的啊。為啥要合成一個(gè)字節(jié)?
回復(fù)

使用道具 舉報(bào)

7#
ID:64817 發(fā)表于 2024-6-5 03:51 | 只看該作者
188610329 發(fā)表于 2024-6-4 19:40
你確定這是 自帶的測試程序?

        for(i=0;i

不是我發(fā)明的,他是把4 個(gè)字節(jié)的按鍵值換算為1.2.3.4.5.6.7.8.。。這里沒 有錯(cuò)人用C程序驗(yàn)算過了
回復(fù)

使用道具 舉報(bào)

8#
ID:64817 發(fā)表于 2024-6-5 03:56 | 只看該作者
回復(fù)

使用道具 舉報(bào)

9#
ID:1109793 發(fā)表于 2024-6-5 07:34 | 只看該作者
abeimao 發(fā)表于 2024-6-5 03:51
不是我發(fā)明的,他是把4 個(gè)字節(jié)的按鍵值換算為1.2.3.4.5.6.7.8.。。這里沒 有錯(cuò)人用C程序驗(yàn)算過了

那你要搞清楚你的按鍵到底應(yīng)該是哪個(gè)對應(yīng)數(shù)字
回復(fù)

使用道具 舉報(bào)

10#
ID:1109793 發(fā)表于 2024-6-5 08:48 | 只看該作者
abeimao 發(fā)表于 2024-6-5 03:51
不是我發(fā)明的,他是把4 個(gè)字節(jié)的按鍵值換算為1.2.3.4.5.6.7.8.。。這里沒 有錯(cuò)人用C程序驗(yàn)算過了

我是看不太懂這個(gè)合成 的意義。
大概他是只接了8個(gè)開關(guān)并且接在了K3上面,把四個(gè)字節(jié)的合成以后只保留了K3 的部分,然后用一個(gè)循環(huán)取到了這個(gè)字節(jié)的第某個(gè)位,返回的I的意思就是比如第5位是1,那么久返回5,就是代表了K3和KS5之間的按鍵是接通的,好像不對,鍵值i的話應(yīng)該是0-7,不建議這樣操作,對于一個(gè)有效的值,不建議用0來表示,因?yàn)榧拇嫫髟诔跏蓟瘯r(shí)就是0.
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产一区二区三区香蕉 | 91在线网站 | 国产视频三级 | 久久精品视频在线播放 | 日本精品一区二区 | 男女免费在线观看视频 | 日韩精品一区在线观看 | 狠狠综合网 | 本地毛片 | 中文字幕一区二区三区四区不卡 | 亚洲瑟瑟 | 欧美精品一区二区免费 | 麻豆久久久9性大片 | 一本色道精品久久一区二区三区 | 亚洲三级在线 | 亚洲人在线 | 国产色片在线 | 中文欧美日韩 | 国产a视频| 欧美精品福利视频 | 欧美mv日韩mv国产网站91进入 | 久久91精品国产一区二区三区 | 日韩伦理一区二区三区 | 国产9 9在线 | 中文 | 久热精品在线播放 | 91视频播放 | 久久精品一区 | 国产精品久久久久永久免费观看 | 欧美精品一区二区三区蜜桃视频 | 久艹av | 欧美成人一区二区 | 一区二区三区国产 | 九九99久久 | 国产午夜av片| 人人叉 | 97视频久久 | 欧美久久久久 | 美女天天操 | 天天在线操 | 一区二区三区视频播放 | av在线免费网站 |