
题 目基于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_t bkColor);
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);
#endif
LCD.C:
1.void delay_us (int n)
{
int i=0,j=0;
for(i=0;i ; } 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,0x00,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_GetITStatus(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++; else hour=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中的各种定义与功能,主程序中能实现多种操作,如划线,设置窗口,颜色,英文字符,调整位置,插于按键控制,串口设置等等。这次课程设计已经结束,但学习收获还是很大的,从不懂STM32到逐步加深对嵌入式理论知识的理解和应用,而且提高了创新和编译程序的能力。这次课程设计证明懂得了理论与实际相结合是很重要的,只有书本上理论的程序知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能真正提高自己的思考能力与程序编写能力。在设计的过程有许许多的不足,改正的过程也是一种学习,深知熟练掌握还差许多。
