📄 zlg7289_keyboard.c
字号:
/****************************************Copyright (c)**************************************************
** 西安邮电学院嵌入式兴趣小组
**
** 加气站电子结算系统小组
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2007-02-28
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Bai Chao gang
** Created date: 2007-01-31
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "ZLG7289_KeyBoard.h"
/*********************************************************************************************************
函数名:ZLG7289_ShortDelay(uint32 n)
参数: j----代表延时的长短
功能:延时
说明:j=7时,此延时函数大约延时1us
*********************************************************************************************************/
void ZLG7289_ShortDelay(uint32 j)
{
for(;j>0;j--);
}
/*********************************************************************************************************
函数名:ZLG7289_Init()
参数: 无
功能:初始化键盘所用到的ARM端口
说明:
*********************************************************************************************************/
void ZLG7289_Init(void)
{
//I/O口初始化
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IO0DIR |= ZLG7289_pinCS;
IO0SET |= ZLG7289_pinCS;
IO0DIR |= ZLG7289_pinCLK;
IO0CLR |= ZLG7289_pinCLK;
IO0DIR |= ZLG7289_pinDIO;
IO0SET|= ZLG7289_pinDIO;
IO0DIR |= ZLG7289_pinINT;
IO0SET|= ZLG7289_pinINT;
ZLG7289_Reset();
ZLG7289_Test();
ZLG7289_ShortDelay(5000000);
ZLG7289_Reset();
}
/*********************************************************************************************************
函数:ZLG7289_SPI_Write() arm的GPIO输出数据,7289读入数据
功能:向SPI总线写入1个字节的数据
参数:
dat:要写入的数据
*********************************************************************************************************/
void ZLG7289_SPI_Write(uint8 dat)
{
uint8 t=8;
IO0DIR |= ZLG7289_pinDIO; //方向设置为输出
do
{
if((dat&0x80) == 0x80) //在数据左移的过程中,如果最高位为1,则输出高,否则输出低
{
IO0SET = ZLG7289_pinDIO; //输出高电平
}
else
{
IO0CLR = ZLG7289_pinDIO; //输出低电平
}
dat <<= 1; //数据左移
ZLG7289_ShortDelay(80);
IO0DIR |= ZLG7289_pinCLK; //方向为输出
IO0SET |= ZLG7289_pinCLK; //时钟上升沿
ZLG7289_ShortDelay(160); //高电平延时一段时间
IO0CLR|= ZLG7289_pinCLK; //低电平
ZLG7289_ShortDelay(160); //低电平延时一段时间
} while ( --t != 0 );
}
/**********************************************************************************************************
函数:ZLG7289_SPI_Read()
功能:从SPI总线读 1个字节的数据
返回:
读
**********************************************************************************************************/
uint8 ZLG7289_SPI_Read()
{
uint8 dat;
uint8 t = 8;
IO0DIR &=~(~ZLG7289_pinDIO); //读 DIO引脚要置1以切换到输入状态
IO0SET|= ZLG7289_pinDIO; //ZLG7289_pinDIO置1切换到输入状态
do
{
IO0SET|=ZLG7289_pinCLK;
ZLG7289_ShortDelay(160);
dat <<= 1; //dat左移
if ((IO0PIN & ZLG7289_pinDIO) == ZLG7289_pinDIO) //如果引脚为1的话,恒为输入状态
{ dat++; } // 则dat确定为循环左移
IO0CLR|= ZLG7289_pinCLK; //清ZLG7289_pinCLK
ZLG7289_ShortDelay(160);
} while ( --t != 0 );
return dat;
}
/**********************************************************************************************************
函数:ZLG7289_cmd()
功能:执行ZLG7289纯指令
参数:
cmd:命令字
**********************************************************************************************************/
void ZLG7289_cmd(uint8 cmd)
{
IO0DIR |= ZLG7289_pinCS;
IO0CLR |= ZLG7289_pinCS;
ZLG7289_ShortDelay(500);
ZLG7289_SPI_Write(cmd); //
IO0SET|= ZLG7289_pinCS;
ZLG7289_ShortDelay(500);
}
/**********************************************************************************************************
函数:ZLG7289_cmd_dat()
功能:执行ZLG7289带数据指令
参数:
cmd:命令字
dat:数据
**********************************************************************************************************/
void ZLG7289_cmd_dat(uint8 cmd, uint8 dat)
{
IO0DIR |= ZLG7289_pinCS;
IO0CLR|= ZLG7289_pinCS; // 0片选有效
ZLG7289_ShortDelay(500);
ZLG7289_SPI_Write(cmd);
ZLG7289_ShortDelay(500);
ZLG7289_SPI_Write(dat);
IO0DIR |= ZLG7289_pinCS;
IO0SET|= ZLG7289_pinCS; //1片选无效
ZLG7289_ShortDelay(500);
}
/*********************************************************************************************************
函数名:uint8 Get_Key(void)
功能:执行ZLG7289键盘命令
说明:外部函数调用此函数,返回按键的键值,是和外部的接口函数
返回值:
返回读 0---31
如果返回0xFF则表示没有键按下
*********************************************************************************************************/
uint8 Get_Key(void)
{
uint8 key;
IO0DIR|= ZLG7289_pinCS;
IO0CLR |= ZLG7289_pinCS;
ZLG7289_ShortDelay(500);
ZLG7289_SPI_Write(0x15);
ZLG7289_ShortDelay(500);
key = ZLG7289_SPI_Read();
IO0SET |= ZLG7289_pinCS;
// ZLG7289_ShortDelay(500000);
return (key);
}
/*********************************************************************************************************
函数名:void ZLG7289_Download(uint8 mod,uint8 x,uint8 dp,uint8 dat)
功能:下载数据
参数:
mod=0:下载数据且按方式0 译码
mod=1:下载数据且按方式1 译码
mod=2:下载数据但不译码
x:数码管编号(横坐标),取值0~7
dp=0:小数点不亮
dp=1:小数点亮
dat:要显示的数据
说明:
译码方式的具体含义请参考数据手册
*********************************************************************************************************/
void ZLG7289_Download(uint8 mod,uint8 x,uint8 dp,uint8 dat)
{
uint8 ModDat[3]={0x80,0xc8,0x90};
uint8 d1;
uint8 d2;
d1 = ModDat[mod];
x &= 0x07;
d1 |= x; //显示位选择
d2 = dat & 0x7f;
if(dp)
d2 |= 0x80;
ZLG7289_cmd_dat(d1,d2);
}
/*******************************************************************************************************
***** end file
********************************************************************************************************/
uint8 ZLG7289_Key(void)
{
uint8 k;
if((IO0PIN & ZLG7289_pinINT) == 0 )
{
k = Get_Key();
ZLG7289_ShortDelay(5000);
return k;
}
return 0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -