📄 zlg7289.c
字号:
#ifndef KEY_C
#define KEY_C
#include "config.h"
/***********************************************/
//extern void Delay10ms(uint times);
#define De1us() nop();nop();nop();nop()
#define KEY_DELAY5US() De1us();De1us();De1us();De1us();De1us()
void KeyDelay10us(uchar i){
while(i--){
KEY_DELAY5US();
KEY_DELAY5US();
}
}
/***********************************************/
//#define SOFT_RESET_ZLG7289 //定义键盘的复位要通过软件来进行
#ifdef SOFT_RESET_ZLG7289
#define RESET_KEY(); sbitKeyRset=0;RESET_OUTPUT(); Delay10ms(3);sbitKeyRset=1;RESET_OUTPUT();Delay10ms(3); //KEY芯片复位
#endif
#define KEY_SEL(); pinKeyEn=0;
#define KEY_NO_SEL(); pinKeyEn=1;
/*****************************************/
/*****************zlg7289控制命令字************************/
#define RESET_ZLG7289 0xa4 //芯片状态清除
#define READ_KEY 0x15 //读键值
/***************************************
** 函数名称: KeySendByte
** 功能描述: 发送一个字节到zlg7289A中
高位在前
*****************************************/
void KeySendByte(uchar x){
uchar idata ucByte=8;
KEY_SEL(); //选中芯片
for(;ucByte>0;ucByte--){
if(x & 0x80)
pinKeyData=1;
else
pinKeyData=0;
x<<=1;
KEY_DELAY5US();
pinKeyClk=1;
KeyDelay10us(1);
pinKeyClk=0;
KeyDelay10us(1);
}
pinKeyData=0;
}
/***************************************
** 函数名称: KeyRcvByte
** 功能描述: 从zlg7289A中接收一个字节
高位在前
*****************************************/
uchar KeyRcvByte(void){
uchar idata ucByte=8;
uchar idata x=0;
pinKeyData=1;
KEY_SEL();
// KeyDelay10us(7);
for(;ucByte>0;ucByte--){
pinKeyClk=1;
KeyDelay10us(1);
x<<=1;
if(pinKeyData)
x|=1;
pinKeyClk=0;
KeyDelay10us(1);
}
pinKeyData=0;
KEY_NO_SEL();
return x;
}
/*---------------------用户函数-----------------*/
/***************************************
** 函数名称: InitKey
** 功能描述: 初始化zlg7289A
*****************************************/
void InitKey(){
pinKeyInt=pinKeyClk=pinKeyData=1;
#ifdef SOFT_RESET_ZLG7289
RESET_KEY();
Delay10ms(5);
#endif
KeySendByte(RESET_ZLG7289);
KEY_NO_SEL();
}
/***************************************
** 函数名称: TestDisplay
** 功能描述: 测试LED指令
*****************************************/
void TestDisplay(){
KeySendByte(0xbf);
}
/***************************************
** 函数名称: RcvKeyVaule
** 功能描述: 接收键值
*****************************************/
uchar RcvKeyVaule(){
KeySendByte(READ_KEY);
return (KeyRcvByte());
}
/**************************************************/
/**************************************************/
/**************************************************/
/*****************LED显示部分************************/
/***************************************
** 函数名称: DisplayData
** 功能描述: 显示数据
** 输 入: dp:=1,显示点
addr:要显示的位
1-8;
disData:数据
输入数据 显示内容
00--09h : 0-9
0A --
0B E
0c H
0d L
0e P
0f 空(不显示)
*****************************************/
#define HIDE_DATA 0x0f //不显示
#define DISPLAY_DP 1 //显示DP
void DisplayData(bit dp,uchar addr,uchar disData){
if(addr==0 || addr>8)return;
if(disData>0x0f)return;
addr-=1;
KeySendByte(0x80+addr);
nop();nop();nop();nop();
if(dp)
disData+=0x80;
KeySendByte(disData);
}
/***************************************
** 函数名称: HideDisplay
** 功能描述: 隐藏其中的位
** 输 入: hideData:要隐藏的数据,
以BIT为单位,
bit 7 6 ....0
控制位 8 7.....1
要消隐其中一位,把它写1,显示写0
*****************************************/
void HideDisplay(uchar hideData){
hideData&=0x3f;
hideData^=0x3f;
KeySendByte(0x98);
nop();nop();nop();nop();
KeySendByte(hideData);
}
/***************************************
** 函数名称: FlashDisplay
** 功能描述: 闪烁显示其中的位
** 输 入: flashData:闪烁显示的数据,
以BIT为单位,
bit 7 6 ....0
控制位 8 7.....1
要闪烁其中一位,把它写1,不闪烁写0
*****************************************/
void FlashDisplay(uchar flashData){
KeySendByte(0x88);
nop();nop();nop();nop();
KeySendByte(flashData);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -