msp430 数码管 key 中断 轮询
仿真见我的上传资源
/******************************************************************
* 实验名称:IO特性(MSP430F249)
*
* 实验说明:
* 通设置系统主时钟(MCLK=8Mhz ) 、辅助时钟(ACLK=8Mhz )、
* 子系统时钟(SMCLK=8Mhz )
* 编译软件:Embedded Workbench 5.3
******************************************************************/
#include #define uchar unsigned char #define uint unsigned int void delayms(); uchar key = 0; uchar table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar key_table[4][4] = { 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}; // 键值编码,对应一个4×4 矩阵 uchar position[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar num_table[8]= {0,0,0,0,0,0,0,0}; uchar row_table[4]= {0xef,0xdf,0xbf,0x7f}; void show(uchar pos,uchar num) { P4OUT = 0x00; // tobe all turn off P6OUT |= 0x40; // DUAN 1 P4OUT = table[num]; //DUAN NUM P6OUT &= 0XBF; // DUAN 0 P4OUT = 0XFF; P5OUT |= 0X20; P4OUT &= position[pos]; P5OUT &= 0XDF; } uchar key_scan(int num) { uchar line = 0,temp = 0; P1OUT = row_table[num]; temp = P1IN&0x0f; if(temp != 0x0f) { delayms(10); temp =P1IN&0x0f; if(temp != 0x0f) { while(temp ==0x0f){temp =P1IN&0x0f;} //wait button off switch(temp) { case 0x0e: line = 0;break; case 0x0d: line = 1;break; case 0x0b: line = 2;break; case 0x07: line = 3;break; } return key_table[num][line]; } return 0; } return 0; } uchar Key_scan() { uchar i=0; i = key_scan(0); if(i != 0) return i; i = key_scan(1); if(i != 0) return i; i = key_scan(2); if(i != 0) return i; i = key_scan(3); return i; } void delayms(uint t) { uint i; while(t--) for(i=1330;i>0;i--);//进过参数的调整 } void main(void) { uchar i=0,key1=0; P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0XFF; P3DIR = 0XFF;P3OUT = 0XFF; P4DIR = 0XFF;P4OUT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; P6DIR |= 0X40; // p6^6 output P5DIR |=0X20; // P5^5 OUTPUT P4DIR = 0XFF; // P4 OUTPUT P1SEL = 0; // P1DIR = 0xF0; //p1.0--p1.3 IN ,p1.4--p1.7 OUT P1OUT |= 0XF0; P1IE |= 0x08; P1IES |= 0X08; // P1IFG &= ~0x08; _EINT(); WDTCTL=WDTPW + WDTHOLD; // 关闭看门狗 /*while(1) { show(0,key); delayms(10); //按键中断测试程序 }*/ /*轮询按键测试程序 while(1) { i = key_scan(0); if(i!=0) key1 = i; show(0,key1); }*/ } #pragma vector = PORT1_VECTOR __interrupt void PORT1_ISR(void) { key++; if(key == 9) key = 0; P1IFG &= ~0x08; return ; }
上一篇:msp430的中断优先级和中断嵌套(及容易理解错误的说明)
下一篇:MSP430F5438中断函数两种编写方法
推荐阅读最新更新时间:2024-11-11 04:47
设计资源 培训 开发板 精华推荐
- EVAL-AD1953EB,家庭影院 24 位音频处理器 AD1953 评估板
- PCB拼装小汽车
- ANT7-M24LR16E,用于 M24LR16E-R 双接口 EEPROM 的 15 mm x 15 mm 双层天线参考板
- LTC3806 反激式控制器改善了多输出应用的交叉调节
- EVAL-AD5326DBZ,用于 AD5326 12 位、四通道、电压输出数模转换器 (DAC) 的评估板
- 选择MAXQ2000微控制器和MAX1132 ADC接口的SPI时钟模式
- S12XD,16 位汽车微控制器评估板
- LDK130M18R 1.8V、300mA 低静态电流极低噪声 LDO 的典型应用可调版本电路
- 使用 LT1394、超高速、单电源比较器的 45MHz 单电源自适应触发器
- 使用具有最大功率点跟踪功能的 LTC4162IUFD-L42 太阳能供电 36 节 3.2A 充电器的典型应用