-
-
-
-
-
-
-
-
-
- #include "stm32f10x_lib.h"
-
-
- #define RS GPIO_Pin_1 //P2^6-1; 4-3
- #define RW GPIO_Pin_2 //P2^5-2; 5-2
- #define EN GPIO_Pin_0 //P2^7-0; 6-1
-
-
- #define Lcd_RS(x) x ? GPIO_SetBits(GPIOB, RS): GPIO_ResetBits(GPIOB, RS)
- #define Lcd_RW(x) x ? GPIO_SetBits(GPIOB, RW): GPIO_ResetBits(GPIOB, RW)
- #define Lcd_EN(x) x ? GPIO_SetBits(GPIOB, EN): GPIO_ResetBits(GPIOB, EN)
-
-
- GPIO_InitTypeDef GPIO_InitStructure;
- ErrorStatus HSEStartUpStatus;
-
-
- typedef unsigned char BYTE;
- typedef unsigned char BOOL;
-
- BYTE dis1[] = {" WELCOME TO "};
- BYTE dis2[] = {" STM32 Lcd1602 "};
-
-
- void RCC_Configuration(void);
- void NVIC_Configuration(void);
-
-
- void delay_nus(u32 n)
- {
- u8 i;
- while(n--)
- {
- i=7;
- while(i--);
- }
- }
-
- void delay_nms(u32 n)
- {
- while(n--)
- {
- delay_nus(1100);
- }
- }
-
-
-
- BOOL Lcd_Busy()
- {
- vu8 temp = 0x00ff;
- GPIO_Write(GPIOB, 0xffff);
- Lcd_RS(0);
- delay_nus(10);
- Lcd_RW(1);
- delay_nus(10);
- Lcd_EN(1);
- delay_nus(10);
-
- while((GPIO_ReadInputData(GPIOB) & 0x8000)>>8)
- {
- delay_nus(20);
- }
-
- delay_nus(10);
- Lcd_EN(0);
- delay_nus(10);
-
- return (BOOL)0;
- }
-
- Lcd_Wcmd(vu16 cmd)
- {
-
- Lcd_EN(0);
- delay_nus(1);
- Lcd_RS(0);
- delay_nus(1);
- Lcd_RW(0);
- delay_nus(1);
-
- GPIOB->BSRR = cmd<<8 & 0xff00;
- GPIOB->BRR = ((~cmd)<<8) & 0xff00;
- delay_nus(500);
-
- Lcd_EN(1);
- delay_nms(1);
- Lcd_EN(0);
- delay_nus(100);
- }
-
- Lcd_Pos(BYTE strPos)
- {
- Lcd_Wcmd(strPos | 0x80);
- }
-
-
- Lcd_Wdat(vu16 nDat)
- {
-
- Lcd_EN(0);
- delay_nus(1);
- Lcd_RS(1);
- delay_nus(1);
- Lcd_RW(0);
- delay_nus(1);
-
- GPIOB->BSRR = nDat<<8 & 0xff00;
- GPIOB->BRR = ((~nDat)<<8) & 0xff00;
- delay_nus(500);
-
- Lcd_EN(1);
- delay_nms(1);
- Lcd_EN(0);
- delay_nus(100);
- }
-
-
- Lcd_String(BYTE *strWrite)
- {
- BYTE i;
- i = 0;
- while(strWrite[i] != '\0')
- {
- Lcd_Wdat(strWrite[i]);
- i++;
- }
- }
- Lcd_Init()
- {
- delay_nms(15);
- Lcd_Wcmd(0x38);
- delay_nms(5);
- Lcd_Wcmd(0x08);
- delay_nms(5);
- Lcd_Wcmd(0x0c);
- delay_nms(5);
-
- delay_nms(5);
- Lcd_Wcmd(0x01);
- delay_nms(5);
- }
- Test_GPIOA(vu16 *GPIOATemp)
- {
- GPIO_Write(GPIOA, *GPIOATemp);
- *GPIOATemp = *GPIOATemp << 1;
- if(*GPIOATemp > 256)
- {
- *GPIOATemp = 0x0001;
- }
- while(0);
- delay_nms(1000);
- while(0);
- }
-
-
- main()
- {
- vu16 GPIOAInitStatus = 0x0001;
-
- #ifdef DEBUG
- debug();
- #endif
-
- RCC_Configuration();
-
- NVIC_Configuration();
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);
-
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15
- | GPIO_Pin_2 | GPIO_Pin_1 | GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_Write(GPIOA,0x0000);
- GPIO_Write(GPIOB,0xffff);
-
- Lcd_Init();
-
- Lcd_Pos(0);
- Lcd_String(dis1);
- Lcd_Pos(0x40);
- Lcd_String(dis2);
-
- while(1)
- {
- Test_GPIOA(&GPIOAInitStatus);
- }
- }
-
-
-
-
- void RCC_Configuration(void)
- {
-
- RCC_DeInit();
-
-
- RCC_HSEConfig(RCC_HSE_ON);
-
-
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
-
- if(HSEStartUpStatus == SUCCESS)
- {
-
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
-
-
- FLASH_SetLatency(FLASH_Latency_2);
-
-
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
-
-
- RCC_PCLK2Config(RCC_HCLK_Div1);
-
-
- RCC_PCLK1Config(RCC_HCLK_Div2);
-
-
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
-
-
- RCC_PLLCmd(ENABLE);
-
-
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
- {
- }
-
-
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
-
-
- while(RCC_GetSYSCLKSource() != 0x08)
- {
- }
- }
- }
-
-
-
-
-
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- #ifdef VECT_TAB_RAM
-
- NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
- #else /* VECT_TAB_FLASH */
-
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
- #endif
-
-
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
-
-
-
- #ifdef DEBUG
-
-
-
-
-
-
-
-
-
- void assert_failed(u8* file, u32 line)
- {
-
-
-
-
- while (1)
- {
- }
- }
- #endif
注意:
(1)STM32驱动1602没法显示的原因之一:GPIO口直接连接1602,需要用10k的电阻上拉。
(2)写指令和写数据,差别仅仅在于RS的电平不一样而已,即引脚RS是数据和命令选择端,S应该是Select的缩写,输入参数的DATA,要么是命令,要么是数据。
(3)RW是R/W的缩写,斜杆也是选择的意思,读即R(高电平有效),写即W(低电平有效)
(4)要将E引脚置为低电平,为下一次E的高脉冲做准备,这称为释放时钟线。
(5)时序图读法:从上到下,从左到右,高电平在上,低电平在下,高阻态在中间。双线表示可能高也可能低,视数据而定。交叉线表示状态的高低变化点,可以是高变低,也可以是低变高,也可以不变。竖线是生命线,代表时序图的对象在一段时期内的存在,时序图中每个对象和底部中心都有一条垂直段的虚线,这就是对象的生命线,对象的消息存在于两条生命线之间。
(6)读写时序图之前一般需要初始化,而初始化有可能模式选择,引脚电平初始化等。
相关链接:http://hi.baidu.com/houyulin016/item/114631c0d9d3a72647d5c05f