MSP430 X22X4学习板<br />4*4键盘在自己焊的两个七段数码管显示<br /><br /><br /><br />#include <msp430x22x4.h><br />int tmp;<br />typedef unsigned int uchar;<br />typedef unsigned int uint;<br />uchar cnt = 0; //位码<br />uchar scandata[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x07,0x75,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};<br />/***********全局变量********************/<br />int key_pressed; //按键是否按下 1--是, 0--否<br />int key_val; //存放键值<br />int key_flag; //是否放开 1--是, 0--否<br />int tmp1;<br />int row;<br />int col;<br />int tmp1;<br />int tmp2;<br />//键盘逻辑键值与程序计算键值的映射<br />uchar key_map[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};<br />uchar Dispbuf[2];<br /><br />/****************<br />初始化键盘扫描的io端口<br />*********************/<br />void init_keypad(void)<br />{<br />P1DIR=0xf0;<br />P1OUT |=0xf0;<br />key_pressed =0;<br />key_flag=0;<br />key_val=0;<br />}<br /><br />void main(void)<br />{<br />WDTCTL=WDT_ADLY_1_9;//看门狗计时 1、9毫秒中断<br />IE1 |=WDTIE;<br />P4DIR=0xff;<br />P3DIR=0xff;<br />P4OUT=0x00;<br />P3OUT=0xff;<br /><br />_EINT(); //全局中断<br />init_keypad();<br />while(1)<br />{<br /><br />P1OUT &=0x00;//设置p1out全为0,等待按键输入<br />tmp = P1IN;//获取p1in<br />if((key_pressed ==0x00)&&((tmp &0x0f)<0x0f))//如有键按下<br />{<br />key_pressed = 1;//如有键按下,设置key_press标志为一<br />{<br />uint tmp;<br />for(tmp = 12000;tmp>0;tmp--);<br />}<br /><br /><br />tmp1=0x80;<br />for(row =0;row<4;row++) //行扫描<br />{<br />P1OUT=0xf0; //p1.4--1.7全输1<br />P1OUT -= tmp1; //p1.4--1.7输出四位有一个为0<br />tmp1>>=1;<br />if((P1IN & 0x0F)<0x0f) //是否p1in的p1.0--p1.3有一个0<br /><br />{<br />tmp2 = 0x01; //tmp2检测哪一位为0<br />for(col = 0;col < 4;col++) //列检测<br />{<br />if((P1IN & tmp2)==0x00)//是否是该列 为0是<br />{<br />key_val = key_map[row*4 + col];//获取键值<br />return; // 退出循环<br />}<br />tmp2 <<=1; //tmp2右移一位<br /><br />}<br />}<br />}<br />//check_key();//调用它,获取键值<br />}<br />else if ((key_pressed == 1)&&((tmp &0x0f)==0x0f))//按键已放<br />{<br />key_pressed = 0;//清除key_press标示<br />key_flag = 1; //设置key_flag标志<br />}<br />else<br />{<br />_NOP();<br />}<br /><br />if (key_flag==1)<br />{<br />key_flag=0;<br />Dispbuf[0]=key_val /10;<br />Dispbuf[1]=key_val %10;<br />}<br />}<br />}<br /><br />#pragma vector=WDT_VECTOR<br />__interrupt void watchdog_timer(void)<br />{<br />P3OUT=0xff;<br />P4OUT=scandata[Dispbuf][cnt]];//段选<br />P3OUT &=~(1<<(cnt));//位选<br />cnt++; //位计数变量在0 1间循环<br />if (cnt==2) cnt=0;<br />}<br /><br />谢谢了 <br /> |
|