PB15---/CS3
PB14---/CS2
PB13---/CS1
PB12---E
PB11---RW
PB10---RS
PB7-PB0 -------D7-D0
使用XRDSC-G19264DDYSWSD-1(A)显示屏。其中PB3、PB4与JTAG复用。但是已经关闭JTAG功能程序如下所示:不知道什么原因,连简单的字符都无法显示。清屏命令改成0xff。也没有显示。
#include "stm32f10x.h"
#include "delay.h"
//#define Data_Bus(data) GPIOB->BSRR = (uint32_t)((((~data) & 0xFF)<<16) | data);
#define RS_LOW GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define RS_HI GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define RW_LOW GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define RW_HI GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define E_LOW GPIO_ResetBits(GPIOB,GPIO_Pin_12)
#define E_HI GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define CS1_LOW GPIO_ResetBits(GPIOB,GPIO_Pin_13)
#define CS1_HI GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define CS2_LOW GPIO_ResetBits(GPIOB,GPIO_Pin_14)
#define CS2_HI GPIO_SetBits(GPIOB,GPIO_Pin_14)
#define CS3_LOW GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define CS3_HI GPIO_SetBits(GPIOB,GPIO_Pin_15)
/* Instuction Table */
#define LCM_ON 0x3f
#define LCM_OFF 0x3e
#define LCD_PAGE_ADDR 0xb8
#define LCD_COL_ADDR 0x40
void Write_CMD(uint8_t cmd);
void Data_Bus(uint8_t data)
{
GPIOB->BSRR = (uint32_t)((((~data) & 0xFF)<<16) | data);
}
void RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
}
void LCM_GPIO_Config(void)
{
GPIO_InitTypeDef lcm_gpio;
AFIO->MAPR |= (0x02 << 24)|(0x00 << 4);
lcm_gpio.GPIO_Pin = GPIO_Pin_All;
lcm_gpio.GPIO_Speed = GPIO_Speed_50MHz;
lcm_gpio.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&lcm_gpio);
}
uint16_t Read_Data()
{
uint16_t tmp;
E_HI;
delay_us(1);
E_LOW;
delay_us(1);
RW_HI;
RS_HI;
delay_ms(1);
E_HI;
delay_ms(1);
GPIOB->CRL = 0x44444444;
tmp = GPIO_ReadInputData(GPIOB);
GPIOB->CRL = 0x33333333;
delay_ms(1);
E_LOW;
RW_LOW;
RS_LOW;
return tmp;
}
void Wait_Ready(void)
{
uint8_t test;
E_HI;
delay_us(1);
E_LOW;
delay_us(1);
RW_HI;
RS_LOW;
delay_ms(1);
E_HI;
delay_ms(1);
Data_Bus(0xFF);
GPIOB->CRL = 0x44444444;
while((test = (uint8_t)GPIO_ReadInputData(GPIOB)) & 0x80 != 0);
GPIOB->CRL = 0x33333333;
delay_ms(1);
E_LOW;
RW_LOW;
RS_HI;
}
void Write_CMD(uint8_t cmd)
{
Wait_Ready();
E_HI;
delay_us(1);
E_LOW;
delay_us(1);
RS_LOW; //instruction
RW_LOW;
delay_us(1);
E_HI;
delay_us(1);
Data_Bus(cmd);
delay_ms(1);
E_LOW;
delay_us(1);
E_HI;
RW_HI;
RS_HI;
}
void Write_Data(uint8_t data)
{
Wait_Ready();
E_HI;
delay_us(1);
E_LOW;
delay_us(1);
RS_HI;//data
RW_LOW;//write
E_HI;
Data_Bus(data);
delay_ms(1);
E_LOW;
delay_us(1);
E_HI;
RW_HI;
RS_LOW;
}
void SelectL(void)
{
CS1_LOW;
CS2_HI;
CS3_HI;
}
void SelectM(void)
{
CS1_HI;
CS2_LOW;
CS3_HI;
}