数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 5054|回复: 45

[other] 【MSP430】第一次学单片机的作业,使用MSP430G2452制作LED时钟

[复制链接]
发表于 2020-11-8 20:18:00 | 显示全部楼层 |阅读模式
第一次学单片机,来这个板块发帖也是第一次,发现主题分类没有MSP430,看来这系列的单片机很小众啊,自己在标题加一个分类了

手头的MSP430 的开发板还是很多年前从TI网站上免费申请的,印象里当时TI在做推广,我不懂单片机,
也只是凑热闹申请了两个,当时拿到手很新鲜,不过做的实验,也就是让开发板上的小led闪亮而已,
后来就闲置了,一直没有好好学

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 5家元 +76 收起 理由
飞向狙沙 + 18 謝謝分享
zjzkl + 8 謝謝分享
玛德陛下 + 10 謝謝分享
zzy_85569381 + 20 謝謝分享
家睦 + 20

查看全部打赏

 楼主| 发表于 2020-11-8 20:55:27 | 显示全部楼层
使用的4位数字LED面板,好像是很久以前从一个录像机上拆下来的,放置了很久了,总想着废物利用,
可一直没有动手


这个LED面板,有15个引脚
经过测试,1到5是正极
6到15是负极

其中1到4是四个数字的共用正极
5,是左上角一个方块,和TIMER两个LED的正极

6-12,是数字的笔画,四个数字共用笔画的负极

13是一些特殊笔画和Hi-Fi的负极
14,15是两个小点,和VCR,AM的负极


回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 21:16:01 | 显示全部楼层
发现上传图片总是失败啊,别着急,再来!

MSP430 这个款入门级的开发板,MSP-EXP430G2
包装里有两个单片机芯片一个是G2553,一个是G2452

网上查了资料,发现G2452这个内部资源更少一些,
做时钟已经足够用了,于是主要看G2452的资料

第一个考虑的问题,这个单片机,可以独立运行的最小系统是什么,
意思就是不用开发板,也能单独运行

网上找了一下,发现别人也问过同样的问题,答案让我开心不已

原来,这款单片机,内置了时钟,不需要复杂的外部电路,只要一个电阻,一个电容,和供电,就能启动了

这个电阻是reset脚上拉电阻,这个电容是reset脚接地用


抱怨一句,还是不能传图成功啊,


回复 支持 反对

使用道具 举报

发表于 2020-11-8 21:20:51 | 显示全部楼层
还是arduino好入手一些:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 21:23:31 | 显示全部楼层
巧的是,这块四字段的数字面板,宽度是5cm,正好跟手头的洞洞板的宽度一样,

简单处理一下,数字面板的支架,就焊在洞洞板上了,


很快,掌握了G2452端口的控制方式,学会了设置高电平,低电平,
学会了点亮一个数字的一个笔画

到了点亮整个数字,开心啊


回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 21:25:34 | 显示全部楼层
jpdd521 发表于 2020-11-8 21:20
还是arduino好入手一些

的确如此,只是手头正好有msp430,就没有浪费

其实到理解一定程度以后,发现msp430使用寄存器控制端口,也不是很难
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 21:26:11 | 显示全部楼层
哭死!我的图片怎么都没有出现啊
回复 支持 反对

使用道具 举报

发表于 2020-11-8 21:35:44 | 显示全部楼层
本帖最后由 jmx1124 于 2020-11-8 21:37 编辑
pcdoctor 发表于 2020-11-8 21:26
哭死!我的图片怎么都没有出现啊

论坛又抽风了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 21:44:49 | 显示全部楼层
这块MSP430G2452,有20个脚,减去电源正负极,一个test脚,一个reset脚,剩下只有16个,分为两组,叫做P1,P2
看资料,这两个组的功能还有些不一样,P2这一组功能更简单一些

这个实验套装里面,还送了一个高精度的时钟频率振荡器,我做这个时钟,正要用上

不过这个时钟需要连接到,第18,和19两个引脚上,端口的序列号是P2.6,P2.7

这样可用于控制LED的脚只有14个了

还要加两个按钮,只剩下12个了,

四个数字,需要4+7=11个脚,只剩下一个教控制两个小点,这还是要把两个小点并在一起同时控制了,

到此为止,20个引脚全部占满,

在学会引脚同时多种用途之前,就没有办法增加蜂鸣器的控制了,真的好可惜,想做一个会嘀嘀叫定时器的想法只能搁置了




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 22:11:06 | 显示全部楼层
终于看到我的图片了,

下面的电源盒子是三个AAA电池,是很久以前从一个废弃的电动玩具上拆下来的

纽扣电池用于保持供电,用一个二极管串联一下,防止纽扣电池被充电,为了降低二极管的压降,还专门找了一个肖特基二极管,压降只有0.19V
其实这都是过度使用资源了,哈哈哈,不过从废旧主板上拆下来的,闲着也是闲着

上面的盖子使用塑料片做的,侧面给两个按钮挖空



抱怨一下,两百多kb的图片上传,怎么就这么困难啊


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 22:31:00 | 显示全部楼层
用了9个限流电阻,用在了数字7个,两个小点,阻值72欧姆,亮度正合适,试过100欧姆和更大的,亮度有点低了
电源正极加了一个跳线,当作开关了,顺便也可以方便测试
还加了一个电解电容,220微法10V,感觉也是过度使用资源了

走线,没有在背面大量使用,还是用多色的线放在正面了,好看啊,有装饰的作用,嘿嘿



看到包装盒的日期了,2012年的,我的天啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 22:39:34 | 显示全部楼层
上个图,真太难了,又失败了一次,
管理员能看到的话,希望能改善一下图片管理服务器的效率


回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 22:42:40 | 显示全部楼层
传图片多次失败,还是放代码吧
这个小制作,学了msp430的基本知识,
时钟中断的处理
按钮中断的处理
按钮长时间按下的判断
等等

  1. #include <msp430.h>                               


  2. /**
  3. * blink.c
  4. */
  5. volatile unsigned int SleepCountDown;
  6. #define SLEEPTIME  60 // second to sleep

  7. volatile unsigned int halfsecond,second,minute, hour, month, day, year,timerminute,timersecond;
  8. volatile unsigned int ClockStep, OnShowLocation;
  9. #define CLOCKSTEPNUMBER  128
  10. #define HALFSCONDSTEP  (512/CLOCKSTEPNUMBER/2)
  11. #define TIMERSTEP  (512/CLOCKSTEPNUMBER)


  12. volatile unsigned char DisplayMode,oldDisplayMode, IsSettingMode, ButtonPressed,longpress1,button1_longpressed,buttonstatus,timerstart,timerstep;
  13. volatile unsigned char Button2Pressed, longpress2,button2_longpressed,SettingItem;

  14. #define MINUTESECONDMODE 0
  15. #define HOURMINUTEMODE   1
  16. #define MONTHDAYMODE     2
  17. #define YEARMODE         3
  18. #define DISPLAYMODECOUNT 4

  19. #define TIMERMODE        5

  20. #define SETTING_MINUTE   0
  21. #define SETTING_SECOND   1
  22. #define SETTING_HOUR     2
  23. #define SETTING_DAY      3
  24. #define SETTING_MONTH    4
  25. #define SETTING_YEAR     5
  26. #define SETTINGMODECOUNT 6

  27. void ShowTime(void);
  28. void ShowPoint(void);
  29. void clear(void);
  30. void ShowDec( unsigned int);

  31. void ShowNum(unsigned int index, unsigned int n);


  32. static inline void onEverySecond(void);
  33. static inline unsigned char in_Debounce(unsigned char button);

  34. static inline void onQuarterSecond(void);
  35. void clearTimer(void);
  36. static inline void SettingItemChange(void);
  37. static inline void SettingModeButton1(void );

  38. #define SHOWTIME (34625)
  39. #define LOOPCOUNT (2000)
  40. #define CLEARLOOPCOUNT (1000)

  41. #define BUTTON1 BIT4
  42. #define BUTTON2 BIT7


  43. void main(void)
  44. {
  45.         WDTCTL = WDTPW | WDTHOLD;                // stop watchdog timer

  46.         BCSCTL3 = LFXT1S_0 + XCAP_3;
  47.         P1DIR |= 0b1101111;                                        // configure P1.0 as output
  48.         P2DIR |= 0b111111;

  49.         BCSCTL1 |= DIVA_3;              // ACLK/8
  50.         BCSCTL3 |= XCAP_3;              //12.5pF cap- setting for 32768Hz crystal




  51.         //currentMinutes = 0;
  52.         //currentSeconds = 0;

  53.         CCTL0 |= CCIE;                   // CCR0 interrupt enabled
  54.         CCR0 = CLOCKSTEPNUMBER-1;                 // 512 -> 1 sec, 30720 -> 1 min
  55.         TACTL = TASSEL_1 + ID_3 + MC_1;         // ACLK, /8, upmode


  56.         P1DIR |=~(BUTTON1+BIT7);
  57.         P1REN =BUTTON1+BIT7;   // Enable resistor
  58.         P1OUT = ~(BUTTON1+BIT7); //从低到高引发中断,即按下按钮就产生中断
  59.         P1IE  =BUTTON1+BIT7;   //enable interrupt for P1.4
  60.         P1IES =~(BUTTON1+BIT7);
  61.         P1SEL=0x00;
  62.         P1IFG =0x00;

  63.         SleepCountDown=SLEEPTIME;  // 20 second to sleep;

  64.         halfsecond=0;
  65.         second=0;
  66.         minute=56;
  67.         hour=17;
  68.         month=11;
  69.         day=5;
  70.         year=2020;
  71.         timerminute=0;
  72.         timersecond=0;

  73.         DisplayMode = MINUTESECONDMODE;
  74.         oldDisplayMode=DisplayMode;
  75.         ButtonPressed=0;
  76.         buttonstatus=0;
  77.         longpress1=0;
  78.         button1_longpressed=0;
  79.         timerstart=0;
  80.         timerstep=0;

  81.         Button2Pressed=0;
  82.         longpress2=0;
  83.         button2_longpressed=0;
  84.         IsSettingMode=0;
  85.         SettingItem=0;

  86.         ClockStep=0;


  87.         OnShowLocation=0;
  88.         //_BIS_SR( LPM3_bits + GIE);           // Enter LPM3 w/ interrupt
  89.             _BIS_SR(  GIE);           // Enter LPM3 w/ interrupt

  90.         while(1)
  91.         {
  92.                ShowTime();
  93.                ShowPoint();
  94.         }

  95. }


  96. // Timer A0 interrupt service routine
  97. #pragma vector=TIMER0_A0_VECTOR
  98. __interrupt void Timer_A (void)
  99. {
  100.     //unsigned int i;
  101.     ClockStep++;
  102.     onQuarterSecond();
  103.     if( ClockStep >= HALFSCONDSTEP)
  104.     {
  105.         halfsecond++;
  106.         if( halfsecond==2)
  107.         {
  108.             second++;
  109.             halfsecond=0;
  110.             onEverySecond();
  111.         }
  112.         ClockStep=0;
  113.     }

  114.     if(second==60)
  115.     {
  116.         minute++;
  117.         second=0;
  118.     }else{
  119.         return;
  120.     }
  121.     if(minute==60)
  122.     {
  123.         hour++;
  124.         minute=0;
  125.     }else{
  126.         return;
  127.     }
  128.     if (hour==24)
  129.     {
  130.         day++;
  131.         hour=0;
  132.     }else{
  133.         return;
  134.     }
  135.     switch(month)
  136.     {
  137.     case 1:
  138.     case 3:
  139.     case 5:
  140.     case 7:
  141.     case 8:
  142.     case 10:
  143.     case 12:
  144.         if( day==32)
  145.         {
  146.             day=1;
  147.             month++;
  148.         }
  149.         break;
  150.     case 2:
  151.         if(year==2020||year==2024||year==2028||year==2032||year==2036||year==2040||year==2044)
  152.         {
  153.             if(day==30)
  154.             {
  155.                 day=1;
  156.                 month++;
  157.             }

  158.         }else{
  159.             if(day==29)
  160.             {
  161.                 day=1;
  162.                 month++;
  163.             }
  164.         }
  165.         break;
  166.     case 4:
  167.     case 6:
  168.     case 9:
  169.     case 11:
  170.         if( day ==31)
  171.         {
  172.             day=1;
  173.             month++;
  174.         }
  175.         break;
  176.     }
  177.     if(month==13)
  178.     {
  179.         year++;
  180.         month=1;
  181.     }

  182. }
  183. #pragma FUNC_ALWAYS_INLINE(onQuarterSecond)
  184. static inline void onQuarterSecond(void)
  185. {
  186.     if( DisplayMode== TIMERMODE)
  187.       {
  188.         if( timerstart>0)
  189.             timerstep++;
  190.         if( timerstep==TIMERSTEP)
  191.         {
  192.             timerstep=0;
  193.             timersecond++;
  194.         }



  195.           if( timersecond == 60)
  196.           {
  197.               timerminute++;
  198.               timersecond=0;
  199.           }
  200.           if( timerminute ==99)
  201.               timerminute=0;

  202.       }


  203.     if( ButtonPressed>0 &&IsSettingMode==0)
  204.     {
  205.         if( (P1IN&BUTTON1)==BUTTON1)
  206.         {
  207.             longpress1++;
  208.         }
  209.         else
  210.             longpress1=0;

  211.         if (longpress1>7)
  212.         {
  213.             button1_longpressed=1;
  214.             if( DisplayMode != TIMERMODE)
  215.             {
  216.                 oldDisplayMode=DisplayMode;
  217.                 DisplayMode = TIMERMODE;
  218.             }else
  219.             {
  220.                 clearTimer();
  221.                 DisplayMode=oldDisplayMode;
  222.             }
  223.             longpress1=0;
  224.         }



  225.     }
  226.     if( Button2Pressed>0)
  227.        {
  228.            if( (P1IN&BUTTON2)==BUTTON2)
  229.            {
  230.                longpress2++;
  231.            }
  232.            else
  233.                longpress2=0;

  234.            if (longpress2>7)
  235.            {
  236.                button2_longpressed=1;
  237.                if( IsSettingMode == 0)
  238.                {
  239.                    IsSettingMode = 1;

  240.                    SettingItem=SETTING_MINUTE;
  241.                    DisplayMode=HOURMINUTEMODE;
  242.                }else
  243.                {
  244.                    IsSettingMode = 0;
  245.                }
  246.                longpress2=0;
  247.            }



  248.        }



  249. }
  250. void clearTimer(void)
  251. {
  252.     timerstep=0;
  253.     timerminute=0;
  254.     timersecond=0;
  255.     timerstart=0;
  256. }

  257. #pragma FUNC_ALWAYS_INLINE(onEverySecond)
  258. static inline void onEverySecond(void)
  259. {

  260.     if(DisplayMode!=TIMERMODE)
  261.     {
  262.         if (ButtonPressed>0 &&IsSettingMode==0 )
  263.         {
  264.             ButtonPressed++;

  265.             if ( ButtonPressed > 10)
  266.             {
  267.                 DisplayMode = HOURMINUTEMODE;
  268.                 ButtonPressed =0;
  269.                 //buttonstatus=0;
  270.             }


  271.         }
  272.         // if(SleepCountDown>0)
  273.           //  SleepCountDown--;

  274.     }



  275. }




  276. //Port 1 Interrupt Service Routine

  277. #pragma vector=PORT1_VECTOR
  278. __interrupt void Port_1(void)
  279. {
  280.     unsigned int  isSleep;



  281.     buttonstatus=0;
  282.     ButtonPressed=0;
  283.     Button2Pressed=0;

  284.     //clear dispaly
  285.     P1OUT &= 0b11010000;
  286.     P2OUT &= 0b111111;

  287.     isSleep=SleepCountDown;
  288.     SleepCountDown=SLEEPTIME;

  289.     if( isSleep==0)
  290.     {
  291.         P1IFG =0x00;
  292.         return;

  293.     }
  294.     else
  295.     {


  296.         if ((P1IFG& BUTTON1) ==BUTTON1)
  297.         {
  298.             if( in_Debounce(BUTTON1))
  299.             {
  300.                 P1IFG =0x00;
  301.                 return;
  302.             }

  303.             ButtonPressed=1;
  304.             if( DisplayMode== TIMERMODE)
  305.             {
  306.                 if( timerstart==0)
  307.                     timerstart=1;
  308.                 else
  309.                     timerstart=0;

  310.             }
  311.             else
  312.             {
  313.                 if( IsSettingMode==1)
  314.                     SettingModeButton1();
  315.                 else
  316.                 {
  317.                     DisplayMode++;
  318.                     if( DisplayMode == DISPLAYMODECOUNT)
  319.                         DisplayMode =0;

  320.                 }


  321.             }



  322.         }
  323.         if ((P1IFG& BUTTON2)==BUTTON2 )
  324.         {
  325.             if( in_Debounce(BUTTON2))
  326.             {
  327.                 P1IFG =0x00;
  328.                 return;
  329.             }
  330.             Button2Pressed=1;
  331.             if( DisplayMode== TIMERMODE)
  332.             {
  333.                 clearTimer();

  334.             }
  335.             if( IsSettingMode ==1)
  336.                 SettingItemChange();


  337.         }

  338.     }


  339.     P1IFG =0x00;
  340. }
  341. #pragma FUNC_ALWAYS_INLINE(SettingItemChange)
  342. static inline void SettingItemChange(void)
  343. {
  344.     SettingItem++;
  345.     if( SettingItem == SETTINGMODECOUNT)
  346.         SettingItem=0;

  347.     switch(SettingItem)
  348.     {
  349.     case SETTING_SECOND:
  350.         DisplayMode= MINUTESECONDMODE;
  351.         break;
  352.     case SETTING_MINUTE:
  353.     case SETTING_HOUR:
  354.         DisplayMode= HOURMINUTEMODE;
  355.         break;
  356.     case SETTING_DAY:
  357.     case SETTING_MONTH:
  358.         DisplayMode= MONTHDAYMODE;
  359.         break;
  360.     case SETTING_YEAR:
  361.         DisplayMode= YEARMODE;
  362.         break;
  363.     }

  364. }
  365. #pragma FUNC_ALWAYS_INLINE(SettingModeButton1)
  366. static inline void SettingModeButton1(void )
  367. {
  368.     switch(SettingItem)
  369.         {
  370.         case SETTING_SECOND:
  371.             second=0;
  372.             break;
  373.         case SETTING_MINUTE:
  374.             minute++;
  375.             if( minute==60)
  376.                 minute=0;
  377.             break;
  378.         case SETTING_HOUR:
  379.             hour++;
  380.             if(hour==24)
  381.                 hour=0;
  382.             break;
  383.         case SETTING_DAY:
  384.             day++;
  385.             if( day==32)
  386.                 day=1;
  387.             break;

  388.         case SETTING_MONTH:
  389.             month++;
  390.             if(month==13)
  391.                 month=1;
  392.             break;
  393.         case SETTING_YEAR:
  394.             year++;
  395.             if( year>2040)
  396.                 year=2020;
  397.             break;
  398.         }

  399. }
  400. #pragma FUNC_ALWAYS_INLINE(onEverySecond)
  401. static inline unsigned char in_Debounce(unsigned char button)
  402. {
  403.     unsigned char ret=0;
  404.     unsigned char ledState, lastState;
  405.     unsigned int stateCount,staytoolong;
  406.     lastState=0;
  407.     stateCount=0;
  408.     staytoolong=0;

  409.     while( stateCount< 2000)
  410.     {
  411.         ledState=P1IN&button;
  412.         if( ledState==button && lastState==button)
  413.             stateCount++;
  414.         else
  415.         {
  416.             stateCount=0;
  417.             staytoolong++;
  418.             if(staytoolong>2000)
  419.             {
  420.                 ret=1;
  421.                 break;
  422.             }

  423.         }
  424.         lastState=ledState;
  425.         __delay_cycles(5);
  426.     }
  427.     return ret;
  428. }





  429. #pragma CODE_SECTION(ShowTime,".run_from_ram")
  430. void ShowTime()
  431. {

  432.     //DisplayMode = DisplayMode- DisplayMode/DISPLAYMODECOUNT*DISPLAYMODECOUNT;

  433.     switch(DisplayMode)
  434.     {
  435.     case MINUTESECONDMODE:
  436.         if( IsSettingMode==0)
  437.         {
  438.             ShowNum(0,minute/10);
  439.             ShowNum(1,minute-minute/10*10);
  440.         }
  441.         if( IsSettingMode==1 &&(ClockStep==0|ClockStep==2))
  442.             clear();
  443.         else
  444.         {
  445.             ShowNum(2,second/10);
  446.             ShowNum(3,second-second/10*10);
  447.         }
  448.         break;
  449.     case HOURMINUTEMODE:
  450.         if( IsSettingMode==1 && SettingItem==SETTING_HOUR &&(ClockStep==0|ClockStep==2))
  451.             clear();
  452.         else
  453.         {
  454.             if( hour/10 >0 ) ShowNum(0,hour/10);
  455.             ShowNum(1,hour-hour/10*10);
  456.         }

  457.         if( IsSettingMode==1 && SettingItem==SETTING_MINUTE &&(ClockStep==0|ClockStep==2))
  458.             clear();
  459.         else
  460.         {
  461.             ShowNum(2,minute/10);
  462.             ShowNum(3,minute-minute/10*10);
  463.         }
  464.         break;
  465.     case MONTHDAYMODE:
  466.         if( IsSettingMode==1 && SettingItem==SETTING_MONTH &&(ClockStep==0|ClockStep==2))
  467.             clear();
  468.         else
  469.         {
  470.             if( month/10 >0 ) ShowNum(0,month/10);
  471.             ShowNum(1,month-month/10*10);
  472.         }
  473.         if( IsSettingMode==1 && SettingItem==SETTING_DAY &&(ClockStep==0|ClockStep==2))
  474.             clear();
  475.         else
  476.         {
  477.             if( day/10>0) ShowNum(2,day/10);
  478.             ShowNum(3,day-day/10*10);
  479.         }

  480.         break;

  481.     case YEARMODE:
  482.         if( IsSettingMode==1 && SettingItem==SETTING_YEAR &&(ClockStep==0|ClockStep==2))
  483.             clear();
  484.         else
  485.             ShowDec(year);
  486.         break;
  487.     case TIMERMODE:
  488.         ShowNum(0,timerminute/10);
  489.         ShowNum(1,timerminute-timerminute/10*10);
  490.         ShowNum(2,timersecond/10);
  491.         ShowNum(3,timersecond-timersecond/10*10);
  492.         break;
  493.     default:

  494.         break;
  495.     }

  496. }

  497. void ShowDec( unsigned int d)
  498. {
  499.     unsigned char i;
  500.     i=4;
  501.     while(d>0 && i>0)
  502.     {
  503.         i--;
  504.         ShowNum(i,d-d/10*10);
  505.         d=d/10;


  506.     }

  507. }

  508. void ShowPoint()
  509. {

  510.     switch(DisplayMode){
  511.     case MINUTESECONDMODE:
  512.         if (halfsecond==0)
  513.         {
  514.             P1OUT = 0b100100;
  515.             P2OUT = 0b111111;
  516.             __delay_cycles(LOOPCOUNT);
  517.             clear();
  518.         }
  519.         break;
  520.     case HOURMINUTEMODE:
  521.     case TIMERMODE:
  522.         P1OUT = 0b0100100;
  523.         P2OUT = 0b111111;
  524.         __delay_cycles(LOOPCOUNT);
  525.         clear();
  526.         break;
  527.     case MONTHDAYMODE:
  528.     case YEARMODE:
  529.         break;
  530.     }

  531. }
  532. void clear(void)
  533. {
  534.     P1OUT &= 0b11010000;
  535.     P2OUT &= 0b111111;
  536.     __delay_cycles(CLEARLOOPCOUNT);

  537. }

  538. void ShowNum(unsigned int index, unsigned int n)
  539. {

  540.     switch ( index ){
  541.         case 0:
  542.             P1OUT |= 0b1;
  543.             break;
  544.         case 1:
  545.             P1OUT |= 0b10;
  546.             break;
  547.         case 2:
  548.             P1OUT |= 0b100;

  549.             break;
  550.         case 3:
  551.             P1OUT |= 0b1000;
  552.             break;
  553.     }
  554.     P1OUT= 0b1000000 | P1OUT;  //set P1.6 Hi
  555.     switch ( n ){

  556.         case 0:

  557.             P2OUT = ~0b11111;
  558.             break;
  559.         case 1:
  560.             P1OUT= 0b100000 | P1OUT;
  561.             P2OUT = ~0b11;
  562.             break;
  563.         case 2:

  564.             P2OUT = ~(0b1 | 0b100 | 0b1000 | 0b100000);
  565.             break;
  566.         case 3:

  567.             P2OUT = ~(0b1 | 0b10 | 0b100 | 0b100000);
  568.             break;
  569.         case 4:
  570.             P1OUT= 0b100000 | P1OUT;
  571.             P2OUT = ~(0b10000 | 0b1 | 0b10 | 0b100000);
  572.             break;
  573.         case 5:

  574.             P2OUT = ~(0b10000 | 0b100000 | 0b10 | 0b100);
  575.             break;
  576.         case 6:

  577.             P2OUT = ~0b111110;
  578.             break;
  579.         case 7:

  580.             P2OUT = ~0b11;
  581.             break;
  582.         case 8:

  583.             P2OUT = ~0b111111;
  584.             break;
  585.         case 9:

  586.             P2OUT = ~0b110111;;
  587.             break;
  588.     }


  589.     __delay_cycles(LOOPCOUNT);
  590.     //    Clear
  591.     clear();
  592. }
复制代码



回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 22:58:27 | 显示全部楼层
单片机编程过程,都是从少到多,一点点的实现的

中间遇到不同的问题,都在网上找到答案,有的却不能,比如这一句

   if( (P1IN&BUTTON1)==BUTTON1)

判断这个按钮有没有被按下

之前少了一对括号
   if( P1IN&BUTTON1==BUTTON1)

自己认为有没有括号都一样啊,所以出现了无法判断按钮按下的问题

位操作的优先权不是很高的吗?

这个括号的缺失,阻碍了好久好久,各种做实验,各种尝试,最后才发现这里的括号这么重要
回复 支持 反对

使用道具 举报

发表于 2020-11-8 23:25:09 | 显示全部楼层
这几天学运算放大器检测双向电流搜到一个文章,用的居然是MSP430单片机,居然内置了4个运算放大器:praise:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 23:25:19 | 显示全部楼层
主要编程思路,

主循环显示数字和小点

而显示的内容,由时钟中断和按钮引发的中断控制

显示的内容分4+1种模式
分秒,时分,月日,年,还有一个特别的计时器
按钮1,单按循环显示四个时间模式,长按进入计时器,单按按钮1,启动停止计时器,按钮2清零计时器

按钮2,长按进入设置,单按按钮2循环进入设置分,秒,时,日,月,年。按钮1,单按循环增加各种模式下的数字,最高年份2040


时间是由时钟中断驱动的,设置了时钟中断每秒钟产生四次,而不是一秒一次,是为了控制闪烁的速度,可以让两个小点开关两个状态,在设置的时候,让正在设置的数字每秒闪烁两次

原来还设计了自动休眠功能,关闭LED显示,进入休眠,只处理时间中断,可以大幅度降低耗电,唤醒需要按一下按钮才能看到时间,后来想想没必要

测量了一下,LED显示还是挺费电的,整体耗电大约最大25mA,最小15mA, AAA电池供电,容量大约700mAh, 算下来也就用一天多,也就是个玩具了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 00:08:10 | 显示全部楼层
我现在才想明白一件事,限流电阻白加了,完全可以限制LED点亮的时间,来减少电流,就可以省电了

#define LOOPCOUNT (2000)   //led点亮的延迟周期数
#define CLEARLOOPCOUNT (1000) //led熄灭的延迟周期数


改成,
#define LOOPCOUNT (200)
#define CLEARLOOPCOUNT (5000)

LED亮度就降低了,去掉限流电阻,也没有明显的闪烁,
当然亮度还可以调高一些
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 01:32:53 | 显示全部楼层
发现另外一个问题,显示数字1,最亮,最暗当然是8

显示不同数字,亮度不一致的问题,就在于,不同数字点亮延迟时间是一样的,笔画多的就暗,笔画少的就亮一些

那就改成不同的数字,延迟的时间做成跟笔画数相关的,笔画少,显示时间短
    switch ( n ){

        case 0:

            P2OUT = ~0b11111;
            __delay_cycles(LOOPCOUNT-LOOPCOUNT/7);
            break;
        case 1:
            P1OUT= 0b100000 | P1OUT;
            P2OUT = ~0b11;
            __delay_cycles(2*LOOPCOUNT/7);
            break;
        case 2:

            P2OUT = ~(0b1 | 0b100 | 0b1000 | 0b100000);
            __delay_cycles(LOOPCOUNT-2*LOOPCOUNT/7);
            break;
        case 3:

            P2OUT = ~(0b1 | 0b10 | 0b100 | 0b100000);
            __delay_cycles(LOOPCOUNT-2*LOOPCOUNT/7);
            break;
        case 4:
            P1OUT= 0b100000 | P1OUT;
            P2OUT = ~(0b10000 | 0b1 | 0b10 | 0b100000);
            __delay_cycles(LOOPCOUNT-3*LOOPCOUNT/7);
            break;
        case 5:

            P2OUT = ~(0b10000 | 0b100000 | 0b10 | 0b100);
            __delay_cycles(LOOPCOUNT-2*LOOPCOUNT/7);
            break;
        case 6:

            P2OUT = ~0b111110;
            __delay_cycles(LOOPCOUNT-LOOPCOUNT/7);
            break;
        case 7:

            P2OUT = ~0b11;
            __delay_cycles(LOOPCOUNT-4*LOOPCOUNT/7);
            break;
        case 8:

            P2OUT = ~0b111111;
            __delay_cycles(LOOPCOUNT);
            break;
        case 9:

            P2OUT = ~0b110111;;
            __delay_cycles(LOOPCOUNT-LOOPCOUNT/7);
            break;
    }


回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 02:14:16 | 显示全部楼层
#define LOOPCOUNT (700)
#define CLEARLOOPCOUNT (4000)

经过调整以后,整体耗电量,最高只有6mA了,显示亮度可以接受
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 05:18:40 | 显示全部楼层
完了一下超低耗电模式,

进入低耗电模式3,
LPM3;
推出,对应的就是
LPM3_EXIT;
就这么简单,

在60秒倒数后进入低耗电模式

按钮中断加入唤醒到正常模式


超低耗电模式,仅仅1.5微安左右,时钟还在继续走
唤醒以后,8mA,相差三个数量级

用一个四位万用表没量出来,用了一个五位的表,才看到这么低的电流
印象深刻啊

回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-20 16:19 , Processed in 0.296400 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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