【TI 技术资料分享】+1602数码显示和实时时钟

2019-07-30 18:28发布

MSP430F149+1602数码显示和实时时钟 MSP430F149 1602数码显示和实时时钟.zip (65.07 KB, 下载次数: 17) 2015-3-9 21:46 上传 点击文件名下载附件
  1. /*************************************************
  2. 程序功能:将DS18B20测温结果和DS1302的时间一起在1602
  3.           液晶上显示
  4. -------------------------------------------------
  5. 测试说明:观察液晶显示。
  6. *************************************************/
  7. #include <msp430x14x.h>
  8. #include "BoardConfig.h"
  9. #include "DS18B20.h"
  10. #include "DS1302.h"
  11. #include "cry1602.h"

  12. uchar dN[6];        //存放十进制测温结果的数组

  13. void Disp_Numb(uint temper);
  14. void ShowTime(uchar *times);
  15. /****************主函数****************/
  16. void main(void)
  17. {
  18.     uchar i;
  19.     //设置当期时间的数组,格式为BCD码,顺序:秒 分 时 日 月 星期 年
  20.     uchar CurrentTime[7] = {0x00,0x00,0x00,0x18,0x04,0x05,0x08};
  21.     uchar ReadTime[7];
  22.    
  23.     WDTCTL=WDTPW+WDTHOLD;
  24.      
  25.     /*------选择系统主时钟为8MHz-------*/
  26.     BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡器
  27.     do
  28.     {
  29.         IFG1 &= ~OFIFG;                 //清除晶振失败标志
  30.         for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
  31.     }
  32.     while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
  33.     BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振
  34.    
  35.     BoardConfig(0xb8);                  //关闭数码管、流水灯和电平转换
  36.     LcdReset();                         //初始化液晶
  37.     Reset_DS1302();                     //初始化DS1302
  38.     //这条程序可以设置DS1302内部时间,如果不需要请将其注释掉(快捷键:Ctrl+K)
  39.     Set_DS1302(CurrentTime);                             
  40.     //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
  41.     TACTL |= TASSEL_2 + ID_3;
  42.     //在液晶上显示提示文字   
  43.     DispStr(0,0,"Temp:");
  44.     DispStr(0,1,"Time:");
  45.     //循环读数显示
  46.     while(1)
  47.     {
  48.        Disp_Numb(Do1Convert());         //执行一次测温
  49.        Disp1Char(6,0,dN[5]+0x30);       //显示测温结果
  50.        Disp1Char(7,0,dN[4]+0x30);
  51.        Disp1Char(8,0,'.');
  52.        Disp1Char(9,0,dN[3]+0x30);
  53.        Disp1Char(10,0,dN[2]+0x30);
  54.        Disp1Char(11,0,dN[1]+0x30);
  55.        Disp1Char(12,0,dN[0]+0x30);
  56.       
  57.        Get_DS1302(ReadTime);            //读取当前时间
  58.        ShowTime(ReadTime);              //显示时分秒信息
  59.     }
  60. }
  61. /*******************************************
  62. 函数名称:Disp_Numb
  63. 功    能:将从DS18B20读取的11bit温度数据转换
  64.           成十进制温度数字
  65. 参    数:temper--11bit温度数据
  66. 返回值  :无
  67. ********************************************/
  68. void Disp_Numb(uint temper)
  69. {
  70.     uchar i;
  71.    
  72.     for(i = 0;i < 6;i++) dN[i] = 0; //初始化显示变量

  73.     //数值转换
  74.     if(temper & BIT0)
  75.     {
  76.         dN[0] = 5;
  77.         dN[1] = 2;
  78.         dN[2] = 6;
  79.     }
  80.     if(temper&BIT1)     
  81.     {
  82.         dN[1] += 5;
  83.         dN[2] += 2;
  84.         dN[3] += 1;
  85.     }
  86.     if(temper & BIT2)     
  87.     {
  88.         dN[2] += 5;
  89.         dN[3] += 2;
  90.         if(dN[2] >= 10)
  91.         {
  92.             dN[2] -= 10;
  93.             dN[3] += 1;
  94.         }
  95.     }
  96.     if(temper&BIT3)     
  97.     {
  98.         dN[3] += 5;
  99.     }
  100.     if(temper & BIT4)
  101.     {
  102.         dN[4] += 1;
  103.     }
  104.     if(temper & BIT5)     
  105.     {
  106.         dN[4] += 2;
  107.     }
  108.     if(temper & BIT6)
  109.     {
  110.         dN[4] += 4;
  111.     }
  112.     if(temper & BIT7)     
  113.     {
  114.         dN[4] += 8;
  115.         if(dN[4] >= 10)
  116.         {
  117.             dN[4] -= 10;
  118.             dN[5] += 1;
  119.         }
  120.     }
  121.     if(temper & BIT8)
  122.     {
  123.         dN[4] += 6;
  124.         dN[5] += 1;
  125.         if(dN[4] >= 10)
  126.         {
  127.             dN[4] -= 10;
  128.             dN[5] += 1;
  129.         }
  130.     }
  131.     if(temper & BIT9)
  132.     {
  133.         dN[4] += 2;
  134.         dN[5] += 3;
  135.         if(dN[4] >= 10)
  136.         {
  137.             dN[4] -= 10;
  138.             dN[5] += 1;
  139.         }
  140.     }
  141.     if(temper & BITA)
  142.     {
  143.         dN[4] += 4;
  144.         dN[5] += 6;
  145.         if(dN[4] >= 10)
  146.         {
  147.             dN[4] -= 10;
  148.             dN[5] += 1;
  149.         }
  150.         if(dN[5] >= 10)
  151.         {
  152.             dN[5] -= 10;
  153.         }
  154.     }
  155. }
  156. /*******************************************
  157. 函数名称:ShowTime
  158. 功    能:将DS1302的时间转换成10进制显示
  159. 参    数:times--读取的时间数组
  160. 返回值  :无
  161. ********************************************/   
  162. void ShowTime(uchar *times)
  163. {
  164.     uchar h2[8];        //第2行显示数据
  165.     const uchar shuzi[] = {"0123456789"};
  166.       
  167.     h2[0] = shuzi[times[2]>>4];     //时
  168.     h2[1] = shuzi[times[2]&0x0f];
  169.     h2[2] = 0x3a;       //":"
  170.     h2[3] = shuzi[times[1]>>4];     //分
  171.     h2[4] = shuzi[times[1]&0x0f];
  172.     h2[5] = 0x3a;       //":"
  173.     h2[6] = shuzi[times[0]>>4];     //秒
  174.     h2[7] = shuzi[times[0]&0x0f];
  175.     DispNChar(6,1,8,h2);           //在第二行显示
  176. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。