关于launchpad扩展板的按键以及显示问题

2019-03-24 09:57发布

我现在设计了一个程序想通过扩展板上的4个按键来控制lcd屏幕输出数值大小,key1用来进行每一位的加,key用来执行每一位的减,key3用来开始开始更改或者更改完成,key4用来切换需要修改的位。然后theunit_buffer用来缓存个位上的数值,decade_buffer用来缓存十位数的数值,db则是以后想给dac赋值用的参数。在按下“开始更改”按键之LCD屏会在需要修改的对应位后面显影一个小数点,如果通过key4更改需要修改的位,则点的位置也会改变,再次按下“开始修改”按键(key3)之后,小数点会消影。后现在我将下面代码烧写到单片机,但是它只能执行初始化,显示00dB,对于任何按键操作都没有反应,比如我按key3(开始更改按键),并不会有小数点出现在LCD上,之后按下key1,key2也没有勇,LCD上的数值不会有改变。现在想向各路大师请教一下,看看能不能发现我的程序有什么问题。先谢过!
下面是程序:
  1. #include <msp430.h>
  2. #include"TCA6416A.h"
  3. #include"HT1621.h"
  4. #include"LCD_128.h"

  5. #define myMCLK                        16000000


  6. int flag = 0;//更改标志位
  7. int theunit_buffer = 0, decade_buffer = 0;//各位缓存和十位缓存
  8. int db = 0;//放大倍数
  9. int position = 0;//位置标示

  10. void WDT_init();
  11. void I2C_IODect();                                 //检测事件确实发生了

  12. void main(void)
  13. {
  14.         WDTCTL = WDTPW + WDTHOLD;        //关狗
  15.         P1DIR = 0;
  16.         P2DIR = 0;

  17.     BCSCTL1 = CALBC1_16MHZ;      /* Set DCO to16MHz */
  18.     DCOCTL = CALDCO_16MHZ;
  19.     TCA6416A_Init();            // 初始化IO扩展口
  20.         HT1621_init();                        // 初始化lcd_128
  21.     _enable_interrupts();        //使能总中断
  22.     //----提示初始化成功----
  23.             PinOUT(0,1);           // 指定0号管脚输出为1
  24.             PinOUT(1,0);           // 指定1号管脚输出为0
  25.             PinOUT(2,1);           // 指定2号管脚输出为1
  26.             PinOUT(3,0);           // 指定3号管脚输出为0
  27.             PinOUT(4,1);           // 指定4号管脚输出为1
  28.             PinOUT(5,0);           // 指定5号管脚输出为0
  29.             PinOUT(6,1);           // 指定6号管脚输出为1
  30.             PinOUT(7,0);           // 指定7号管脚输出为0

  31.         while(1)
  32.         {
  33.                 PinIN();
  34.                 I2C_IODect();
  35.                 LCD_DisplayDigit(theunit_buffer, 5);
  36.                 LCD_DisplayDigit(decade_buffer, 4);
  37.             LCD_DisplaySeg(_LCD_dB);
  38.                 HT1621_Reflash(LCD_Buffer);
  39.                 _bis_SR_register(LPM0_bits);//将SR寄存器例LPM0_bits对应的位置1

  40.         }
  41. }
  42. /**********I2C扩展IO中断事件处理函数***************/
  43. void I2C_IO10_Onclick()//加
  44. {
  45.         if (flag != 0)
  46.         {
  47.                 if (position == 0)
  48.                 {
  49.                         theunit_buffer++;
  50.                         if(theunit_buffer==10) {theunit_buffer=0;}
  51.                 }
  52.                 if (position == 1)
  53.                 {
  54.                         decade_buffer++;
  55.                         if(decade_buffer==10){decade_buffer=0;}
  56.                 }
  57.         }
  58. }
  59. void I2C_IO11_Onclick()//减
  60. {
  61.         if (flag != 0)
  62.         {
  63.                 if (position == 0)
  64.                 {
  65.                         theunit_buffer--;
  66.                         if(theunit_buffer<0){theunit_buffer=9;}
  67.                 }
  68.                 if (position == 1)
  69.                 {
  70.                         decade_buffer--;
  71.                         if(decade_buffer<0){decade_buffer=9;}
  72.                 }
  73.         }
  74. }
  75. void I2C_IO12_Onclick()//确认|更改
  76. {
  77.         if (flag == 0)//第一次按下
  78.         {
  79.                 flag++;
  80.                 theunit_buffer = db % 10;
  81.                 decade_buffer = db/10;
  82.                 LCD_DisplaySeg(60);

  83.         }
  84.         else//写入修改并复位
  85.         {
  86.                 db = decade_buffer * 10 + theunit_buffer;
  87.                 flag = 0;
  88.                 position = 0;
  89.                 LCD_ClearSeg(52);
  90.                 LCD_ClearSeg(60);
  91.         }
  92. }
  93. void I2C_IO13_Onclick()//换位
  94. {
  95.         if (flag != 0)
  96.         {
  97.                 position ^=1;
  98.                 if(position==0)
  99.                 {LCD_ClearSeg(52);LCD_DisplaySeg(60);}
  100.                 else if(position==1)
  101.                 {LCD_ClearSeg(60);LCD_DisplaySeg(52);}
  102.         }

  103. }
  104. void I2C_IODect()                                         //检测事件确实发生了
  105. {
  106.         static unsigned char KEY_Past=0,KEY_Now=0;
  107.         KEY_Past=KEY_Now;
  108.         //----判断I2C_IO10所连的KEY1按键是否被按下------
  109.         if((TCA6416A_InputBuffer&BIT8) == BIT8)
  110.                 KEY_Now |=BIT0;
  111.         else
  112.                 KEY_Now &=~BIT0;
  113.         if(((KEY_Past&BIT0)==BIT0)&&(KEY_Now&BIT0) !=BIT0)
  114.                 I2C_IO10_Onclick();
  115.         //----判断I2C_IO11所连的KEY2按键是否被按下------
  116.         if((TCA6416A_InputBuffer&BIT9)== BIT9)
  117.                 KEY_Now |=BIT1;
  118.         else
  119.                 KEY_Now &=~BIT1;
  120.         if(((KEY_Past&BIT1)==BIT1)&&(KEY_Now&BIT1)!=BIT1)
  121.                 I2C_IO11_Onclick();
  122.         //----判断I2C_IO12所连的KEY3按键是否被按下------
  123.         if((TCA6416A_InputBuffer&BITA) == BITA)
  124.                 KEY_Now |=BIT2;
  125.         else
  126.                 KEY_Now &=~BIT2;
  127.         if(((KEY_Past&BIT2)==BIT2)&&(KEY_Now&BIT2) ==0)
  128.         {
  129.                 I2C_IO12_Onclick();
  130.         }
  131.         //----判断I2C_IO13所连的KEY4按键是否被按下------
  132.         if((TCA6416A_InputBuffer&BITB) ==  BITB)
  133.                 KEY_Now |=BIT3;
  134.         else
  135.                 KEY_Now &=~BIT3;
  136.         if(((KEY_Past&BIT3) == BIT3)&& (KEY_Now&BIT3) == 0)    //
  137.         {
  138.                 I2C_IO13_Onclick();
  139.         }
  140. }
复制代码 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
wlmqysh
1楼-- · 2019-03-24 12:19
< 然后这个程序是我在教材上一个例程的基础上修改的,下面附上例程代码:
  1. /*警告:由于G2 LaunchPad上的LED2使用了P1.6(I2C引脚),所以所有涉及到I2C的实验都必须把P1.6跳线拔除,包含本例程!
  2. * main.c
  3. */
  4. #include"MSP430G2553.h"
  5. #include"TCA6416A.h"

  6. void WDT_init();
  7. void I2C_IODect()        ;                                 //检测事件确实发生了

  8. void main(void)
  9. {
  10.         WDTCTL = WDTPW + WDTHOLD;        //关狗
  11.     BCSCTL1 = CALBC1_16MHZ;      /* Set DCO to 8MHz */
  12.     DCOCTL = CALDCO_16MHZ;
  13.     TCA6416A_Init();                        // 初始化IO扩展口
  14. //----提示初始化成功----
  15.         PinOUT(0,1);           // 指定0号管脚输出为0
  16.         PinOUT(1,0);           // 指定1号管脚输出为0
  17.         PinOUT(2,1);           // 指定0号管脚输出为0
  18.         PinOUT(3,0);           // 指定1号管脚输出为0
  19.         PinOUT(4,1);           // 指定0号管脚输出为0
  20.         PinOUT(5,0);           // 指定1号管脚输出为0
  21.         PinOUT(6,1);           // 指定0号管脚输出为0
  22.         PinOUT(7,0);           // 指定1号管脚输出为0
  23.         WDT_init();
  24.         while(1)
  25.         {
  26.                 PinIN();
  27.                  I2C_IODect();
  28.                  _bis_SR_register(LPM0_bits);
  29.         }


  30. }
  31. /********WDT初始化函数**********/
  32. void WDT_init()
  33. {
  34.         //-----设定WDT为-----------
  35.         WDTCTL=WDT_ADLY_16;
  36.         //-----WDT中断使能----------------------
  37.     IE1 |= WDTIE;
  38. }

  39. /***********WDT定时中断函数*************/
  40. #pragma vector=WDT_VECTOR
  41. __interrupt void watchdog_timer(void)
  42. {
  43. //        PinIN();
  44. //         I2C_IODect();
  45. __bic_SR_register_on_exit(LPM0_bits );
  46. }
  47. /**********I2C扩展IO中断事件处理函数***************/
  48. void I2C_IO10_Onclick()
  49. {
  50.         static unsigned char turn = 1;
  51.         turn ^= BIT0;
  52.         PinOUT(0,turn);         //指定0号管脚输出为0&1
  53.         PinOUT(1,turn);         //指定1号管脚输出为0&1
  54. }
  55. void I2C_IO11_Onclick()
  56. {
  57.         static unsigned char turn = 1;
  58.         turn ^= BIT0;
  59.         PinOUT(2,turn);         //指定2号管脚输出为0&1
  60.         PinOUT(3,turn);         //指定3号管脚输出为0&1
  61. }
  62. void I2C_IO12_Onclick()
  63. {
  64.         static unsigned char turn = 1;
  65.         turn ^= BIT0;
  66.         PinOUT(5,turn);         //指定5号管脚输出为0&1
  67.         PinOUT(4,turn);         //指定4号管脚输出为0&1
  68. }
  69. void I2C_IO13_Onclick()
  70. {
  71.         static unsigned char turn = 1;
  72.         turn ^= BIT0;
  73.         PinOUT(6,turn);         //指定6号管脚输出为0&1
  74.         PinOUT(7,turn);         //指定7号管脚输出为0&1
  75. }
  76. void I2C_IODect()                                         //检测事件确实发生了
  77. {
  78.         static unsigned char KEY_Past=0,KEY_Now=0;
  79.         KEY_Past=KEY_Now;
  80.         //----判断I2C_IO10所连的KEY1按键是否被按下------
  81.         if((TCA6416A_InputBuffer&BIT8) == BIT8)
  82.                 KEY_Now |=BIT0;
  83.         else
  84.                 KEY_Now &=~BIT0;
  85.         if(((KEY_Past&BIT0)==BIT0)&&(KEY_Now&BIT0) !=BIT0)
  86.                 I2C_IO10_Onclick();
  87.         //----判断I2C_IO11所连的KEY2按键是否被按下------
  88.         if((TCA6416A_InputBuffer&BIT9)== BIT9)
  89.                 KEY_Now |=BIT1;
  90.         else
  91.                 KEY_Now &=~BIT1;
  92.         if(((KEY_Past&BIT1)==BIT1)&&(KEY_Now&BIT1)!=BIT1)
  93.                 I2C_IO11_Onclick();
  94.         //----判断I2C_IO12所连的KEY3按键是否被按下------
  95.         if((TCA6416A_InputBuffer&BITA) == BITA)
  96.                 KEY_Now |=BIT2;
  97.         else
  98.                 KEY_Now &=~BIT2;
  99.         if(((KEY_Past&BIT2)==BIT2)&&(KEY_Now&BIT2) ==0)
  100.         {
  101.                 I2C_IO12_Onclick();
  102.         }
  103.         //----判断I2C_IO13所连的KEY4按键是否被按下------
  104.         if((TCA6416A_InputBuffer&BITB) ==  BITB)
  105.                 KEY_Now |=BIT3;
  106.         else
  107.                 KEY_Now &=~BIT3;
  108.         if(((KEY_Past&BIT3) == BIT3)&& (KEY_Now&BIT3) == 0)    //
  109.         {
  110.                 I2C_IO13_Onclick();
  111.         }
  112. }
复制代码
再就是我把例程烧写到单片机上之后按按键也不会有什么反应,觉得很奇怪
wlmqysh
2楼-- · 2019-03-24 12:42
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章