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

📄 zlg7289_430.c

📁 这是一款用于周立通公司研发的芯片ZLG7289的程序,用它来控制数码管,防止按键抖动
💻 C
字号:
/**********************************************************/
//MSP430 Advanced Developping Components - [ZLG7289_430.C]
////ZLG7289 KeyBroad and LEDs Developping Demos
////->>> http://www.just430.cn
////->>> tel :(0)13500717874
/**********************************************************/
//MSP430高级实验开发组件 - ZLG7289键盘显示组件示例程序
//时钟设置:
////ACLK=N/A,MCLK=SMCLK=default(DCO~800k)
//硬件连接:
////     MSP430 Broad               ZLG7289 Broad
////   ------------------         ------------------
////   |      VCC       | ------> |      VCC       |
////   |      P65       | ------> |      CS        |
////   |      P64       | ------> |      CLK       |
////   |      P63       | <-----> |      DAT       |
////   |      P24       | <------ |    KEY(INT)    |
////   |      GND       | ------> |      GND       |
////   ------------------         ------------------
//当前演示程序功能描述:
////当有按键按下时,430进入中断读取键值,显示在LED数码管上
/*********************************************************/

#include <msp430x14x.h>

#define Z7289_CS		BIT5
#define Z7289_CLK		BIT4
#define Z7289_DAT		BIT3
#define	Z7289_KEY		BIT4

#define Z7289_DIR		P6DIR
#define Z7289_OUT		P6OUT
#define Z7289_IN		P6IN
#define Z7279_INT_DIR		P2DIR
#define Z7279_INT_IE		P2IE
#define Z7279_INT_IES		P2IES
#define Z7279_INT_IFG		P2IFG			//定义MSP430端口

#define Z7289_CS_LO		Z7289_OUT &= ~Z7289_CS
#define Z7289_CS_HI		Z7289_OUT |= Z7289_CS
#define Z7289_CLK_LO	        Z7289_OUT &= ~Z7289_CLK
#define Z7289_CLK_HI		Z7289_OUT |= Z7289_CLK
#define Z7289_DAT_LO	        Z7289_OUT &= ~Z7289_DAT
#define Z7289_DAT_HI		Z7289_OUT |= Z7289_DAT

#define Z7289_RESET		Z7289_Send1(0xA4)
#define Z7289_TEST		Z7289_Send1(0xBF)
#define Z7289_LMOV		Z7289_Send1(0xA1)
#define Z7289_RMOV		Z7289_Send1(0xA0)
#define Z7289_RLMOV		Z7289_Send1(0xA3)
#define Z7289_RRMOV		Z7289_Send1(0xA2)	//定义ZLG7289功能

const unsigned char DelayConst = 10;			//系统延时
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
//};
const unsigned char Keys[16]={
	0x01,0x18,0x19,0x1A,0x10,0x11,0x12,0x08,0x09,0x0A,0x1B,0x13,0x0B,0x03,0x00,0x02
};

void Z7289_Delayt(unsigned int dtime);
void Z7289_Send1(unsigned char dat);
void Z7289_Send2(unsigned char add,unsigned char dat);
void Z7289_Show(unsigned char add,unsigned char coding,unsigned char d);
void Z7289_Init(void);
void OSC_Init(void);
unsigned char Z7289_ReadKey(void);

/****************************
void main(void) {
	WDTCTL = WDTPW + WDTHOLD;
	Z7289_Init();
	Z7279_INT_DIR &= ~Z7289_KEY;
	Z7279_INT_IE  |= Z7289_KEY;
	Z7279_INT_IES |= Z7289_KEY;
	_BIS_SR(GIE);
	while(1);
}
****************************/

//中断服务程序
////读取键值并显示
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR (void) {
	unsigned char keyword;
	unsigned int i;
	keyword = Z7289_ReadKey();
	_NOP();
	for(i=0;i<8;i++) {
		Z7289_Show(i,1,keyword);
	}
	Z7279_INT_IFG = 0;
}

//初始化程序
////设定端口和中断,初始化ZLG7289
void Z7289_Init(void) {
	Z7289_DIR |= (Z7289_CS + Z7289_CLK + Z7289_DAT);
	Z7289_CS_HI;
	Z7289_CLK_LO;
	Z7289_RESET;
}

//向ZLG7289发送一个字节(命令)
void Z7289_Send1(unsigned char dat) {
	unsigned char itemp;
	Z7289_CS_LO;
	Z7289_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		if((dat<<itemp) & BIT7)
			Z7289_DAT_HI;
		else
			Z7289_DAT_LO;
		Z7289_Delayt(1);
		Z7289_CLK_HI;
		Z7289_Delayt(1);
		Z7289_CLK_LO;
	}
	Z7289_CS_HI;
}

//向ZLG7289发送两个字节(命令+数据)
void Z7289_Send2(unsigned char add,unsigned char dat) {
	unsigned char itemp;
	Z7289_CS_LO;
	Z7289_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		if((add<<itemp) & BIT7)
			Z7289_DAT_HI;
		else
			Z7289_DAT_LO;
		Z7289_Delayt(1);
		Z7289_CLK_HI;
		Z7289_Delayt(1);
		Z7289_CLK_LO;
	}
	Z7289_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		if((dat<<itemp) & BIT7)
			Z7289_DAT_HI;
		else
			Z7289_DAT_LO;
		Z7289_Delayt(1);
		Z7289_CLK_HI;
		Z7289_Delayt(1);
		Z7289_CLK_LO;
	}  
	Z7289_CS_HI;
}

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

//向ZLG7289发送命令后,读取按键键值,并查表返回结果
unsigned char Z7289_ReadKey(void) {
	unsigned char itemp;
	unsigned char dat;
	dat = 0x15;
	Z7289_CS_LO;
	Z7289_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		if((dat<<itemp) & BIT7)
			Z7289_DAT_HI;
		else
			Z7289_DAT_LO;
		Z7289_Delayt(1);
		Z7289_CLK_HI;
		Z7289_Delayt(1);
		Z7289_CLK_LO;
	}
	Z7289_DIR &= ~Z7289_DAT;
	Z7289_Delayt(1);
	for(itemp=0;itemp<8;itemp++) {
		Z7289_CLK_HI;
		Z7289_Delayt(1);
		Z7289_CLK_LO;
		dat<<=1;
		if((Z7289_IN&Z7289_DAT) == Z7289_DAT)
			dat |= BIT0;
		else
			dat &= ~BIT0;
	}
	Z7289_DIR |= Z7289_DAT;
	Z7289_CS_HI;
	for(itemp=0;itemp<16;itemp++)
		if(dat==Keys[itemp])
			break;
	return itemp;
}

void Z7289_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 + -