抛个砖。STM8S207+ZLG7289

caig7317   2009-11-24 14:56 楼主
/**
  ******************************************************************************
  * @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>&copy; 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);
}

回复评论 (10)

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****/
点赞  2009-11-24 14:57
数码管显示。按键查询。
中断没做。
下次把液晶也加上一起发。
点赞  2009-11-24 14:59
                                 程序调通了没
点赞  2009-11-24 18:37
                                 通了。。。
点赞  2009-11-25 08:00
还有人用7289 ?

我的天,难道自己写扫描就那么难吗?
点赞  2009-11-25 09:56
                                 hehe.有数码管了。
点赞  2009-11-25 10:28
                                 若用7289,不如试一试ST的STLED316S, 价格说不定比7289还好些....一样的LED加KEY驱动。
点赞  2009-11-25 11:50
                                 ZLG7289偶尔会出现没有反应的情况(无法产生中断,也无法读写),需要重新复位即可,稳定性稍差。
点赞  2009-11-25 12:48
好像用这个比74164好。。。

164用的比较啰嗦。。。
点赞  2009-11-25 21:35
楼主有用是stm32调过 zlg7289吗?
点赞  2014-7-30 09:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复