/**
******************************************************************************
* @file GPIO_IOToggle_PollingMode\main.c
* @brief This file contains the main function for GPIO IOToggle_PollingMode example.
* @author STMicroelectronics - MCD Application Team
* @version V1.0.1
* @date 09/22/2008
******************************************************************************
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2008 STMicroelectronics</center></h2>
* @image html logo.bmp
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm8s_lib.h"
/**
* @addtogroup IOToggle_PollingMode
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Evalboard I/Os configuration */
#define LEDS_PORT (GPIOD)
#define LED1_PIN (GPIO_PIN_3)
#define LED2_PIN (GPIO_PIN_2)
#define LED3_PIN (GPIO_PIN_0)
#define BUTTON_PORT (GPIOD)
#define BUTTON_PIN (GPIO_PIN_7)
#define ZLG7289_pinCLK1 0 //PE0时钟信号
#define ZLG7289_pinDIO1 1 //PE1数据信号,
#define ZLG7289_pinCS1 2 //PE2片选信号,低电平有效
#define ZLG7289_pinINT1 7 //PD7键盘中断请求信号,低电平(负边沿)有效
#define ZLG7289_pinCLK (GPIO_PIN_0) //PE0时钟信号,上升沿有效
#define ZLG7289_pinDIO (GPIO_PIN_1) //PE1数据信号,双向
#define ZLG7289_pinCS (GPIO_PIN_2) //PE2片选信号,低电平有效
#define ZLG7289_pinINT (GPIO_PIN_7) //PD7键盘中断请求信号,低电平(负边沿)有效
uint16 ZLG7289_Delay_t;
void ZLG7289_ShortDelay(void);
void ZLG7289_LongDelay(void);
void ZLG7289_SPI_Write(char dat);
char ZLG7289_SPI_Read(void);
void ZLG7289_cmd(char cmd);
void ZLG7289_cmd_dat(char cmd,char dat);
uint8 ZLG7289_Key(void);
void ZLG7289_Download(unsigned char mod, char x, bit dp, char dat);
void ZLG7289_Init(uint16 t);
/*********************************************************************
*
* 函 数 名: ZLG7289_ShortDelay()
* 功能描述: 校正
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
void ZLG7289_ShortDelay(void)
{
uint16 t=ZLG7289_Delay_t;
while (--t!=0);
}
/*********************************************************************
*
* 函 数 名: ZLG7289_LongDelay()
* 功能描述: 校正
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
void ZLG7289_LongDelay(void)
{
uint16 t=ZLG7289_Delay_t*6;
while (--t!=0);
}
/*********************************************************************
*
* 函 数 名: ZLG7289_Init()
* 功能描述:
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
void ZLG7289_Init(uint16 t)
{
GPIOE->DDR |= 0x07; /* Output. */
GPIOE->CR1 |= 0x07; /* PushPull. */
GPIOE->CR2 = 0x00; /* Output speed up to 2MHz. */
/* PD7 external interrupt */
//EXTI->CR1 = 0x00;
//EXTI->CR2 = 0x00;
//GPIOD->DDR &=~0x80;
//GPIOD->CR2 |= 0x80;
//GPIOE->ODR &= (u8)(~PortPins);
GPIOE->ODR &= (u8)(~(ZLG7289_pinCS));
GPIOE->ODR |= (ZLG7289_pinCLK);
GPIOE->ODR |= (ZLG7289_pinDIO);
GPIOD->ODR |= (ZLG7289_pinINT);
ZLG7289_Delay_t=t;
}
/*********************************************************************
*
* 函 数 名: ZLG7289_SPI_Write()
* 功能描述: 校正
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
void ZLG7289_SPI_Write(char dat)
{
unsigned char t=8;
GPIOE->DDR |= (ZLG7289_pinDIO); /* Output. */
GPIOE->CR1 |= (ZLG7289_pinDIO); /* PushPull. */
GPIOE->CR2 = 0x00; /* Output speed up to 2MHz. */
do
{
if(dat&0x80)
GPIOE->ODR |= (ZLG7289_pinDIO);
else
GPIOE->ODR &= (u8)(~(ZLG7289_pinDIO));
dat<<=1;
GPIOE->ODR |= (ZLG7289_pinCLK);
ZLG7289_ShortDelay();
GPIOE->ODR &= (u8)(~(ZLG7289_pinCLK));
ZLG7289_ShortDelay();
} while (--t!=0);
}
/*********************************************************************
*
* 函 数 名: ZLG7289_SPI_Read()
* 功能描述:
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
char ZLG7289_SPI_Read(void)
{
char dat;
unsigned char t=8;
// GPIOx->DDR &= (u8)(~(GPIO_Pin));
GPIOE->DDR &= (u8)(~(ZLG7289_pinDIO)); /* Output. */
GPIOE->CR1 &= (u8)(~(ZLG7289_pinDIO)); /* PushPull. */
GPIOE->CR2 &= (u8)(~(ZLG7289_pinDIO)); /* Output speed up to 2MHz. */
do
{
GPIOE->ODR |= (ZLG7289_pinCLK);
ZLG7289_ShortDelay();
dat<<=1;
if(GPIO_ReadInputPin(GPIOE, ZLG7289_pinDIO))dat++;
//return ((BitStatus)(GPIOx->IDR & (vu8)GPIO_Pin));
GPIOE->ODR &= (u8)(~ZLG7289_pinCLK);
ZLG7289_ShortDelay();
} while (--t!=0);
GPIOE->DDR |= (ZLG7289_pinDIO); /* Output. */
GPIOE->CR1 |= (ZLG7289_pinDIO); /* PushPull. */
GPIOE->CR2 = 0x00; /* Output speed up to 2MHz. */
return dat;
}
/*********************************************************************
*
* 函 数 名: ZLG7289_cmd()
* 功能描述:
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
void ZLG7289_cmd(char cmd)
{
GPIOE->ODR &= (u8)(~(ZLG7289_pinCS));
ZLG7289_LongDelay();
ZLG7289_SPI_Write(cmd);
GPIOE->ODR |= (ZLG7289_pinCS);
ZLG7289_LongDelay();
}
/*********************************************************************
*
* 函 数 名: ZLG7289_cmd_dat()
* 功能描述:
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
void ZLG7289_cmd_dat(char cmd,char dat)
{
GPIOE->ODR &= (u8)(~(ZLG7289_pinCS));
ZLG7289_LongDelay();
ZLG7289_SPI_Write(cmd);
ZLG7289_LongDelay();
ZLG7289_SPI_Write(dat);
GPIOE->ODR |= (ZLG7289_pinCS);
ZLG7289_LongDelay();
}
/*********************************************************************
*
* 函 数 名: ZLG7289_Key()
* 功能描述:
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
uint8 ZLG7289_Key(void)
{
uint8 key;
GPIOE->ODR &= (u8)(~(ZLG7289_pinCS));
ZLG7289_LongDelay();
ZLG7289_SPI_Write(0x15);
ZLG7289_LongDelay();
key=ZLG7289_SPI_Read();
GPIOE->ODR |= (ZLG7289_pinCS);
ZLG7289_LongDelay();
return key;
}
/*********************************************************************
*
* 函 数 名: ZLG7289_Download
* 功能描述:
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
void ZLG7289_Download(unsigned char mod, char x, bit dp, char dat)
{
char ModDat[3] = {0x80,0xC8,0x90};
char d1;
char d2;
if ( mod > 2 ) mod = 2;
d1 = ModDat[mod];
x &= 0x07;
d1 |= x;
d2 = dat & 0x7F;
if ( dp ) d2 |= 0x80;
ZLG7289_cmd_dat(d1,d2);
}
void GPIOD_Init(void)
{
/* LED IO Configuration */
/* LD3: PD3 */
/* LD2: PD1 */
/* LD1: PD0 */
GPIOD->DDR |= 0x8D; /* Output. */
GPIOD->CR1 |= 0x8D; /* PushPull. */
GPIOD->CR2 = 0x00; /* Output speed up to 2MHz. */
GPIOE->DDR |= 0x07; /* Output. */
GPIOE->CR1 |= 0x07; /* PushPull. */
GPIOE->CR2 = 0x00; /* Output speed up to 2MHz. */
}
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void Delay (u16 nCount);
/* Private functions ---------------------------------------------------------*/
void Delay(u16 nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
/* Public functions ----------------------------------------------------------*/
/**
* @brief Example firmware main entry point.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
* @par Library functions called:
* - GPIO_Init()
* - GPIO_ReadInputData()
* - GPIO_WriteHigh()
* - GPIO_WriteLow()
*/
void main(void)
{
unsigned char i=0;
unsigned char x;
unsigned char dat;
GPIOD_Init();
ZLG7289_Init(200);
for ( x=0; x<8; x++ )
{
dat = x;
ZLG7289_Download(1,x,0,dat);
}
while (1)
{
GPIOD->ODR ^= LED3_PIN;
Delay((u16)60000);
Delay((u16)60000);
GPIOD->ODR ^= LED2_PIN;
Delay((u16)60000);
Delay((u16)60000);
GPIOD->ODR ^= LED1_PIN;
Delay((u16)60000);
Delay((u16)60000);
}
}
/**
* @brief Reports the name of the source file and the source line number where
* the assert error has occurred.
* User can add his own implementation to report the file name and line number.
* ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line)
* @retval void None
* @par Required preconditions:
* None
* @par Called functions:
* None
*/
#ifdef FULL_ASSERT
void assert_failed(u8 *file, u16 line)
#else
void assert_failed(void)
#endif
{
/* Add your own code to manage an assert error */
/* Infinite loop */
while (1)
{
}
}
/**
* @}
*/
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
数码管显示。按键查询。
中断没做。
下次把液晶也加上一起发。
还有人用7289 ?
我的天,难道自己写扫描就那么难吗?
若用7289,不如试一试ST的STLED316S, 价格说不定比7289还好些....一样的LED加KEY驱动。
ZLG7289偶尔会出现没有反应的情况(无法产生中断,也无法读写),需要重新复位即可,稳定性稍差。
好像用这个比74164好。。。
164用的比较啰嗦。。。