#ifndef __spi_dma_h__
#define __spi_dma_h__
#include "stm32f10x.h"
#define buffersize 800
#define SPI1_DR_Addr ( (u32)0x4001300C )
#define SPI_DMA //开启DMA功能
void SPI1_DMA_Configuration( void );
void SPI1_ReceiveSendByte( u16 num );
u8 SPI_SendByte(u8 Data);
void SPI_ReadBytes( u8 Addr, u16* Buffer, u8 Len );
void SPI_SendBytes( u8* Buffer, u16 Len);
#endif
#include "spi_dma.h"
u8 SPI1_TX_Buffer[buffersize];
u8 SPI1_RX_Buffer[buffersize];
void SPI1_DMA_Configuration( void )
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA1_Channel2->CCR &= ~( 1<<14 ) ;
DMA1_Channel2->CCR |= 2<<12 ;
DMA1_Channel2->CCR &= ~( 3<<10 ) ;
DMA1_Channel2->CCR &= ~( 3<<8 ) ;
DMA1_Channel2->CCR |= 1<<7 ;
DMA1_Channel2->CCR &= ~( 1<<6 ) ;
DMA1_Channel2->CCR &= ~( 1<<5 ) ;
DMA1_Channel2->CCR &= ~( 1<<4 ) ;
DMA1_Channel2->CNDTR &= 0x0000 ;
DMA1_Channel2->CNDTR = buffersize ;
DMA1_Channel2->CPAR = SPI1_DR_Addr ;
DMA1_Channel2->CMAR = (u32)SPI1_RX_Buffer ;
DMA1_Channel3->CCR &= ~( 1<<14 ) ;
DMA1_Channel3->CCR |= 0<<12 ;
DMA1_Channel3->CCR &= ~( 3<<10 ) ;
DMA1_Channel3->CCR &= ~( 3<<8 ) ;
DMA1_Channel3->CCR |= 1<<7 ;
DMA1_Channel3->CCR &= ~( 1<<6 ) ;
DMA1_Channel3->CCR &= ~( 1<<5 ) ;
DMA1_Channel3->CCR |= 1<<4 ;
DMA1_Channel3->CNDTR &= 0x0000 ;
DMA1_Channel3->CNDTR = buffersize ;
DMA1_Channel3->CPAR = SPI1_DR_Addr ;
DMA1_Channel3->CMAR = (u32)SPI1_TX_Buffer ;
}
void SPI1_ReceiveSendByte( u16 num )
{
SPI_I2S_DMACmd( SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
SPI_I2S_DMACmd( SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
DMA1_Channel2->CNDTR = 0x0000 ;
DMA1_Channel2->CNDTR = num ;
DMA1_Channel3->CNDTR = 0x0000 ;
DMA1_Channel3->CNDTR = num ;
DMA1->IFCR = 0xF0 ;
DMA1->IFCR = 0xF00 ;
SPI1->DR ;
while( ( SPI1->SR & 0x02 ) == 0 );
DMA1_Channel3->CCR |= 1 << 0 ;
DMA1_Channel2->CCR |= 1 << 0 ;
while( ( DMA1->ISR & 0x20 ) == 0 );
DMA1_Channel3->CCR &= ~( 1 << 0 ) ;
DMA1_Channel2->CCR &= ~( 1 << 0 ) ;
}
u8 SPI_SendByte(u8 Data)
{
#ifndef SPI_DMA
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE ) == RESET ) ;
SPI_I2S_SendData( SPI1, Data ) ;
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE ) == RESET ) ;
return SPI_I2S_ReceiveData( SPI1 ) ;
#else
SPI1_TX_Buffer[0] = Data;
SPI1_ReceiveSendByte(1);
return (SPI1_RX_Buffer[0]);
#endif
}
void SPI_ReadBytes( u8 Addr, u16* Buffer, u8 Len )
{
#ifndef SPI_DMA
if( ( Len > 0x80 ) || ( Len == 0 ) )
Len = 1 ;
SPI_SendByte( Len ) ;
SPI_SendByte( Addr ) ;
while( Len-- )
{
*Buffer = SPI_SendByte( 0xFF ) ;
Buffer ++ ;
}
#else
u8 i = 0;
if( ( Len > 0x80 ) || ( Len == 0 ) )
Len = 1 ;
SPI1_TX_Buffer[0] = Len;
SPI1_TX_Buffer[1] = Addr;
SPI1_ReceiveSendByte(Len + 2);
for (i = 0;i < Len;i++)
{
*Buffer++ = SPI1_RX_Buffer[i + 2];
}
#endif
}
void SPI_SendBytes( u8* Buffer, u16 Len)
{
#ifndef SPI_DMA
while(Len--){
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE ) == RESET ) ;
SPI_I2S_SendData( SPI1, * Buffer ) ;
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE ) == RESET ) ;
SPI_I2S_ReceiveData( SPI1 ) ;
Buffer++;
};
#else
SPI1_ReceiveSendByte(Len);
#endif
}
#ifndef __LCD5110_LIB_H__
#define __LCD5110_LIB_H__
#include "stm32f10x.h"
#include "spi_dma.h"
typedef enum
{
DC_CMD = 0,
DC_DATA = 1
} DCType;
extern vu32 TimingDelay;
#define LCD_X_RES 84
#define LCD_Y_RES 48
#define LCD_CTRL_PORT GPIOA
#define LCD_RST GPIO_Pin_1
#define LCD_CE GPIO_Pin_4
#define LCD_DC GPIO_Pin_2
#define LCD_MOSI GPIO_Pin_7
#define LCD_CLK GPIO_Pin_5
#define USESPI 1 //使能使用SPI1
#define LCD_RST_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_RST)
#define LCD_RST_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_RST)
#define LCD_CE_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_CE)
#define LCD_CE_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_CE)
#define LCD_DC_DATA() GPIO_SetBits(LCD_CTRL_PORT, LCD_DC)
#define LCD_DC_CMD() GPIO_ResetBits(LCD_CTRL_PORT, LCD_DC)
#define LCD_MOSI_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_MOSI)
#define LCD_MOSI_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_MOSI)
#define LCD_CLK_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_CLK)
#define LCD_CLK_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_CLK)
void LCD_Init(void);
void LCD_Clear(void);
void LCD_SetXY(u8 X, u8 Y);
void LCD_SetContrast(u8 contrast);
void LCD_Send(u8 data, DCType dc);
void LCD_Write_Char(u8 ascii);
void LCD_Write_EnStr(u8 X, u8 Y, u8* s);
void LCD_Write_ChStr(u8 X, u8 Y, u8 num);
void Wait_ms(u32 nTime);
void DMA_Configuration(void);
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx);
void SPI_Configuration(void);
void LCD_GPIO_Configuration(void);
void LCD_AutoLine_Entry(u8 X,u8 Y,u8* s,u16 Len);
#endif
/*********************** (C) COPYRIGHT 2010 Libraworks *************************
* File Name : LCD5110_lib.c
* Author : Libraworks
* Version : V1.0.0
* Date : 04/17/2010
* Description : This file provides the character and font library.
*******************************************************************************/
#include "LCD5110_lib.h"
DMA_InitTypeDef DMA_initstructure;
SPI_InitTypeDef SPI_InitStructure;
extern u8 SPI1_TX_Buffer[buffersize];
extern u8 SPI1_RX_Buffer[buffersize];
u8 Stry_Len=0;
/***********************************************************
>>>>> chahracter index <<<<<
(0) !(1) "(2) #(3) $(4) %(5) &(6) '(7)
((8) )(9) *(10) +(11) ,(12) -(13) .(14) /(15)
0(16) 1(17) 2(18) 3(19) 4(20) 5(21) 6(22) 7(23)
8(24) 9(25) :(26) ;(27) <(28) =(29) >(30) ?(31)
@(32) A(33) B(34) C(35) D(36) E(37) F(38) G(39)
H(40) I(41) J(42) K(43) L(44) M(45) N(46) O(47)
P(48) Q(49) R(50) S(51) T(52) U(53) V(54) W(55)
X(56) Y(57) Z(58) [(59) \(60) ](61) ^(62) _(63)
`(64) a(65) b(66) c(67) d(68) e(69) f(70) g(71)
h(72) i(73) j(74) k(75) l(76) m(77) n(78) o(79)
p(80) q(81) r(82) s(83) t(84) u(85) v(86) w(87)
x(88) y(89) z(90) {(91) |(92) }(93) ~(94)
//Font: Fixedsys
//取码规则: 低位在前, 列行扫描, 阴码(1-亮, 0-灭)
//查表方法: 要显示的ASCII码-32就可以得到字库码的指针
***********************************************************/
const unsigned char Font_code[][16] =
{
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{
0x00,0x00,0x70,0xF8,0xF8,0x70,0x00,0x00,0x00,0x00,0x00,0x0D,0x0D,0x00,0x00,0x00},
{
0x00,0x38,0x38,0x00,0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{
0x00,0x20,0xF8,0xF8,0x20,0xF8,0xF8,0x20,0x00,0x02,0x0F,0x0F,0x02,0x0F,0x0F,0x02},
{
0x00,0x30,0x78,0xCE,0x8E,0x18,0x10,0x00,0x00,0x04,0x0C,0x38,0x39,0x0F,0x06,0x00},
{
0x18,0x3C,0x24,0xBC,0xD8,0x60,0x30,0x00,0x00,0x06,0x03,0x0D,0x1E,0x12,0x1E,0x0C},
{
0x00,0xB0,0xF8,0x48,0x78,0x30,0x00,0x00,0x00,0x