嵌入式系统课程设计实验报告题目基于STM32的LCD数字钟显示姓名刘意学号 **************** ___专业年级 12电科指导教师卢仕2015年 6 月 30日1.实验名称:基于STM32的LCD数字钟显示2.实验目的与要求:(1)掌握嵌入式程序设计流程。
熟悉并掌握软件的开发,如GPIO的端口配置,FSMC的编程,RA8875初始化等等。
(2)学习LCD与STM32的LCD的控制器的接口原理,掌握内置LCD 控制器驱动编写方法。
(3)编写程序实现电子时钟功能,通过实验系统的LCD将时间显示出来。
3.实验设备及原理:硬件:PC机一台STM32开发板一套软件:keil4原理:LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。
因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使用光线通过。
本次实验使用RA8875驱动LCD,采用FSMC模式向RA8875发送指令,读取状态和数据。
通过程序代码实现对TFTLCD的控制器RA8875驱动要求,从而达到TFT LCD 数字钟的显示。
4.实验步骤及内容:1.新建工程文件夹szz,并建立4个子文件夹,并复制粘贴库文件和驱动文件。
2.打开keil4,新建工程。
工程名为szz.芯片选取STM3210F103VC。
3.完成基础设置4. 添加LCD.H和LCD.C两个文件,并加入工程中,编写LCD.H文件.LCD.H:#ifndef __GLCD_H#define __GLCD_H#include "stm32f10x.h"/* LCD color */颜色定义#define White 0xFFFF#define Black 0x0000#define Grey 0xF7DE#define Blue 0x001F#define Blue2 0x051F#define Red 0xF800#define Magenta 0xF81F#define Green 0x07E0#define Cyan 0x7FFF#define Yellow 0xFFE0#define HZ_LIB 1#define ASCII_LIB 1#define RGB565CONVERT(red, green, blue) (int) (((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3))/* Private function prototypes -----------------------------------------------*/void LCD_Initializtion(void);void LCD_Clear(uint16_t Color);uint16_t LCD_GetPoint(uint16_t Xpos,uint16_t Ypos);void LCD_SetPoint(uint16_t Xpos,uint16_t Ypos,uint16_t point);void LCD_DrawLine(int x1, int y1, int x2, int y2,uint16_tbkColor);void LCD_SetWindows(uint16_t xStart,uint16_t yStart,uint16_t xLong,uint16_t yLong);void LCD_DrawPicture(uint16_t StartX,uint16_t StartY,uint16_t EndX,uint16_t EndY);void GUI_Text(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor);void PutChar(unsigned short Xpos,unsigned short Ypos,unsigned char c,unsigned short charColor,unsigned short bkColor); void PutChinese(uint16_t Xpos,uint16_t Ypos,uint8_t *str,uint16_t Color,uint16_t bkColor);void GUI_Chinese(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor);#endifLCD.C:1.void delay_us (int n){int i=0,j=0;for(i=0;i<n;i++)for(j=0;j<36;j++);}void delay_ms (int n){int i=0;for(i=0;i<1000;i++)delay_us(n);}// 延迟2.字符插入static unsigned char const AsciiLib[95][16] = { {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00},/*" ",0*/ 。
void GetASCIICode(unsigned char* pBuffer,unsigned char ASCII) {memcpy(pBuffer,AsciiLib[(ASCII - 32)] ,16);}3.STM32端口设置static void LCD_CtrlLinesConfig(void){GPIO_InitTypeDef GPIO_InitStructure;/* Enable FSMC, GPIOD, GPIOE and AFIO clocks */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);/* PE.06, PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9),PE.13(D10), PE.14(D11), PE.15(D12) */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | 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_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOE, &GPIO_InitStructure);/* PD.00(D2), PD.01(D3), PD.04(RD), PD.5(WR), PD.7(CS), PD.8(D13), PD.9(D14),PD.10(D15) PD.14(D0) PD.15(D1) */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_8);delay_us(10);}4.FSMC设置5.LCD,LMD各项功能设置5.主程序1.显示设置char buffer[50]={0};LCD_Initializtion();button_init();exti_config();SysTick_Config(FCLK/OSFREQ);LCD_Clear(RGB565CONVERT(0xff, 0xff, 0xff));GUI_Text(20, 200, "WuHan Different Everyday", RGB565CONVERT(0xfa,0x80,0x72),RGB565CONVERT(0x00,0xff,0xff));GUI_Text(20, 100, "ly 2012221105200045", RGB565CONVERT(0xfa,0x80,0x72),RGB565CONVERT(0x00,0xff,0xff) );2.时钟设置ms++;if(ms>=99){ms=0;sec++;if(sec>=59){sec=0;min++;if(min>=59){min=0;hour++;if(hour>=23)hour=0;}}}secg=sec%10;secs=sec/10;ming=min%10;mins=min/10;hourg=hour%10;hours=hour/10;}3.调时设置void EXTI15_10_IRQHandler(void){if((EXTI_GetITStatus(EXTI_Line13)!=RESET)||(EXTI_GetITStatu s(EXTI_Line15)!=RESET)){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0){if(min<59)min++;else{min=0;hour++;}}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0){if(hour<23)hour++;elsehour=0;}EXTI_ClearITPendingBit(EXTI_Line13);EXTI_ClearITPendingBit(EXTI_Line15);}}4.整点图像while (1){if(min==0){if(min==0){switch(sec){case 0:case 1:case 2:LCD_DrawLine(50, 240, 200,240,RGB565CONVERT(0x00, 0x00, 0xff));LCD_DrawLine(50, 240, 50, 380,RGB565CONVERT(0x00, 0x00, 0xff));LCD_DrawLine(50, 380, 200, 380,RGB565CONVERT(0x00, 0x00, 0xff));LCD_DrawLine(200, 240, 200, 380,RGB565CONVERT(0x00, 0x00, 0xff));LCD_DrawLine(80,280, 100, 280,RGB565CONVERT(0x00, 0x00, 0xff));LCD_DrawLine(150, 280, 170, 280,RGB565CONVERT(0x00, 0x00, 0xff));LCD_DrawLine(110, 350, 140, 350,RGB565CONVERT(0x00, 0x00, 0xff));break;case 3: LCD_DrawLine(50, 240, 200, 240,RGB565CONVERT(0xff, 0xff, 0xff));LCD_DrawLine(50, 240, 50, 380,RGB565CONVERT(0xff, 0xff, 0xff));LCD_DrawLine(50, 380, 200,380,RGB565CONVERT(0xff, 0xff, 0xff));LCD_DrawLine(200, 240, 200, 380,RGB565CONVERT(0xff, 0xff, 0xff));LCD_DrawLine(80,280, 100, 280,RGB565CONVERT(0xff, 0xff, 0xff));LCD_DrawLine(150, 280, 170, 280,RGB565CONVERT(0xff, 0xff, 0xff));LCD_DrawLine(110, 350, 140, 350,RGB565CONVERT(0xff, 0xff, 0xff));break;5.实验总结LCD显示的应用是多功能且设置简单的,根据LCD.C中的各种定义与功能,主程序中能实现多种操作,如划线,设置窗口,颜色,英文字符,调整位置,插于按键控制,串口设置等等。