⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 MSP430子程序集
💻 C
字号:
//功能:阵列式按键键码读取(0-15),读取的键码用数码管显示出来
#include "msp430x14x.h"
#define   SHUMA_PORT_DIR  P5DIR//数码管数据口
#define   SHUMA_PORT_OUT  P5OUT
#define   SHUMA_1_LOW     P6OUT&=~BIT6//开数码管的第一位P6.6口控制数码管的第一位
#define   SHUMA_1_HIGH    P6OUT|=BIT6//灭第一位数码管
#define   SHUMA_2_LOW     P6OUT&=~BIT5//开数码管的第二位
#define   SHUMA_2_HIGH    P6OUT|=BIT5//灭数码管的第二位
#define   SHUMA_3_LOW     P6OUT&=~BIT4//开数码管的第三位
#define   SHUMA_3_HIGH    P6OUT|=BIT4//灭数码管的第三位
#define   SHUMA_4_LOW     P6OUT&=~BIT0//开数码管的第四位
#define   SHUMA_4_HIGH    P6OUT|=BIT0//灭数码管的第四位
//*****************************************************************************
#define   KEY_SEL         P1SEL//阵列式按键控制口的定义,方便以后修改程序
#define   KEY_IN          P1IN
#define   KEY_OUT         P1OUT
#define   KEY_DIR         P1DIR

void int_clk();//时钟初始化子程序声明
void delay_352us(unsigned int i);//352us延时程序声明
void int_io();//IO口的初始化
void  key_press();//阵列式按键键码读取的函数声明
const unsigned char tabl1[11]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0X20,0x38,0xff};
                // ;0  ,1   ,2   ,3  , 4,   5,   6    ,7   ,8  ,9 ,灭}数码管段码表


static unsigned char nRes=0;
//******************************************
//子程序名:int_clk()
//功能:   时钟初始化子程序
void int_clk()
{
  unsigned char i;//定义局部变量i
  BCSCTL1&=~XT2OFF;//打开高频晶体震荡器
  BCSCTL2|=SELM1+SELS;//MCLK和SMCLK的时钟源都选择XT2CLK,即都是8MHZ
  do//(至少执行一次DO循环)
  {
    IFG1&=~OFIFG;//清除晶体震荡出错标志位
    for(i=0;i<100;i++)
      _NOP();//简单的延时等待
  }while((IFG1&OFIFG));//判断晶体震荡是否出错,如果还是出错,则继续执行DO循环
  IFG1&=~OFIFG;
}
//******************************************************************************
//IO口初始化子程序
void int_io()
{
  SHUMA_PORT_DIR|=0XFF;//set P5 is out  设置控制数码管数据口的IO口为输出模式
  P6DIR|=BIT0+BIT4+BIT5+BIT6;
  P3DIR|=BIT0;//P3.0控制74HC573的OE,把这个口设置为输出
  P3OUT&=~BIT0;//使能74573,使得74573的输出随输入变化
  
  
} 
//******************************************************
//352微秒延时程序
void delay_352us(unsigned int i)//352us延时程序,延时时间的计算在前面已经讲过
{ 
  unsigned char j;
  
  while(i--)
  {
   for(j=0;j<255;j++)
   {  
    _NOP();
    _NOP();
    _NOP();
    _NOP();   
    }
  } 
}  
void keyPress(void)
{      
        int nP10;
        int nP11;
        int nP12;
        int nP13;
        KEY_SEL=0X00;//设置阵列式控制IO为普通IO 
        KEY_DIR=0XF0;//P1.0到p1.3为输入,P1.4到P1.7为输出
        KEY_OUT=0XF0;//P1.4到P1.7都输出高电平
	KEY_OUT = ~BIT4;//P1.4输出低电平
	nP10 = KEY_IN & BIT0;
	if (nP10 == 0) nRes = 0;
	nP11 = (KEY_IN & BIT1) >> 1;
	if (nP11 == 0) nRes = 4;
	nP12 = (KEY_IN & BIT2) >> 2;
	if (nP12 == 0) nRes = 8;
	nP13 = (KEY_IN & BIT3) >> 3;
	if (nP13 == 0) nRes = 12;
        //P1.5输出低电平
        KEY_OUT=0XF0;
	KEY_OUT&=~BIT5;
	nP10 = KEY_IN & BIT0;
	if (nP10 == 0) nRes = 1;
	nP11 = (KEY_IN & BIT1) >> 1;
	if (nP11 == 0) nRes = 5;
	nP12 = (KEY_IN & BIT2) >> 2;
	if (nP12 == 0) nRes = 9;
	nP13 = (KEY_IN & BIT3) >> 3;
	if (nP13 == 0) nRes = 13;
	//P1.6输出低电平
        KEY_OUT=0XF0;
	KEY_OUT&=~BIT6;
	nP10 = KEY_IN & BIT0;
	if (nP10 == 0) nRes = 2;
	nP11 = (KEY_IN & BIT1) >> 1;
	if (nP11 == 0) nRes = 6;
	nP12 = (KEY_IN & BIT2) >> 2;
	if (nP12 == 0) nRes = 10;
	nP13 = (KEY_IN & BIT3) >> 3;
	if (nP13 == 0) nRes = 14;
	//P1.7输出低电平
        KEY_OUT=0XF0;
	KEY_OUT&=~BIT7;
	nP10 = KEY_IN & BIT0;
	if (nP10 == 0) nRes = 3;
	nP11 = (KEY_IN & BIT1) >> 1;
	if (nP11 == 0) nRes = 7;
	nP12 = (KEY_IN & BIT2) >> 2;
	if (nP12 == 0) nRes = 11;
	nP13 = (KEY_IN & BIT3) >> 3;
	if (nP13 == 0) nRes = 15;
         //以下被注释掉的程序是用来等按键释放才推出函数的程序
         //for(;;)
         //{
	 //P1OUT = 0x00;//恢复以前值。
	 //读取各个管脚的状态
         //nP10 = P1IN & BIT0;
	 // nP11 = (P1IN & BIT1) >> 1;
	 //nP12 = (P1IN & BIT2) >> 2;
	 //nP13 = (P1IN & BIT3) >> 3;
	 //if(nP10 == 1 && nP11 == 1 && nP12 == 1 && nP13 == 1)
	 //{
	 //等待松开按键
         //break;
	// }
	//}
}
//*************************************
int main( void )
{ 
  unsigned char display;
  unsigned char DISPLAY1=1,DISPLAY2=2,DISPLAY3=3,DISPLAY4=4;
  WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
  int_clk();//初始化时钟
  int_io();//初始化数码管控制口
  while(1)
  {
   keyPress();
   display=nRes;
   DISPLAY1=display/1000%10;//求取显示值的千位数据的BCD码
   DISPLAY2=display/100%10;//求取显示值的百位的数据的BCD码
   DISPLAY3=display/10%10;//求取显示值的十位数据的BCD码
   DISPLAY4=display%10;//求取显示值的个位的数据的BCD码
   //以下是数码管的动态扫描程序
   SHUMA_PORT_OUT=tabl1[DISPLAY1];//求取BCD码对应的数码管段码,并送到控制数码管的数据扣
   SHUMA_1_LOW;//开第一位数码管
   delay_352us(10);//简单延时
   SHUMA_1_HIGH;//灭第一位数码管
   SHUMA_PORT_OUT=tabl1[DISPLAY2];//送数码管第二位显示的段码
   SHUMA_2_LOW;//开显示第二位数码管
   delay_352us(10);//延时
   SHUMA_2_HIGH;//灭第二位数码管,接下去重复1二
   SHUMA_PORT_OUT=tabl1[DISPLAY3];
   SHUMA_3_LOW;
   delay_352us(10);
   SHUMA_3_HIGH;
   SHUMA_PORT_OUT=tabl1[DISPLAY4];
   SHUMA_4_LOW;
   delay_352us(10);
   SHUMA_4_HIGH;
  }  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -