视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
STM32实验报告
2025-09-27 08:05:52 责编:小OO
文档
嵌入式系统课程设计实验报告

题    目基于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 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,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到逐步加深对嵌入式理论知识的理解和应用,而且提高了创新和编译程序的能力。这次课程设计证明懂得了理论与实际相结合是很重要的,只有书本上理论的程序知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能真正提高自己的思考能力与程序编写能力。在设计的过程有许许多的不足,改正的过程也是一种学习,深知熟练掌握还差许多。下载本文

显示全文
专题