我现在设计了一个程序想通过扩展板上的4个按键来控制lcd屏幕输出数值大小,key1用来进行每一位的加,key用来执行每一位的减,key3用来开始开始更改或者更改完成,key4用来切换需要修改的位。然后theunit_buffer用来缓存个位上的数值,decade_buffer用来缓存十位数的数值,db则是以后想给dac赋值用的参数。在按下“开始更改”按键之LCD屏会在需要修改的对应位后面显影一个小数点,如果通过key4更改需要修改的位,则点的位置也会改变,再次按下“开始修改”按键(key3)之后,小数点会消影。后现在我将下面代码烧写到单片机,但是它只能执行初始化,显示00dB,对于任何按键操作都没有反应,比如我按key3(开始更改按键),并不会有小数点出现在LCD上,之后按下key1,key2也没有勇,LCD上的数值不会有改变。现在想向各路大师请教一下,看看能不能发现我的程序有什么问题。先谢过!
下面是程序:
- #include <msp430.h>
- #include"TCA6416A.h"
- #include"HT1621.h"
- #include"LCD_128.h"
- #define myMCLK 16000000
- int flag = 0;//更改标志位
- int theunit_buffer = 0, decade_buffer = 0;//各位缓存和十位缓存
- int db = 0;//放大倍数
- int position = 0;//位置标示
- void WDT_init();
- void I2C_IODect(); //检测事件确实发生了
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; //关狗
- P1DIR = 0;
- P2DIR = 0;
- BCSCTL1 = CALBC1_16MHZ; /* Set DCO to16MHz */
- DCOCTL = CALDCO_16MHZ;
- TCA6416A_Init(); // 初始化IO扩展口
- HT1621_init(); // 初始化lcd_128
- _enable_interrupts(); //使能总中断
- //----提示初始化成功----
- PinOUT(0,1); // 指定0号管脚输出为1
- PinOUT(1,0); // 指定1号管脚输出为0
- PinOUT(2,1); // 指定2号管脚输出为1
- PinOUT(3,0); // 指定3号管脚输出为0
- PinOUT(4,1); // 指定4号管脚输出为1
- PinOUT(5,0); // 指定5号管脚输出为0
- PinOUT(6,1); // 指定6号管脚输出为1
- PinOUT(7,0); // 指定7号管脚输出为0
- while(1)
- {
- PinIN();
- I2C_IODect();
- LCD_DisplayDigit(theunit_buffer, 5);
- LCD_DisplayDigit(decade_buffer, 4);
- LCD_DisplaySeg(_LCD_dB);
- HT1621_Reflash(LCD_Buffer);
- _bis_SR_register(LPM0_bits);//将SR寄存器例LPM0_bits对应的位置1
- }
- }
- /**********I2C扩展IO中断事件处理函数***************/
- void I2C_IO10_Onclick()//加
- {
- if (flag != 0)
- {
- if (position == 0)
- {
- theunit_buffer++;
- if(theunit_buffer==10) {theunit_buffer=0;}
- }
- if (position == 1)
- {
- decade_buffer++;
- if(decade_buffer==10){decade_buffer=0;}
- }
- }
- }
- void I2C_IO11_Onclick()//减
- {
- if (flag != 0)
- {
- if (position == 0)
- {
- theunit_buffer--;
- if(theunit_buffer<0){theunit_buffer=9;}
- }
- if (position == 1)
- {
- decade_buffer--;
- if(decade_buffer<0){decade_buffer=9;}
- }
- }
- }
- void I2C_IO12_Onclick()//确认|更改
- {
- if (flag == 0)//第一次按下
- {
- flag++;
- theunit_buffer = db % 10;
- decade_buffer = db/10;
- LCD_DisplaySeg(60);
- }
- else//写入修改并复位
- {
- db = decade_buffer * 10 + theunit_buffer;
- flag = 0;
- position = 0;
- LCD_ClearSeg(52);
- LCD_ClearSeg(60);
- }
- }
- void I2C_IO13_Onclick()//换位
- {
- if (flag != 0)
- {
- position ^=1;
- if(position==0)
- {LCD_ClearSeg(52);LCD_DisplaySeg(60);}
- else if(position==1)
- {LCD_ClearSeg(60);LCD_DisplaySeg(52);}
- }
- }
- void I2C_IODect() //检测事件确实发生了
- {
- static unsigned char KEY_Past=0,KEY_Now=0;
- KEY_Past=KEY_Now;
- //----判断I2C_IO10所连的KEY1按键是否被按下------
- if((TCA6416A_InputBuffer&BIT8) == BIT8)
- KEY_Now |=BIT0;
- else
- KEY_Now &=~BIT0;
- if(((KEY_Past&BIT0)==BIT0)&&(KEY_Now&BIT0) !=BIT0)
- I2C_IO10_Onclick();
- //----判断I2C_IO11所连的KEY2按键是否被按下------
- if((TCA6416A_InputBuffer&BIT9)== BIT9)
- KEY_Now |=BIT1;
- else
- KEY_Now &=~BIT1;
- if(((KEY_Past&BIT1)==BIT1)&&(KEY_Now&BIT1)!=BIT1)
- I2C_IO11_Onclick();
- //----判断I2C_IO12所连的KEY3按键是否被按下------
- if((TCA6416A_InputBuffer&BITA) == BITA)
- KEY_Now |=BIT2;
- else
- KEY_Now &=~BIT2;
- if(((KEY_Past&BIT2)==BIT2)&&(KEY_Now&BIT2) ==0)
- {
- I2C_IO12_Onclick();
- }
- //----判断I2C_IO13所连的KEY4按键是否被按下------
- if((TCA6416A_InputBuffer&BITB) == BITB)
- KEY_Now |=BIT3;
- else
- KEY_Now &=~BIT3;
- if(((KEY_Past&BIT3) == BIT3)&& (KEY_Now&BIT3) == 0) //
- {
- I2C_IO13_Onclick();
- }
- }
复制代码
此帖出自
小平头技术问答
- /*警告:由于G2 LaunchPad上的LED2使用了P1.6(I2C引脚),所以所有涉及到I2C的实验都必须把P1.6跳线拔除,包含本例程!
- * main.c
- */
- #include"MSP430G2553.h"
- #include"TCA6416A.h"
- void WDT_init();
- void I2C_IODect() ; //检测事件确实发生了
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; //关狗
- BCSCTL1 = CALBC1_16MHZ; /* Set DCO to 8MHz */
- DCOCTL = CALDCO_16MHZ;
- TCA6416A_Init(); // 初始化IO扩展口
- //----提示初始化成功----
- PinOUT(0,1); // 指定0号管脚输出为0
- PinOUT(1,0); // 指定1号管脚输出为0
- PinOUT(2,1); // 指定0号管脚输出为0
- PinOUT(3,0); // 指定1号管脚输出为0
- PinOUT(4,1); // 指定0号管脚输出为0
- PinOUT(5,0); // 指定1号管脚输出为0
- PinOUT(6,1); // 指定0号管脚输出为0
- PinOUT(7,0); // 指定1号管脚输出为0
- WDT_init();
- while(1)
- {
- PinIN();
- I2C_IODect();
- _bis_SR_register(LPM0_bits);
- }
- }
- /********WDT初始化函数**********/
- void WDT_init()
- {
- //-----设定WDT为-----------
- WDTCTL=WDT_ADLY_16;
- //-----WDT中断使能----------------------
- IE1 |= WDTIE;
- }
- /***********WDT定时中断函数*************/
- #pragma vector=WDT_VECTOR
- __interrupt void watchdog_timer(void)
- {
- // PinIN();
- // I2C_IODect();
- __bic_SR_register_on_exit(LPM0_bits );
- }
- /**********I2C扩展IO中断事件处理函数***************/
- void I2C_IO10_Onclick()
- {
- static unsigned char turn = 1;
- turn ^= BIT0;
- PinOUT(0,turn); //指定0号管脚输出为0&1
- PinOUT(1,turn); //指定1号管脚输出为0&1
- }
- void I2C_IO11_Onclick()
- {
- static unsigned char turn = 1;
- turn ^= BIT0;
- PinOUT(2,turn); //指定2号管脚输出为0&1
- PinOUT(3,turn); //指定3号管脚输出为0&1
- }
- void I2C_IO12_Onclick()
- {
- static unsigned char turn = 1;
- turn ^= BIT0;
- PinOUT(5,turn); //指定5号管脚输出为0&1
- PinOUT(4,turn); //指定4号管脚输出为0&1
- }
- void I2C_IO13_Onclick()
- {
- static unsigned char turn = 1;
- turn ^= BIT0;
- PinOUT(6,turn); //指定6号管脚输出为0&1
- PinOUT(7,turn); //指定7号管脚输出为0&1
- }
- void I2C_IODect() //检测事件确实发生了
- {
- static unsigned char KEY_Past=0,KEY_Now=0;
- KEY_Past=KEY_Now;
- //----判断I2C_IO10所连的KEY1按键是否被按下------
- if((TCA6416A_InputBuffer&BIT8) == BIT8)
- KEY_Now |=BIT0;
- else
- KEY_Now &=~BIT0;
- if(((KEY_Past&BIT0)==BIT0)&&(KEY_Now&BIT0) !=BIT0)
- I2C_IO10_Onclick();
- //----判断I2C_IO11所连的KEY2按键是否被按下------
- if((TCA6416A_InputBuffer&BIT9)== BIT9)
- KEY_Now |=BIT1;
- else
- KEY_Now &=~BIT1;
- if(((KEY_Past&BIT1)==BIT1)&&(KEY_Now&BIT1)!=BIT1)
- I2C_IO11_Onclick();
- //----判断I2C_IO12所连的KEY3按键是否被按下------
- if((TCA6416A_InputBuffer&BITA) == BITA)
- KEY_Now |=BIT2;
- else
- KEY_Now &=~BIT2;
- if(((KEY_Past&BIT2)==BIT2)&&(KEY_Now&BIT2) ==0)
- {
- I2C_IO12_Onclick();
- }
- //----判断I2C_IO13所连的KEY4按键是否被按下------
- if((TCA6416A_InputBuffer&BITB) == BITB)
- KEY_Now |=BIT3;
- else
- KEY_Now &=~BIT3;
- if(((KEY_Past&BIT3) == BIT3)&& (KEY_Now&BIT3) == 0) //
- {
- I2C_IO13_Onclick();
- }
- }
复制代码再就是我把例程烧写到单片机上之后按按键也不会有什么反应,觉得很奇怪
一周热门 更多>