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

📄 main.c

📁 7279在MSP430上的驱动
💻 C
字号:
/**********************************************************/
//时钟设置:
////ACLK=N/A,MCLK=SMCLK=default(DCO~1MHz)
//硬件连接:
////     MSP430 Broad               HD7279 Broad
////   ------------------         ------------------
////   |      VCC       | ------> |      VCC       |
////   |      P1.3      | ------> |      CS        |
////   |      P1.2      | ------> |      CLK       |
////   |      P1.1      | <-----> |      DAT       |
////   |      P1.0      | <------ |    KEY(INT)    |
////   |      GND       | ------> |      GND       |
////   ------------------         ------------------
//当前演示程序功能描述:
////当有按键按下时,430进入中断读取键值,显示在LED数码管上
/*********************************************************/

#include  <msp430x20x3.h>

#define HD7279_CS		BIT3
#define HD7279_CLK		BIT2
#define HD7279_DAT		BIT1
#define	HD7279_KEY		BIT0

#define HD7279_DIR		P1DIR
#define HD7279_OUT		P1OUT
#define HD7279_IN		P1IN
#define HD7279_INT_DIR		P1DIR
#define HD7279_INT_IE		P1IE
#define HD7279_INT_IES		P1IES
#define HD7279_INT_IFG		P1IFG			//定义MSP430端口

#define HD7279_CS_LO		HD7279_OUT &= ~HD7279_CS
#define HD7279_CS_HI		HD7279_OUT |= HD7279_CS
#define HD7279_CLK_LO	        HD7279_OUT &= ~HD7279_CLK
#define HD7279_CLK_HI		HD7279_OUT |= HD7279_CLK
#define HD7279_DAT_LO	        HD7279_OUT &= ~HD7279_DAT
#define HD7279_DAT_HI		HD7279_OUT |= HD7279_DAT

#define HD7279_RESET		HD7279_Send1(0xA4)
#define HD7279_TEST		HD7279_Send1(0xBF)
#define HD7279_LMOV		HD7279_Send1(0xA1)
#define HD7279_RMOV		HD7279_Send1(0xA0)
#define HD7279_RLMOV		HD7279_Send1(0xA3)
#define HD7279_RRMOV		HD7279_Send1(0xA2)	//定义HD7279功能

const unsigned char DelayConst = 0;			//系统延时
const unsigned char Code[3]={				//显示方式
	0x80,0xC8,0x90
};
const unsigned char Keys[16]={				//按键编码
//0x02,0x30,0x32,0x34,0x20,0x22,0x24,0x10,0x12,0x14,0x36,0x26,0x16,0x06,0x00,0x04
  0x1D,0x07,0x1F,0x17,0x04,0x1C,0x14,0x06,0x1E,0x16,0x27,0x24,0x26,0x25,0x05,0x15
};

void HD7279_Delayt(unsigned int dtime);
void HD7279_Send1(unsigned char dat);
void HD7279_Send2(unsigned char add,unsigned char dat);
void HD7279_Show(unsigned char add,unsigned char coding,unsigned char d);
void HD7279_Init(void);
void OSC_Init(void);
unsigned char HD7279_ReadKey(void);


void main(void) {
          
	WDTCTL = WDTPW + WDTHOLD;
        
        BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
        DCOCTL = CALDCO_1MHZ;
        
	HD7279_Init();
	HD7279_INT_DIR &= ~HD7279_KEY;
	HD7279_INT_IE  |= HD7279_KEY;
	HD7279_INT_IES |= HD7279_KEY;
	_BIS_SR(GIE);
	while(1);
}


//中断服务程序
////读取键值并显示
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR (void) {
	unsigned char keyword;
	unsigned int i;
	keyword = HD7279_ReadKey();
	for(i=0;i<8;i++) {
		HD7279_Show(i,1,keyword);
	}
	HD7279_INT_IFG = 0;
}

//初始化程序
////设定端口和中断,初始化HD7279
void HD7279_Init(void) {
	HD7279_DIR |= (HD7279_CS + HD7279_CLK + HD7279_DAT);
	HD7279_CS_HI;
	HD7279_CLK_LO;
	HD7279_RESET;
}

//向HD7279发送一个字节(命令)
void HD7279_Send1(unsigned char dat) {
	unsigned char itemp;
	HD7279_CS_LO;
	HD7279_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		if((dat<<itemp) & BIT7)
			HD7279_DAT_HI;
		else
			HD7279_DAT_LO;
		HD7279_Delayt(1);
		HD7279_CLK_HI;
		HD7279_Delayt(1);
		HD7279_CLK_LO;
	}
	HD7279_CS_HI;
}

//向HD7279发送两个字节(命令+数据)
void HD7279_Send2(unsigned char add,unsigned char dat) {
	unsigned char itemp;
	HD7279_CS_LO;
	HD7279_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		if((add<<itemp) & BIT7)
			HD7279_DAT_HI;
		else
			HD7279_DAT_LO;
		HD7279_Delayt(1);
		HD7279_CLK_HI;
		HD7279_Delayt(1);
		HD7279_CLK_LO;
	}
	HD7279_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		if((dat<<itemp) & BIT7)
			HD7279_DAT_HI;
		else
			HD7279_DAT_LO;
		HD7279_Delayt(1);
		HD7279_CLK_HI;
		HD7279_Delayt(1);
		HD7279_CLK_LO;
	}  
	HD7279_CS_HI;
}

//按照编码方式显示字符
void HD7279_Show(unsigned char add,unsigned char coding,unsigned char d) {
	HD7279_Send2(Code[coding]+add,d);
}

//向HD7279发送命令后,读取按键键值,并查表返回结果
unsigned char HD7279_ReadKey(void) {
	unsigned char itemp;
	unsigned char dat;
	dat = 0x15;
	HD7279_CS_LO;
	HD7279_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		if((dat<<itemp) & BIT7)
			HD7279_DAT_HI;
		else
			HD7279_DAT_LO;
		HD7279_Delayt(1);
		HD7279_CLK_HI;
		HD7279_Delayt(1);
		HD7279_CLK_LO;
	}
	HD7279_DIR &= ~HD7279_DAT;
	HD7279_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		HD7279_CLK_HI;
		HD7279_Delayt(1);
		HD7279_CLK_LO;
		dat<<=1;
		if((HD7279_IN&HD7279_DAT) == HD7279_DAT)
			dat |= BIT0;
		else
			dat &= ~BIT0;
	}
	HD7279_DIR |= HD7279_DAT;
	HD7279_CS_HI;
	for(itemp=0;itemp<16;itemp++)
		if(dat==Keys[itemp])
			break;
	return itemp;
}

void HD7279_Delayt(unsigned int dtime) {
	unsigned int itemp,jtemp;
	for(itemp=0;itemp<dtime;itemp++)
		for(jtemp=0;jtemp<DelayConst;jtemp++);
}

⌨️ 快捷键说明

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