关于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
2019-03-24 12:42
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章