找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 860|回复: 16
收起左侧

STC8G1K单片机芯片和TM1640怎么显示123?

[复制链接]
ID:991042 发表于 2023-11-7 18:04 | 显示全部楼层 |阅读模式
#include <stc8.h>
sbit CLK = P1^0;  // 连接到TM1640的CLK引脚
sbit DIO = P1^1;   // 定义DIO引脚,连接到TM1640的DIO引脚

void delay_us(unsigned int us)
{
    while(us--);  // 延时函数,延时us微秒
}

void TM1640_Start(void)
{
    CLK = 1;  // CLK引脚置高电平
    DIO = 1;  // DIO引脚置高电平
    delay_us(2);  // 延时2微秒
    DIO = 0;  // DIO引脚置低电平
}

void TM1640_Stop(void)
{
    CLK = 0;  // CLK引脚置低电平
    delay_us(2);  // 延时2微秒
    DIO = 0;  // DIO引脚置低电平
    delay_us(2);  // 延时2微秒
    CLK = 1;  // CLK引脚置高电平
    delay_us(2);  // 延时2微秒
    DIO = 1;  // DIO引脚置高电平
}

void TM1640_WriteByte(unsigned char data1)
{
    unsigned char i;
    for(i=0; i<8; i++)  // 循环8次,写入8位数据
    {
        CLK = 0;  // CLK引脚置低电平
        DIO = data1 & 0x01;  // 将data1的最低位写入DIO引脚
        data1 >>= 1;  // data1右移1位,准备写入下一位
        delay_us(2);  // 延时2微秒
        CLK = 1;  // CLK引脚置高电平
        delay_us(2);  // 延时2微秒
    }
    CLK = 0;  // CLK引脚置低电平
    DIO = 1;  // DIO引脚置高电平
    delay_us(2);  // 延时2微秒
    CLK = 1;  // CLK引脚置高电平
    delay_us(2);  // 延时2微秒
    CLK = 0;  // CLK引脚置低电平
}

void TM1640_Display(unsigned char data2)
{
    TM1640_Start();  // 发送起始信号
    TM1640_WriteByte(0x44);  // 发送命令,设置TM1640为固定地址模式
    TM1640_Stop();  // 发送结束信号
    TM1640_Start();  // 发送起始信号
    TM1640_WriteByte(0x8C);  // 发送命令,设置TM1640的显示亮度
    TM1640_WriteByte(data2);  // 发送数据,显示指定的数字
    TM1640_Stop();  // 发送结束信号
}

void main()
{
    P1M0 = 0xff;  // 将P1设置为推挽输出模式
    P1M1 = 0x00;
    while(1)
                {
                        TM1640_Display(0x03);  // 显示数字6        
                }
}
我该怎么写,才能显示123?不知道怎么控制数码管哪个亮。
IMG_2441.JPG

STC8G系列单片机介绍.pdf

867.77 KB, 下载次数: 3

TM1640B.pdf

669.68 KB, 下载次数: 4

回复

使用道具 举报

ID:69038 发表于 2023-11-7 21:05 | 显示全部楼层
你没有做段码表啊?
回复

使用道具 举报

ID:748788 发表于 2023-11-7 21:57 | 显示全部楼层
回复

使用道具 举报

ID:991042 发表于 2023-11-8 09:49 | 显示全部楼层
zhuls 发表于 2023-11-7 21:05
你没有做段码表啊?

想做的,但是写常规的共阴段码显示不出数字的。
回复

使用道具 举报

ID:272612 发表于 2023-11-8 10:00 | 显示全部楼层
你这个问题,首先需要搞清楚如何像你的代码写的一样显示一个单纯的一个数字,然后再将123,拆解为1,2,3然后像下面一样显示出来。
TM1640_Display(0x01);  // 显示数字1  
TM1640_Display(0x02);  // 显示数字2  
TM1640_Display(0x03);  // 显示数字3  

TM1640这个芯片好像用的还是蛮多的,应该很容易找到驱动数码管的程序的
回复

使用道具 举报

ID:69038 发表于 2023-11-8 10:02 | 显示全部楼层
jade-lluo 发表于 2023-11-8 09:49
想做的,但是写常规的共阴段码显示不出数字的。

TM系列的LED驱动IC有个特性:不管共阴共阳数码管,LED的正极一定要接SEG端,而负极一定要接GRID端否则会出错不亮。
所以你这个硬件电路连接关系对得上了吗?
回复

使用道具 举报

ID:69038 发表于 2023-11-8 10:17 | 显示全部楼层
jade-lluo 发表于 2023-11-8 09:49
想做的,但是写常规的共阴段码显示不出数字的。

又看了一下你的代码和图片。发现你离成功仅一行代码:你少发了个显示地址!
你发数据,能显示出来,说明电路什么的都正常了,
你改写一下TM1640_Display(unsigned char data2这个函数,把地址带入:

void TM1640_Display(unsigned char addr,unsigned char data2)
{
    TM1640_Start();  // 发送起始信号
    TM1640_WriteByte(0x44);  // 发送命令,设置TM1640为固定地址模式
    TM1640_Stop();  // 发送结束信号
    TM1640_Start();  // 发送起始信号
    TM1640_WriteByte(0x8C);  // 发送命令,设置TM1640的显示亮度
    TM1640_WriteByte(0xc0+addr);  // 发送显示地址,指定位
    TM1640_WriteByte(data2);  // 发送数据,显示指定的数字
    TM1640_Stop();  // 发送结束信号
}
调用时:
TM1640_Display(0,0x1);//第一个数码管显示“a”段
TM1640_Display(2,0xEF);//第三个数码管显示“8”字形
==
回复

使用道具 举报

ID:69038 发表于 2023-11-8 10:20 | 显示全部楼层
jade-lluo 发表于 2023-11-8 09:49
想做的,但是写常规的共阴段码显示不出数字的。

参考板凳的贴子。很详细很好的!
回复

使用道具 举报

ID:991042 发表于 2023-11-8 18:07 | 显示全部楼层
zhuls 发表于 2023-11-8 10:17
又看了一下你的代码和图片。发现你离成功仅一行代码:你少发了个显示地址!
你发数据,能显示出来,说明 ...

改了你说的这段代码,可是没有用。还是3个LED都亮
回复

使用道具 举报

ID:69038 发表于 2023-11-8 20:11 | 显示全部楼层
jade-lluo 发表于 2023-11-8 18:07
改了你说的这段代码,可是没有用。还是3个LED都亮

参考板凳的贴子。
认真读一下,并按原贴的代码,改一下IO运行一下
回复

使用道具 举报

ID:991042 发表于 2023-11-15 09:23 | 显示全部楼层
zhuls 发表于 2023-11-8 20:11
参考板凳的贴子。
认真读一下,并按原贴的代码,改一下IO运行一下

我认真看了又看,还是不行。能说细一点吗?大佬
回复

使用道具 举报

ID:161164 发表于 2023-11-15 11:09 | 显示全部楼层
2023-11-15_110018.png

void TM1640_Display(unsigned char Digi,unsigned char Seg)
{
    TM1640_Start();  // 发送起始信号
    TM1640_WriteByte(0x44);  // 发送设置数据,设置TM1640为固定地址模式
    TM1640_Stop();  // 发送结束信号
    TM1640_Start();  // 发送起始信号
    TM1640_WriteByte(0xC0 + Digi);  // 发送设置地址,显示指定的位置
    TM1640_WriteByte(Seg);  // 发送显示数据,显示指定的数字取模
    TM1640_Stop();  // 发送结束信号
    TM1640_Start();  // 发送起始信号
    TM1640_WriteByte(0x8C);  // 发送命令,设置TM1640的显示亮度
    TM1640_Stop();  // 发送结束信号
}
回复

使用道具 举报

ID:213173 发表于 2023-11-15 11:10 | 显示全部楼层
jade-lluo 发表于 2023-11-15 09:23
我认真看了又看,还是不行。能说细一点吗?大佬

详细介绍你的硬件连接关系。小板子接的是串口,TM1640在数码管模块上还是在开发板上?
回复

使用道具 举报

ID:991042 发表于 2023-11-15 16:18 | 显示全部楼层
wulin 发表于 2023-11-15 11:10
详细介绍你的硬件连接关系。小板子接的是串口,TM1640在数码管模块上还是在开发板上?

TM1640是单独的模块。封装出来有4的脚,一个D(数据)和S(时钟),正极负极。STC8G1KO8的芯片,20个引脚。STC8G1K的P11连了TM1640的D口(数据),P10连了TM1640的S(时钟)口。STC8G1K的下载端口是没有问题的,可以烧录。我是接了51普中科技的下载端口。
回复

使用道具 举报

ID:1099849 发表于 2023-11-15 16:47 | 显示全部楼层
TM1640_Display(0x01);  // 显示数字1  
TM1640_Display(0x02);  // 显示数字2  
TM1640_Display(0x03);  // 显示数字3
回复

使用道具 举报

ID:213173 发表于 2023-11-15 21:55 | 显示全部楼层
jade-lluo 发表于 2023-11-15 16:18
TM1640是单独的模块。封装出来有4的脚,一个D(数据)和S(时钟),正极负极。STC8G1KO8的芯片,20个引脚 ...
  1. #include <stc8.h>
  2. #include <intrins.h>

  3. sbit CLK = P1^0;  // 连接到TM1640的CLK引脚
  4. sbit DIO = P1^1;   // 定义DIO引脚,连接到TM1640的DIO引脚
  5. //本地常量声明       
  6. unsigned char code table[]={     //标准字库
  7. //   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  8.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  9. //black          -    H    J    K          L           N    o    P          U    t    G    Q    r    M    y
  10.     0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e};

  11. void TM1640_Start(void)
  12. {
  13.         CLK = 1;  // CLK引脚置高电平
  14.         DIO = 1;  // DIO引脚置高电平
  15.         _nop_();_nop_();//延时2个时钟
  16.         DIO = 0;  // DIO引脚置低电平
  17.         CLK = 0;
  18. }

  19. void TM1640_Stop(void)
  20. {
  21.         DIO = 0;  // DIO引脚置低电平
  22.         _nop_();_nop_();//延时2个时钟
  23.         CLK = 1;  // CLK引脚置高电平
  24.         _nop_();_nop_();//延时2个时钟
  25.         DIO = 1;  // DIO引脚置高电平
  26. }

  27. void TM1640_Write_Byte(unsigned char data1)
  28. {
  29.     unsigned char i;
  30.     CLK = 0;
  31.     DIO = 0;
  32.     for(i=0; i<8; i++)  // 循环8次,写入8位数据
  33.     {
  34.                 CLK = 0;  // CLK引脚置低电平
  35.                 if(data1 & 0x01)
  36.                         DIO = 1;  // 将data1的最低位写入DIO引脚
  37.                 else
  38.                         DIO = 0;
  39.                 CLK = 1;
  40.                 data1 >>= 1;  // data1右移1位,准备写入下一位
  41.     }
  42.     CLK = 0;  // CLK引脚置低电平
  43.     DIO = 0;  // DIO引脚置低电平
  44. }

  45. void TM1640_Write_Com(unsigned char date)//发送命令字
  46. {
  47.         TM1640_Start();
  48.         TM1640_Write_Byte(date);
  49.         TM1640_Stop();
  50. }

  51. void TM1640_Display()
  52. {
  53.         unsigned char i;
  54.         TM1640_Write_Com(0x40);//44固定地址 40连续地址
  55.         TM1640_Start();  // 发送起始信号
  56.         TM1640_Write_Byte(0xc0);//从第一个地址开始
  57.         for(i=0;i<3;i++)
  58.                 TM1640_Write_Byte(table[i+1]);  // 连续发3个数字。最多16个数字
  59.         TM1640_Stop();  // 发送结束信号
  60. }
  61. void TM1640_Cls()//清屏函数
  62. {
  63.         unsigned char i;
  64.         TM1640_Write_Com(0x40);//地址自动加1模式
  65.         TM1640_Start();
  66.         TM1640_Write_Byte(0xc0);
  67.         for(i=0;i<16;i++)
  68.                 TM1640_Write_Byte(0x00);
  69.         TM1640_Stop();
  70. }
  71. void TM1640_Init()
  72. {
  73.         TM1640_Cls();
  74.         TM1640_Write_Com(0x8c);//亮度0x88~0x8F
  75. }
  76. void main()
  77. {
  78.         P0M0 = 0x00;
  79.         P0M1 = 0x00;
  80.         P1M0 = 0x00;
  81.         P1M1 = 0x00;
  82.         P2M0 = 0x00;
  83.         P2M1 = 0x00;
  84.         P3M0 = 0x00;
  85.         P3M1 = 0x00;
  86.         P4M0 = 0x00;
  87.         P4M1 = 0x00;
  88.         P5M0 = 0x00;
  89.         P5M1 = 0x00;
  90.         P6M0 = 0x00;
  91.         P6M1 = 0x00;
  92.         P7M0 = 0x00;
  93.         P7M1 = 0x00;
  94.         TM1640_Init();
  95.         TM1640_Display();//连续发1、2、3。
  96.         while(1);
  97. }
复制代码
回复

使用道具 举报

ID:991042 发表于 2023-11-27 18:26 | 显示全部楼层

谢谢你wulin,你给的答案很有启发,我参考你的代码搞懂了原理。也谢谢大家的回答,非常感谢。
我的问题最主要在对Command1、Command2、Command3的理解不清,导致写void TM1640_Write_Byte(unsigned char data1)这个的时候逻辑混乱,也搞不清对错,参考了正确的答案之后豁然开朗。真的超开心!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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