搜索
bottom↓
回复: 42
打印 上一主题 下一主题

求TM1628驱动10位共阳数码管的例程

[复制链接]

出20入26汤圆

跳转到指定楼层
1
发表于 2014-8-9 20:20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求个天微数码管驱动芯片的驱动程序,芯片TM1628,驱动10位共阳数码管的。

要直接能驱动10位的,有做过的朋友帮个忙。

现在我已经在网上找到了驱动程序,改了后可以驱动10位共阳的,但是跟其他程序一起放到大循环其他模块的功能就实现不了,屏蔽了显示,其他功能就能实现。

现在想看看你们怎么做的,参考参考下。

出0入0汤圆

2
发表于 2014-8-9 22:00:51 | 只看该作者
uchar Read_TM1668(void) {     uchar i,byte = 0;     for(i = 0; i < 8; i++)     {         byte >>= 1;         CLR_TM1668_CLK;         TM1668_DELAY;         TM1668_DELAY;         if(GET_TM1668_DIO != 0) byte |= 0x80;         SET_TM1668_CLK;         TM1668_DELAY;     }     return byte; }  void Write_TM1668(uchar byte) {     uchar i;     for(i = 0; i < 8; i++)     {         CLR_TM1668_CLK;         TM1668_DELAY;         if((byte & BIT0) != 0) SET_TM1668_DIO;         else CLR_TM1668_DIO;         TM1668_DELAY;         SET_TM1668_CLK;         byte >>= 1;         TM1668_DELAY;     } }

出0入0汤圆

3
发表于 2014-8-9 22:01:15 | 只看该作者
//set display mode     CLR_TM1668_STB;     Write_TM1668(0x03);     SET_TM1668_STB;     TM1668_DELAY;      //set addr mode      CLR_TM1668_STB;     Write_TM1668(0x44);     SET_TM1668_STB;     TM1668_DELAY;      //send display data     j = 0xC0;     for(i = 0; i < 5; i++)     {         CLR_TM1668_STB;         Write_TM1668(j);         Write_TM1668(u8_tmp[i]);         SET_TM1668_STB;         TM1668_DELAY;         j += 2;     }          //set bright     CLR_TM1668_STB;     Write_TM1668(0x8A);     SET_TM1668_STB;

出0入0汤圆

4
发表于 2014-8-9 22:12:10 | 只看该作者
你自己都有驱动程序了,你是想让人家提供一个刚好能符合你其他功能的程序吗?只要在需要更新显示的时候再通信,不更新的时候,跟没有这个函数的程序是一样的,不需要放到大循环去每次循环执行

出20入26汤圆

5
 楼主| 发表于 2014-8-9 22:16:04 | 只看该作者
little_Monkey 发表于 2014-8-9 22:12
你自己都有驱动程序了,你是想让人家提供一个刚好能符合你其他功能的程序吗?只要在需要更新显示的时候再通 ...

也不是放到大循环里, 一开始我初始化显示后,定时器就不走,屏蔽了初始化显示,定时器就正常,反反复复测试了,因为这个显示函数影响到了,但是最终没看出是什么问题

出20入26汤圆

6
 楼主| 发表于 2014-8-9 22:19:19 | 只看该作者
billmcu 发表于 2014-8-9 22:01
//set display mode     CLR_TM1668_STB;     Write_TM1668(0x03);     SET_TM1668_STB;     TM1668_DELAY ...

好乱                  

出0入0汤圆

7
发表于 2014-8-9 23:25:53 | 只看该作者

你说的根本就不是TM1628的问题

而是你程序架构的问题。你自己一点一点屏蔽分析一下就知道了呀。这样的问题来论坛问是不会有结果的。

出20入26汤圆

8
 楼主| 发表于 2014-8-9 23:45:43 | 只看该作者
STM32_Study 发表于 2014-8-9 23:25
你说的根本就不是TM1628的问题

而是你程序架构的问题。你自己一点一点屏蔽分析一下就知道了呀。这样的问 ...

是啊,现在就想看看人家驱动程序的框架怎么写的

出0入0汤圆

9
发表于 2014-8-9 23:48:47 | 只看该作者
jufr12315 发表于 2014-8-9 23:45
是啊,现在就想看看人家驱动程序的框架怎么写的

这个很简单啊

void TM1628_Dirver(void)
{
        if(TM1628_Update)
        {
                TM1628_Update = 0;
                //update
        }
}


就这样就OK了。

出20入26汤圆

10
 楼主| 发表于 2014-8-10 00:08:23 | 只看该作者
STM32_Study 发表于 2014-8-9 23:48
这个很简单啊

void TM1628_Dirver(void)


图中显示函数就在主循环前面,我只是测试下能不能显示。
不屏蔽可以显示,但是主循环里面的程序实现的功能就实现不了。
屏蔽了就可以实现。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

11
发表于 2014-8-10 00:11:24 | 只看该作者
你有看我发的帖子吗?

你的TM1628_Diaplay函数里面,有没有做这样的判断?

如果没有,那加上吧。

如果有,那就可能是溢出跑飞了。检查数组指针的调用吧。

只能帮到这里了。祝你好运

出20入26汤圆

12
 楼主| 发表于 2014-8-10 00:46:08 | 只看该作者
STM32_Study 发表于 2014-8-10 00:11
你有看我发的帖子吗?

你的TM1628_Diaplay函数里面,有没有做这样的判断?

好的,谢谢。

出0入0汤圆

13
发表于 2014-8-10 09:19:11 | 只看该作者
同感,我使用TM1650也遇到这个问题!

出20入26汤圆

14
 楼主| 发表于 2014-8-10 10:08:38 | 只看该作者
nsj21n 发表于 2014-8-10 09:19
同感,我使用TM1650也遇到这个问题!

问题还没解决么?我都搞一天了,没找出问题。

出0入0汤圆

15
发表于 2014-8-10 14:14:57 | 只看该作者
楼主上个TM1650的资料我看看
也好帮你~~~~~~~~~~~~~~~~~~~~~~~

出20入26汤圆

16
 楼主| 发表于 2014-8-10 14:26:56 | 只看该作者

上面是TM1628驱动芯片手册。
下面是阴码转阳码的程序,记得是在论坛某位网友贴出来的程序。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入26汤圆

17
 楼主| 发表于 2014-8-10 14:27:59 | 只看该作者
lxa0 发表于 2014-8-10 14:14
楼主上个TM1650的资料我看看
也好帮你~~~~~~~~~~~~~~~~~~~~~~~

资料已传在16楼,我是用来驱动10位共阳数码管

出0入0汤圆

18
发表于 2014-8-11 00:19:06 | 只看该作者
本帖最后由 lxa0 于 2014-8-11 00:27 编辑

大概看了下TM1628规格书.pdf
说是共阴时可以驱动7个数码管
共阳时可以驱动10个数码管
资料里边还有电路和代码
当然了,c代码我看不懂

不过,既然资料里有说可以驱动共阳10个
那你就仿照例程试验
应该不会有问题的

资料里边还强调了:
seg1~10引脚只能接led阳极
也就是说
你要驱动10个led数码管的话
用共阳的数码管最好了
里边还有详细的说明和代码
你得仔细的去琢磨啦

出20入26汤圆

19
 楼主| 发表于 2014-8-11 00:42:50 | 只看该作者
lxa0 发表于 2014-8-11 00:19
大概看了下TM1628规格书.pdf
说是共阴时可以驱动7个数码管
共阳时可以驱动10个数码管

谢啦,还在看,驱动例程是驱动共阴的,得改,现在是改后可以驱动,就是把驱动显示加入主函数就出问题,不是显示出问题,而是其他功能实现不了。
好啦,还是谢谢你。我自己再找找。

出0入0汤圆

20
发表于 2014-8-11 08:24:30 | 只看该作者
楼主把你完整的程序贴出来吧,这样别人才能帮你找问题呀

出20入26汤圆

21
 楼主| 发表于 2014-8-11 09:26:37 | 只看该作者
本帖最后由 jufr12315 于 2014-8-11 09:27 编辑


上面是整个工程
下面的TM1628部分代码
  1. #include <main.H>
  2. #include <TM1628.H>


  3. sbit Pin_TM1628_STB1 = P1^2;
  4. sbit Pin_TM1628_CLK1 = P1^1;
  5. sbit Pin_TM1628_DIO1 = P1^0;

  6. sbit Pin_TM1628_STB2 = P2^7;
  7. sbit Pin_TM1628_CLK2 = P2^6;
  8. sbit Pin_TM1628_DIO2 = P2^5;

  9. uchar code ucTabBrightness[]={0x80,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};//显示亮度表
  10. unsigned char code ucTabCode[]=
  11. {
  12.           0x3F, // 0
  13.         0x06, // 1
  14.         0x5B, // 2
  15.         0x4F, // 3
  16.         0x66, // 4
  17.         0x6D, // 5
  18.         0x7D, // 6
  19.         0x07, // 7
  20.         0x7F, // 8
  21.         0x6F, // 9       
  22. //        0xFF,//全亮         0x10
  23.         0x00,//全灭         0x11
  24. };

  25. //====================================================================
  26. //===         功能变量定义           ===//
  27. uchar xdata dis_buf1[8];                  //显示数据缓存区
  28. uchar xdata dis_buf11[8];                  //显示数据缓存区
  29. uchar xdata dis_date1[8];                 //段码数据缓存区
  30. uchar xdata dis_date11[8];                 //段码数据缓存区
  31. uchar xdata dis_buf2[8];                 //显示数据缓存区
  32. uchar xdata dis_buf22[8];                 //显示数据缓存区
  33. uchar xdata dis_date2[8];                //段码数据缓存区
  34. uchar xdata dis_date22[8];                //段码数据缓存区
  35. uchar xdata key_tm[5];                          //键值数据缓存区
  36. //====================================================================
  37. //===    TM16XX共阴码转共阳码函数            ===//
  38. //===    buf为准备转换的数据数组地址         ===//
  39. //===    date为转换后存储数组的数组地址        =//
  40. void A_To_K(unsigned char *buf,unsigned char *date)
  41. {
  42.         uchar i,j,tmp,index;
  43.         for(i=0;i<8;i++)
  44.         {
  45.                 tmp=*(buf + i);
  46.                 for(j=0;j<8;j++)
  47.                 {
  48.                         if(i<8)
  49.                                 index=j;
  50.                         else
  51.                                 index=j+1;
  52.                         if(tmp&(1<<j))
  53.                         {
  54.                                 *(date+index) |= (1<<i);
  55.                         }
  56.                         else
  57.                         {
  58.                                 *(date+index) &=(~(1<<i));
  59.                         }
  60.                 }
  61.         }
  62. }
  63. //====================================================================
  64. //===          TM1668驱动函数        ===//
  65. void WriteByte(uchar w_data,char flag)      //写一字节数据
  66. {
  67.     uchar i;
  68.         if(1 == flag)
  69.         {
  70.                 Pin_TM1628_STB1 = 0;
  71.                 for(i=8;i!=0;i--)
  72.                 {
  73.                     Pin_TM1628_CLK1 = 0;
  74.                         if(w_data&0x01)
  75.                             Pin_TM1628_DIO1 = 1;
  76.                         else
  77.                                 Pin_TM1628_DIO1 = 0;
  78.                     Pin_TM1628_CLK1 = 1;
  79.                     w_data >>= 1;
  80.                 }
  81.         }
  82.         else
  83.         {
  84.                 Pin_TM1628_STB2 = 0;
  85.                 for(i=8;i!=0;i--)
  86.                 {
  87.                     Pin_TM1628_CLK2 = 0;
  88.                         if(w_data&0x01)
  89.                             Pin_TM1628_DIO2 = 1;
  90.                         else
  91.                                 Pin_TM1628_DIO2 = 0;
  92.                     Pin_TM1628_CLK2 = 1;
  93.                     w_data>>=1;
  94.                 }
  95.         }
  96. }
  97. //== 数码管显示 flag :1->TM1628芯片1显示   2->TM1628芯片2显示
  98. //== Brighttness :亮度调节 级别 0-8
  99. void TM1628_Display(char flag,char Brightness)   //写多字节数据
  100. {
  101.     uchar i;
  102.         if(1 == flag)
  103.         {
  104.             Pin_TM1628_CLK1 = 1;
  105.             Pin_TM1628_DIO1 = 1;
  106.             Pin_TM1628_STB1 = 1;
  107.             WriteByte(0x03,1);                      //7位10段
  108.             Pin_TM1628_STB1 = 1;
  109.             WriteByte(0x44,1);                      //写数据
  110.             Pin_TM1628_STB1 = 1;
  111.             for(i=0;i<7;i++)                                        //7个地址
  112.             {
  113.                 WriteByte(0xc0+(i*2),1);             //写地址
  114.                 WriteByte(dis_date1[i],1);           //写显示数据到显存
  115.                 Pin_TM1628_STB1 = 1;
  116.             }
  117.             for(i=0;i<7;i++)
  118.             {
  119.                 WriteByte(0xc0+(i*2)+1,1);             //写地址
  120.                 WriteByte(dis_date11[i],1);           //写显示数据到显存
  121.                 Pin_TM1628_STB1 = 1;
  122.             }
  123.             WriteByte(ucTabBrightness[Brightness],1); //开显示,亮度为10/16
  124.             Pin_TM1628_STB1 = 1;
  125.         }
  126.         else
  127.         {
  128.             Pin_TM1628_CLK2 = 1;
  129.             Pin_TM1628_DIO2 = 1;
  130.             Pin_TM1628_STB2 = 1;
  131.             WriteByte(0x03,2);                      //7位10段
  132.             Pin_TM1628_STB2 = 1;
  133.             WriteByte(0x44,2);                      //写数据
  134.             Pin_TM1628_STB2 = 1;
  135.             for(i=0;i<7;i++)                                        //7个地址
  136.             {
  137.                 WriteByte(0xc0+(i*2),2);             //写地址
  138.                 WriteByte(dis_date2[i],2);           //写显示数据到显存
  139.                 Pin_TM1628_STB2 = 1;
  140.             }
  141.             for(i=0;i<7;i++)
  142.             {
  143.                 WriteByte(0xc0+(i*2)+1,2);             //写地址
  144.                 WriteByte(dis_date22[i],2);           //写显示数据到显存
  145.                 Pin_TM1628_STB2 = 1;
  146.             }
  147.             WriteByte(ucTabBrightness[Brightness],27); //开显示,亮度为10/16
  148.             Pin_TM1628_STB2 = 1;
  149.         }
  150. }
复制代码

  1. void main()
  2. {
  3.         char i;
  4.         uiCount = 0;
  5.         uiTempCountStart = uiCount;
  6.         uiTempCycles = 0;
  7.         uiTempCountEnd = 500;
  8.         Init();
  9.         KeyInit();
  10.         Write12887(0x0a,0x20); //开振荡器                第一次使用DS12C887和在仿真中 都必须打开
  11.         Write12887(0x0B,0x06); //允许更新、设置格式为二进制,时钟为24小时制、开启闹钟
  12.         Write12887(0x0B,0x86);
  13.         Write12887(SEC_ADDR,0);
  14.         Write12887(MIN_ADDR,30);
  15.         Write12887(HOUR_ADDR,1);
  16.         Write12887(WEEK_ADDR,5);
  17.         Write12887(DAY_ADDR,8);
  18.         Write12887(MON_ADDR,8);
  19.         Write12887(YEAR_ADDR,14);
  20.         Write12887(0x0B,0x06);

  21.         Year = Read12887(YEAR_ADDR);
  22.         Mon = Read12887(MON_ADDR);
  23.         Day = Read12887(DAY_ADDR);
  24.         Hour = Read12887(HOUR_ADDR);
  25.         Min = Read12887(MIN_ADDR);
  26.         Sec = Read12887(SEC_ADDR);
  27.         Week = Read12887(WEEK_ADDR);
  28.         DisCount();//转换存到数组
  29.     for(i=0;i<8;i++)
  30.     {
  31.         dis_buf1[i]=ucTabCode[10];//清零
  32.                 dis_buf2[i]=ucTabCode[10];//清零
  33.                 dis_buf11[i]=ucTabCode[10];
  34.                 dis_buf22[i]=ucTabCode[10];
  35.     }

  36.     A_To_K(dis_buf1,dis_date1);//将共阴代码转换成共阳代码         芯片1的 SEG1-SEG8  8位数码管
  37.         A_To_K(dis_buf11,dis_date11);//                                                        芯片1的 SEG9-SEG10 2位数码管
  38.     A_To_K(dis_buf2,dis_date2);//将共阴代码转换成共阳代码
  39.         A_To_K(dis_buf22,dis_date22);
  40.     TM1628_Display(1,1);//写显示数据到TM16**显存中
  41.         TM1628_Display(2,1);
  42.         [color=Magenta]//上面两个显示函数屏蔽,主循环时间读取是能正常工作的,因为时间读取中每次秒位变化,我就点亮led半秒,就是时钟的冒号闪烁
  43.         //不屏蔽的话,led就不会闪烁,要么是不会进入扫描读取里面,要么就是时间没变化。但是这两个显示函数看不出影响到哪里,有时屏蔽一个显示函数led能闪烁        [/color]                                                                       
  44.         while(1)
  45.         {
  46. //                时间读取                       
  47.                 if(uiCount >= uiReadCountStart)
  48.                         uiReadCycles =         uiCount - uiReadCountStart;
  49.                 else
  50.                         uiReadCycles = 0xffff - uiReadCountStart + uiCount;
  51.                 if(uiReadCycles > 10) //10ms
  52.                 {
  53.                         Conversion();
  54.                         SecBuf = Sec;
  55.                         Sec = Read12887(SEC_ADDR);
  56.                         if(SecBuf != Sec)
  57.                                 bSecFlag = 1;
  58.                         Year = Read12887(YEAR_ADDR);
  59.                         Mon = Read12887(MON_ADDR);
  60.                         Day = Read12887(DAY_ADDR);
  61.                         Hour = Read12887(HOUR_ADDR);
  62.                         Min = Read12887(MIN_ADDR);
  63.                         Sec = Read12887(SEC_ADDR);
  64.                         Week = Read12887(WEEK_ADDR);
  65.                         M_Year = Year;
  66.                         M_Mon  = Mon;
  67.                         M_Day  = Day;

  68.                         uiReadCountStart = uiCount;
  69.                         uiReadCycles = 0;                                                 
  70.                 }
  71. //                按键扫描
  72.                 if(uiCount >= uiKeyCountStart)
  73.                         uiKeyCycles =         uiCount - uiKeyCountStart;
  74.                 else
  75.                         uiKeyCycles = 0xffff - uiKeyCountStart + uiCount;
  76.                 if(uiKeyCycles > 10) //20ms
  77.                 {
  78.                         Key(ReadKey());
  79.                         uiKeyCountStart = uiCount;
  80.                         uiKeyCycles = 0;
  81.                 }
  82. //                温度读取
  83.                 if(uiCount >= uiTempCountStart)
  84.                         uiTempCycles =         uiCount - uiTempCountStart;
  85.                 else
  86.                         uiTempCycles = 0xffff - uiTempCountStart + uiCount;
  87.                 if(uiTempCycles > uiTempCountEnd) //20ms
  88.                 {
  89.                         if(bTempConverFlag)
  90.                         {
  91.                                 bTempConverFlag = 0;
  92.                                 ConversionTemp();
  93.                                 uiTempCountStart = uiCount;
  94.                                 uiTempCountEnd = 10;//10 * 2 =20ms
  95.                                 uiTempCycles = 0;
  96.                         }
  97.                         else
  98.                         {
  99.                                 bTempConverFlag = 1;//启动转换
  100.                                 Temp = GetTemp();
  101.                                 uiTempCountStart = uiCount;
  102.                                 uiTempCountEnd = 500;//500 * 2 = 1000ms
  103.                                 uiTempCycles = 0;
  104.                         }
  105.                 }       
  106.                 DisCount();
  107.         }
  108. }
  109. void T0_ISR(void) interrupt 1
  110. {       
  111.         TH0 = ucTh;
  112.         TL0 = ucTl;       
  113.         uiCount++;
  114.         if(bSecFlag)
  115.         {
  116.                 Pin_Led = 0;
  117.                 if(++Count500Ms == 250)//亮500MS
  118.                 {
  119.                         Pin_Led = 1;
  120.                         Count500Ms = 0;
  121.                         bSecFlag = 0;
  122.                 }
  123.         }
  124.                  
  125. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

22
发表于 2014-8-11 14:20:55 | 只看该作者
jufr12315 发表于 2014-8-11 00:42
谢啦,还在看,驱动例程是驱动共阴的,得改,现在是改后可以驱动,就是把驱动显示加入主函数就 ...

你要把显示程序做为子程序去调用才行啊
那样你才可以去做别的

出20入26汤圆

23
 楼主| 发表于 2014-8-11 15:44:00 | 只看该作者
lmt50211 发表于 2014-8-11 08:24
楼主把你完整的程序贴出来吧,这样别人才能帮你找问题呀

我已传了程序

出0入0汤圆

24
发表于 2014-8-12 08:41:06 | 只看该作者
看程序倒没什么问题,你可以先这样,先把显示调通,然后把其它的整合起来

出20入26汤圆

25
 楼主| 发表于 2014-8-12 09:38:25 | 只看该作者
lmt50211 发表于 2014-8-12 08:41
看程序倒没什么问题,你可以先这样,先把显示调通,然后把其它的整合起来
...

是哦,我现在就是这样做的,单显示可以了。
整合起来一起,显示还是可以的,但其他功能就不行。屏蔽了显示,其他功能貌似正常。

出0入4汤圆

26
发表于 2014-8-12 13:09:23 | 只看该作者
TMXXX 系列的最好有共阴的,这样显示程序比较简单。刚开始用时出现同样的失误,解决办法如下:
1.先定义显示缓存有几位数码管就定义几个字节的数组。
2.定时器中断程序将数组内容传到TMXXXX芯片内显存,达到双缓存的目的。
3.写一个子程序更新每位数码管的单片机内数组的内容,当相于手机的横屏或竖屏模式。
4.菜单或基它程序调用3步子程序就行了。

出20入26汤圆

27
 楼主| 发表于 2014-8-13 02:05:00 | 只看该作者
liguangqang 发表于 2014-8-12 13:09
TMXXX 系列的最好有共阴的,这样显示程序比较简单。刚开始用时出现同样的失误,解决办法如下:
1.先定义显 ...

谢谢朋友。
你说的这个我有点不明白,能否再详细点呢?
现在我总结出来了,我用了另一款天微的芯片TM1640,驱动的是16位共阴数码管,也要同样的问题,
就是在初始化的时候一调用显示函数,定时器就完全不会计数了,主循环也貌似不会循环,像是卡死在什么地方。
你知道是啥原因吗?

出0入4汤圆

28
发表于 2014-8-13 10:08:30 | 只看该作者
UINT8 DispBuf[16]; //显示缓存
UINT8 KeyVal[4];   //键值缓环保
UINT16 TempVal;    //温度值
//显示更新
void TM1628_Display(void)
{
        for(i=0;i<8;i++)  TM1628_WriteByte(1,DispBuf[i]);
        for(i=8;i<16;i++) TM1628_WriteByte(2,DispBuf[i]);
}
//获取键值
void TM1628_GetKeyVal(void)
{
        for(i=0;i<4;i++)  TM1628_ReadByte(1,KeyVal);
}
//写段数据
void TM1628_ WriteSeg(UINT8 Seg, UINT8 Val)
{
        //根据不同的段Seg,写入DispBuf[]相应的位
}
void main(void)
{
        //硬件初始化
        HW_Init();
        //初始化DS12887
        DS12887_Init();
        //初始化TM1628
        TM1628_Init();
        while(1)
        {
                //软件消息
                if(KeyVal[3] & 0x80)
                {
                        //冒号闪
                        TM1628_ WriteSeg(冒号段,冒号位取反);
                        //读取日期,时间数据
                        Year = Read12887(YEAR_ADDR);
               //写入相应段
                        TM1628_ WriteSeg(年段,Year);
                }
                //设置键
                if(KeyVal[0] & 0x80)
                {
                        //设置处理
                        //用TM1628_WriteSeg()更新提示在设置状态
                }
                //+键
                if(KeyVal[1] & 0x80)
                {
                        //+处理
                        //用TM1628_WriteSeg()更新提示在+状态
                }
                //-键
                if(KeyVal[2] & 0x80)
                {
                        //-处理
                        //用TM1628_WriteSeg()更新提示在-状态
                }
        }
}
void T0_ISR(void) interrupt 1  //定时10ms
{
        //定义状态机
        static UINT8 Status = 0;
       
        //定时刷新频率100Hz
        TM1628_Display();
        //获取键值,系统消息
        TM1628_GetKeyVal();
       
        if(Status == 0)
        {
                //启动温度转换
                DS18B20_ConversionTemp();
        }
        if(Status == 50)
        {
                //获取温度值
                TempVal = DS18B20_GetTemp();
                //软件触发消息,频率1Hz
                KeyVal[3] |= 0x80;
        }
}

再不明白,就没办法了

出0入0汤圆

29
发表于 2014-8-13 11:12:06 | 只看该作者
用过1630和1668,抠下他们pdf上的例程,就可以用了。

出0入50汤圆

30
发表于 2014-8-13 11:31:54 | 只看该作者
1628我一直驱动共阴的数码管,从来未试过共阳的,你这7×10驱动,小数点就不能驱动了。

出20入26汤圆

31
 楼主| 发表于 2014-8-13 12:10:17 | 只看该作者
wkman 发表于 2014-8-13 11:12
用过1630和1668,抠下他们pdf上的例程,就可以用了。

有例程的,只是例程是驱动共阴的,要驱动共阳的程序比较麻烦,虽然可以显示,但是影响到其他程序模块功能的实现。
所以我就买了共阴的数码管跟另一个型号的驱动芯片,结果还是跟前面一样,显示可以,但还是影响到其他功能,现在怀疑是电路问题,
电流不够,或者干扰什么的,程序像是卡死,跑飞,晚上改改电路,试试看。

出20入26汤圆

32
 楼主| 发表于 2014-8-13 12:11:18 | 只看该作者
ilikemcu 发表于 2014-8-13 11:31
1628我一直驱动共阴的数码管,从来未试过共阳的,你这7×10驱动,小数点就不能驱动了。 ...

对啊,小数点不用它。
驱动共阳好麻烦,所以重新买了共阴的数码管。

出20入26汤圆

33
 楼主| 发表于 2014-8-13 12:14:09 | 只看该作者
liguangqang 发表于 2014-8-13 10:08
UINT8 DispBuf[16]; //显示缓存
UINT8 KeyVal[4];   //键值缓环保
UINT16 TempVal;    //温度值

哇哇,谢谢你写这么多,知道你说的了。
这款驱动芯片,不需要定时显示的。
只要在需要改变显示时重新写数据就好了。

出0入4汤圆

34
发表于 2014-8-13 12:21:57 | 只看该作者
如用共阳的,就得在内存中将数据转90度,双缓存定时刷新占用资源少,应该是比较合适。
当然可以不用定时刷新可以驱动,但程序结构比较乱,不易维护。
用于人机交互,最好想清楚软件架构。不然非常麻烦。

出20入26汤圆

35
 楼主| 发表于 2014-8-13 14:13:15 | 只看该作者
liguangqang 发表于 2014-8-13 12:21
如用共阳的,就得在内存中将数据转90度,双缓存定时刷新占用资源少,应该是比较合适。
当然可以不用定时 ...

数据已经转换了,呵呵。
晚上回去试试,谢谢你的建议。

出20入26汤圆

36
 楼主| 发表于 2014-8-16 18:21:42 | 只看该作者
问题解决,在单片机电源脚加滤波电容就好,估计是电流不够

出0入0汤圆

37
发表于 2014-9-26 13:16:37 | 只看该作者
本帖最后由 mcu_mouse 于 2014-9-26 14:40 编辑

之前内容错误,,重新回帖。

出0入0汤圆

38
发表于 2014-9-26 13:26:26 | 只看该作者
mcu_mouse 发表于 2014-9-26 13:16
“【p07u了          子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙 ...

你想怎样

出20入26汤圆

39
 楼主| 发表于 2014-9-26 14:21:45 | 只看该作者
mcu_mouse 发表于 2014-9-26 13:16
“【p07u了          子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙子子孙孙 ...

你想怎样                  

出0入0汤圆

40
发表于 2014-9-26 14:37:43 | 只看该作者

才发现,应该是我看帖子的时候有事去了,我崽按的,2岁多的小屁股,就喜欢在我电脑上按。。。。。

出0入0汤圆

41
发表于 2014-9-26 14:38:46 | 只看该作者

电脑在家里没关,肯定是小屁股给我在上面乱按。。。。。

出0入0汤圆

42
发表于 2018-2-1 10:35:04 | 只看该作者
liguangqang 发表于 2014-8-13 10:08
UINT8 DispBuf[16]; //显示缓存
UINT8 KeyVal[4];   //键值缓环保
UINT16 TempVal;    //温度值

MARK……

出0入0汤圆

43
发表于 2023-5-22 10:28:01 | 只看该作者
近期要用这个芯片,学习一下,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-21 01:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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