ZLG7290矩阵键盘控制forMSP40
来源:互联网 发布:windows自动还原 编辑:程序博客网 时间:2024/06/05 19:05
基于ZLG7290的矩阵键盘控制,适用于MSP430,采用中断模式查询按键。ZLG7290还具有数码管显示功能,本人水平有限,这里未能实现。
/*****************************************************************//文件名:ZLG7290.c//描述:该文件定义与ZLG7290有关的各种接口、函数,适用于MSP430F149//编写人:小邪@清水//版本号:1.01*****************************************************************/#include "msp430x14x.h"#include "ZLG7290.h"/*****************************************************************//关于接口的一些定义//需要根据实际应用做出改变*****************************************************************/#define IIC_Enable !(P2IN&BIT2)#define SCL_UP PORTDIR&=~SCL#define SDA_UP PORTDIR&=~SDA#define SCL_DOWN PORTDIR|=SCL#define SDA_DOWN PORTDIR|=SDA#define PORTDIR P3DIR//设置为P3口#define PORTIN P3IN#define PORTOUT P3OUT#define SDA BIT0//设置SDA为Px.0 #define SCL BIT1//设置SCL为Px.1#define RES BIT2//设置RES为P2.7(对应430的中断)#define CHIP 0x70//ZLG7290的IIC地址/*************************************************************************//名称: IIC_delay()//参数: 无//返回值: 无//功能: 完成IIC设置中所需要的延时*************************************************************************/void IIC_delay(){ int i; i=0xff; while(i) { i--; _NOP(); } i=0xff; while(i) { i--; _NOP(); }}/*************************************************************************//名称: SendToBus()//参数: 要发送的数据//返回值: 无//功能: 向线上发送数据(SCL必须在进入函数前置为低)*************************************************************************/void SendToBus(BYTE m){ BYTE i; for(i=0;i<8;i++) { if(m&0x80) SDA_UP; else SDA_DOWN; SCL_UP; IIC_delay(); SCL_DOWN; m<<=1; } return;}/*************************************************************************//名称: BackAns()//参数: 无//返回值: 成功标志,若成功则为1,否则为0//功能: 接收应答信号*************************************************************************/BYTE BackAns(){ BYTE flag; SDA_UP; IIC_delay(); SCL_UP; flag=0; IIC_delay(); if((PORTIN & SDA)) { flag=1; } SCL_DOWN; return flag;}/*************************************************************************//名称: Start()//参数: 无//返回值: 无//功能: 发送一个起始信号*************************************************************************/void Start(){ PORTOUT &= (~SCL)&(~SDA) ; SCL_UP; IIC_delay(); SDA_UP; IIC_delay(); SDA_DOWN; //开始位 IIC_delay(); SCL_DOWN; IIC_delay();}/*************************************************************************//名称: Stop()//参数: 无//返回值: 无//功能: 发送一个停止信号*************************************************************************/void Stop(){ SDA_DOWN; IIC_delay(); SCL_UP; //停止位 IIC_delay(); SDA_UP; IIC_delay(); SCL_DOWN; IIC_delay();}/*************************************************************************//名称: Write_IIC_Byte()//参数: data-待写入的数据,startaddr-待写入的首地址//返回值: 无//功能: 向线上写一个字节*************************************************************************/void Write_IIC_Byte(BYTE data,BYTE startaddr){ do { Start(); SendToBus(CHIP); //选片地址 if(BackAns()) //从机的回答信息 continue; SendToBus(startaddr); //选择芯片上的内在地址 if(BackAns()) continue; SendToBus(data); //传输数据 if(!BackAns()) break; } while(1); Stop();}/*************************************************************************//名称: ReadFromBus()//参数: 无//返回值: 读出的数据//功能: 从线上读出数据*************************************************************************/BYTE ReadFromBus(){ int i,temp; temp = 0; SDA_UP; //读取数据之前要把SDA拉高 IIC_delay(); for(i=0;i<8;i++) { SCL_UP; IIC_delay(); temp<<=1; if(PORTIN&SDA) temp|=0x01; else temp&=0xfe; SCL_DOWN; IIC_delay(); } return temp;}/*************************************************************************//名称: Read_IIC_Random()//参数: startaddr-读数据的首地址//返回值: 读出的数据//功能: 读数据到微控制器*************************************************************************/BYTE Read_IIC_Random(BYTE startaddr){ BYTE temp; do { Start(); SendToBus(CHIP); //选片地址 if(BackAns()) //从机的回答信息 continue;SendToBus(startaddr); //选择芯片上的内在地址 if(BackAns()) continue; Start(); SendToBus(CHIP + 1); if(!BackAns()) break; } while(1); temp = ReadFromBus(); //从线上读数据 NoAck(); Stop(); return temp;}/*************************************************************************//名称: AckToBus()//参数: 无//返回值: 无//功能: 向IIC发送应答信号*************************************************************************/void AckToBus(){ SDA_DOWN; IIC_delay(); SCL_UP; IIC_delay(); SCL_DOWN; IIC_delay();}/*************************************************************************//名称: NoAck()//参数: 无//返回值: 无//功能: 向IIC发送应答信号*************************************************************************/void NoAck(){ SDA_UP; IIC_delay(); SCL_UP; IIC_delay(); SCL_DOWN; IIC_delay();}/*************************************************************************//名称: Write_IIC_Serious()//参数: data-待写数据的指针,startaddr-待写数据的起始地址,len-待写数据的长度//返回值: 无//功能: 连续写多个字*************************************************************************/void Write_IIC_Serious(char *data,BYTE startaddr,BYTE len){ do { Start(); SendToBus(CHIP); //选片地址 if(BackAns()) //从机的回答信息 continue; SendToBus(startaddr); //选择芯片上的内在地址 if(BackAns()) continue; SendToBus(data[0]); //传输数据 if(BackAns()) continue; SendToBus(data[1]); if(!BackAns()) break; } while(1); Stop();}/*************************************************************************//名称: Read_IIC_Curent()//参数: data-待读数据存放的指针,len-待读数据的长度//返回值: 无//功能: 连续读多个字*************************************************************************/void Read_IIC_Curent(BYTE *data,BYTE len) { int i; Start(); SendToBus(CHIP+1); BackAns();//放松读命令 i=1; do { i++; data[i]=ReadFromBus(); if(i<len) AckToBus(); else break; } while(1); Stop();}/*************************************************************************//名称: init_IIC()//参数: 无//返回值: 无//功能: 初始化I2C*************************************************************************/void init_IIC(){P2IE|=BIT7; P2IES|=BIT7; P2IFG&=~0x80; _EINT();}/*************************************************************************//名称: zlg7290_cmd()//参数: cmd-待写入的命令//返回值: 无//功能: ZLG7290纯指令发送*************************************************************************/void zlg7290_cmd(unsigned char cmd){Write_IIC_Byte(cmd,0x07);return; } /*************************************************************************//名称: IsKeyDown()//参数: 无//返回值: 1-有键按下,0-无键按下//功能: ZLG7290纯指令发送*************************************************************************/char IsKeyDown() {char temp;temp=0; temp=Read_IIC_Random(0x00); if(temp&0x01) { return 1; } else { return 0; } }/*************************************************************************//名称: ReadKey()//参数: 无//返回值: 读取的键值//功能: 读取键值*************************************************************************/char ReadKey() {return Read_IIC_Random(0x01);}/*************************************************************************//名称: ReadCnt()//参数: 无//返回值: 连击次数//功能: 读取连击次数*************************************************************************/char ReadCnt() {return Read_IIC_Random(0x02);}
- ZLG7290矩阵键盘控制forMSP40
- ZLG7290键盘驱动开发心得
- 矩阵键盘控制forMSP430
- C51控制矩阵键盘
- [转]ZLG7290键盘驱动开发心得
- IIC--ZLG7290键盘和LED驱动
- 手持机之键盘篇——ZLG7290
- ZLG7290键盘驱动开发心得——转载
- 4×4矩阵键盘,控制数码管显示
- 矩阵键盘控制0到F
- 矩阵键盘——线反转法控制
- ARM开发(3)基于STM32的矩阵键盘控制蜂鸣器
- 矩阵键盘
- 矩阵键盘
- 矩阵键盘
- 矩阵键盘
- 矩阵键盘
- 矩阵键盘
- Linux 下 静态编译Qt程序
- nyoj 稍具技巧的题
- 查看那个进程消耗IO较大
- 【AndEngine游戏开发日记】2012.7.25
- LPT: Linux test project
- ZLG7290矩阵键盘控制forMSP40
- sharepoint2010上传文档报文件过大的解决方案
- 并发和并行的区别?
- HTK错误消息意义
- ocp练习题
- 【AndEngine游戏开发日记】2012.7.26
- C#基础知识整理:基础知识(12) 超类Object
- android(安卓)实现计算器程序,带优先级算法
- 有关Android线程的学习