找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10170|回复: 6
收起左侧

TM1638数码管单片机驱动及按键扫描程序

  [复制链接]
ID:506093 发表于 2019-4-9 10:09 | 显示全部楼层 |阅读模式
这个是我根据网上相关例程修改好的有关TM1638驱动程序,程序可以实现数码管驱动,3*3个按键的扫描以及16个LED的显示控制!
实测程序可以在STC15F2K60S2芯片上正常工作!


显示1.jpg

显示4.jpg

单片机源程序如下:
  1. /*********************************************************************

  2. ********************************************************************/

  3. #include <TM1638_drive.h>

  4. //共阴数码管段码
  5. unsigned char code Num_tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  6.                            0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

  7. //TM1638低8段位码  【SEG1-SEG8】
  8. unsigned char code WeiL_tab[]={0xce,0xcc,0xca,0xc8,0xc6,0xc4,0xc2,0xc0};

  9. //TM1638高2段位码  【SEG9-SEG10】
  10. unsigned char code WeiH_tab[]={0xcf,0xcd,0xcb,0xc9,0xc7,0xc5,0xc3,0xc1};

  11. void TM1638_W_DATA(unsigned char        DATA)                        //写数据函数
  12. {
  13.         unsigned char i;
  14.         for(i=0;i<8;i++)
  15.         {
  16.                 CLK=0;
  17.                 if(DATA&0X01)
  18.                         DIO=1;
  19.                 else
  20.                         DIO=0;
  21.                 DATA>>=1;
  22.                 CLK=1;
  23.         }
  24. }

  25. void TM1638_W_CMD(unsigned char cmd)                //写命令函数
  26. {
  27.         STB=0;
  28.         TM1638_W_DATA(cmd);
  29.         STB=1;
  30. }

  31. void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址写入数据
  32. {
  33.         TM1638_W_CMD(0x44);
  34.         STB=0;
  35.         TM1638_W_DATA(add);
  36.         TM1638_W_DATA(DATA);
  37.         STB=1;
  38. }

  39. unsigned char TM1638_Read(void)                                        //读数据函数
  40. {
  41.         unsigned char i;
  42.         unsigned char temp=0;
  43.         DIO=1;        //设置为输入
  44.         for(i=0;i<8;i++)
  45.         {
  46.                 temp>>=1;
  47.                
  48.                 CLK=0;
  49.                 CLK=1;                                                           //CLK上升沿读数据才有效

  50.                 if(DIO)
  51.                         temp|=0x80;
  52.         }
  53.         return temp;
  54. }

  55. unsigned char Read_Onekey(void)                   //读一下按键值,不支持组合键
  56. {
  57.         unsigned char key_val[4],i,key=0;
  58.         
  59.         STB=0;
  60.         
  61.         TM1638_W_DATA(0x42);                           //读键扫数据命令  注意:这里要先读完4字节键值才能将STB置1,否则读键值无效
  62.         
  63.         for(i=0;i<4;i++)               
  64.                 key_val[i]=TM1638_Read();
  65.         
  66.         STB=1;                                                   //4个字节数据合成一个字节


  67.         if(key_val[0]!=0)        //按键在KS1或KS2
  68.         {
  69.                 switch(key_val[0])
  70.                 {
  71.                         case 1:
  72.                                 key=K3S1;
  73.                         break;
  74.                         
  75.                         case 2:
  76.                                 key=K2S1;
  77.                         break;
  78.                         
  79.                         case 4:
  80.                                 key=K1S1;
  81.                         break;

  82.                         case 16:
  83.                                 key=K3S2;
  84.                         break;
  85.                         
  86.                         case 32:
  87.                                 key=K2S2;
  88.                         break;
  89.                         
  90.                         case 64:
  91.                                 key=K1S2;
  92.                         break;
  93.                 }
  94.         }
  95.         else if(key_val[1]!=0)        //按键在KS3或KS4
  96.         {
  97.                 switch(key_val[1])
  98.                 {
  99.                         case 1:
  100.                                 key=K3S3;
  101.                         break;
  102.                         
  103.                         case 2:
  104.                                 key=K2S3;
  105.                         break;
  106.                         
  107.                         case 4:
  108.                                 key=K1S3;
  109.                         break;

  110.                         case 16:
  111.                                 key=K3S4;
  112.                         break;
  113.                         
  114.                         case 32:
  115.                                 key=K2S4;
  116.                         break;
  117.                         
  118.                         case 64:
  119.                                 key=K1S4;
  120.                         break;
  121.                 }
  122.         }
  123.         else if(key_val[2]!=0)        //按键在KS5或KS6
  124.         {
  125.                 switch(key_val[2])
  126.                 {
  127.                         case 1:
  128.                                 key=K3S5;
  129.                         break;
  130.                         
  131.                         case 2:
  132.                                 key=K2S5;
  133.                         break;
  134.                         
  135.                         case 4:
  136.                                 key=K1S5;
  137.                         break;

  138.                         case 16:
  139.                                 key=K3S6;
  140.                         break;
  141.                         
  142.                         case 32:
  143.                                 key=K2S6;
  144.                         break;
  145.                         
  146.                         case 64:
  147.                                 key=K1S6;
  148.                         break;
  149.                 }
  150.         }
  151.         else if(key_val[3]!=0)        //按键在KS7或KS8
  152.         {
  153.                 switch(key_val[3])
  154.                 {
  155.                         case 1:
  156.                                 key=K3S7;
  157.                         break;
  158.                         
  159.                         case 2:
  160.                                 key=K2S7;
  161.                         break;
  162.                         
  163.                         case 4:
  164.                                 key=K1S7;
  165.                         break;

  166.                         case 16:
  167.                                 key=K3S8;
  168.                         break;
  169.                         
  170.                         case 32:
  171.                                 key=K2S8;
  172.                         break;
  173.                         
  174.                         case 64:
  175.                                 key=K1S8;
  176.                         break;
  177.                 }
  178.         }
  179.         
  180.         return key;

  181. }

  182. void WriteSEG9_LED(unsigned char sta)                                        //控制全部LED函数,LED_flag表示各个LED状态
  183. {
  184.         unsigned char i;
  185.         for(i=0;i<8;i++)
  186.         {
  187.                 if(sta&(1<<i))
  188.                         Write_DATA(WeiH_tab[i],1);
  189.                 else
  190.                         Write_DATA(WeiH_tab[i],0);
  191.         }
  192. }

  193. void WriteSEG10_LED(unsigned char sta)                                        //控制全部LED函数,LED_flag表示各个LED状态
  194. {
  195.         unsigned char i;
  196.         for(i=0;i<8;i++)
  197.         {
  198.                 if(sta&(1<<i))
  199.                         Write_DATA(WeiH_tab[i],2);
  200.                 else
  201.                         Write_DATA(WeiH_tab[i],0);
  202.         }
  203. }

  204. void Write_LED(unsigned char sta9,unsigned char sta10)                                        //控制全部LED函数,LED_flag表示各个LED状态
  205. {
  206.         // 0b 1 0 0 0 0 0 0 0
  207.         // 0b 0 1 1 0 0 0 0 0

  208.         Write_DATA(WeiH_tab[7],((sta10&0x80)>>6)|((sta9&0x80)>>7));
  209.         Write_DATA(WeiH_tab[6],((sta10&0x40)>>5)|((sta9&0x40)>>6));
  210.         Write_DATA(WeiH_tab[5],((sta10&0x20)>>4)|((sta9&0x20)>>5));
  211.         Write_DATA(WeiH_tab[4],((sta10&0x10)>>3)|((sta9&0x10)>>4));
  212.         Write_DATA(WeiH_tab[3],((sta10&0x08)>>2)|((sta9&0x08)>>3));
  213.         Write_DATA(WeiH_tab[2],((sta10&0x04)>>1)|((sta9&0x04)>>2));
  214.         Write_DATA(WeiH_tab[1],(sta10&0x02)|((sta9&0x02)>>1));
  215.         Write_DATA(WeiH_tab[0],((sta10&0x01)<<1)|(sta9&0x01));

  216. }

  217. //TM1638初始化函数
  218. void init_TM1638(void)
  219. {
  220.         unsigned char i;
  221.         TM1638_W_CMD(0x89);       //亮度 (0x88-0x8f)8级亮度可调
  222.         TM1638_W_CMD(0x40);       //采用地址自动加1
  223.         STB=0;                           //
  224.         TM1638_W_DATA(0xc0);    //设置起始地址

  225.         for(i=0;i<16;i++)           //传送16个字节的数据
  226.                 TM1638_W_DATA(0x00);
  227.         STB=1;
  228. }
复制代码
0.png
所有资料51hei提供下载:
TM1638驱动.rar (38.59 KB, 下载次数: 260)
回复

使用道具 举报

ID:198957 发表于 2019-5-29 16:31 | 显示全部楼层
数码管怎么显示小数点呢?
回复

使用道具 举报

ID:807693 发表于 2020-7-24 17:54 | 显示全部楼层
正好要用1638 参考下
回复

使用道具 举报

ID:5501 发表于 2021-4-14 23:43 | 显示全部楼层
本帖最后由 shgdd520com 于 2021-4-20 16:29 编辑

无标题.jpg 请教下楼主 更改的原理图是怎么连接的  我的只接了5个按键 在K1位置
回复

使用道具 举报

ID:5501 发表于 2021-4-20 16:34 | 显示全部楼层
无标题.jpg   请教下楼主,数码管 按键的硬件怎么连接的 我接了5个按键 直接接到K1 的 请教程序怎么修改,网上的程序和我的硬件连接不一样 谢谢
回复

使用道具 举报

ID:506093 发表于 2021-5-24 16:25 | 显示全部楼层
你好,硬件连接按数据手册上面的就可以了
按键的键值是结合下面两个图片来得到的
51hei截图20210524162250.png
51hei截图20210524162303.png
回复

使用道具 举报

ID:506093 发表于 2021-5-24 16:28 | 显示全部楼层
shgdd520com 发表于 2021-4-20 16:34
请教下楼主,数码管 按键的硬件怎么连接的 我接了5个按键 直接接到K1 的 请教程序怎么修改,网上的程序和 ...


你好,硬件连接按数据手册上面的就可以了
按键的键值是结合下面两个图片来得到的
51hei截图20210524162250.png
51hei截图20210524162303.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表