1 /******************************************************************************************************************************************
2 * 文件名称: SWM320_lcd.c
3 * 功能说明: SWM320单片机的LCD功能驱动库
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.1.0      2017年10月25日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include "SWM320.h"
22 #include "SWM320_lcd.h"
23 
24 #include <string.h>
25 
26 /******************************************************************************************************************************************
27 * 函数名称: LCD_Init()
28 * 功能说明: LCD初始化
29 * 输    入: LCD_TypeDef * LCDx    指定要被设置的LCD,有效值包括LCD
30 *           LCD_InitStructure * initStruct    包含LCD相关设定值的结构体
31 * 输    出: 无
32 * 注意事项: 无
33 ******************************************************************************************************************************************/
LCD_Init(LCD_TypeDef * LCDx,LCD_InitStructure * initStruct)34 void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
35 {
36     switch((uint32_t)LCDx)
37     {
38     case ((uint32_t)LCD):
39         SYS->CLKEN |= (0x01 << SYS_CLKEN_LCD_Pos);
40         break;
41     }
42 
43     LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_HPIX_Pos) |
44                 ((initStruct->VnPixel - 1) << LCD_CR0_VPIX_Pos) |
45                 (initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
46                 (initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
47 
48     LCDx->CR1 = ((initStruct->Hfp - 1) << LCD_CR1_HFP_Pos)  |
49                 ((initStruct->Hbp - 1) << LCD_CR1_HBP_Pos)  |
50                 ((initStruct->Vfp - 1) << LCD_CR1_VFP_Pos)  |
51                 ((initStruct->Vbp - 1) << LCD_CR1_VBP_Pos)  |
52                 (initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
53                 (initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
54 
55     LCDx->IE = 1;
56     LCDx->IF = 1;   //清除标志
57     if(initStruct->IntEOTEn) LCD_INTEn(LCDx);
58     else                     LCD_INTDis(LCDx);
59 
60     switch((uint32_t)LCDx)
61     {
62     case ((uint32_t)LCD):
63         if(initStruct->IntEOTEn)
64         {
65             NVIC_EnableIRQ(LCD_IRQn);
66         }
67         else
68         {
69             NVIC_DisableIRQ(LCD_IRQn);
70         }
71         break;
72     }
73 }
74 
75 /******************************************************************************************************************************************
76 * 函数名称: LCD_Start()
77 * 功能说明: 启动一次数据传输
78 * 输    入: LCD_TypeDef * LCDx    指定要被设置的LCD,有效值包括LCD
79 * 输    出: 无
80 * 注意事项: 无
81 ******************************************************************************************************************************************/
LCD_Start(LCD_TypeDef * LCDx)82 void LCD_Start(LCD_TypeDef * LCDx)
83 {
84     LCDx->START |= (1 << LCD_START_GO_Pos) | (1 << LCD_START_BURST_Pos);
85 }
86 
87 /******************************************************************************************************************************************
88 * 函数名称: LCD_IsBusy()
89 * 功能说明: 是否正在进行数据传输
90 * 输    入: LCD_TypeDef * LCDx    指定要被设置的LCD,有效值包括LCD
91 * 输    出: uint32_t          1 正在传输数据    0 数据传输已完成
92 * 注意事项: 无
93 ******************************************************************************************************************************************/
LCD_IsBusy(LCD_TypeDef * LCDx)94 uint32_t LCD_IsBusy(LCD_TypeDef * LCDx)
95 {
96     return (LCDx->START & LCD_START_GO_Msk) ? 1 : 0;
97 }
98 
99 /******************************************************************************************************************************************
100 * 函数名称: LCD_INTEn()
101 * 功能说明: LCD中断使能,完成指定长度的数据传输时触发中断
102 * 输    入: LCD_TypeDef * LCDx    指定要被设置的LCD,有效值包括LCD
103 * 输    出: 无
104 * 注意事项: 无
105 ******************************************************************************************************************************************/
LCD_INTEn(LCD_TypeDef * LCDx)106 void LCD_INTEn(LCD_TypeDef * LCDx)
107 {
108     LCDx->IM = 0;
109 }
110 
111 /******************************************************************************************************************************************
112 * 函数名称: LCD_INTDis()
113 * 功能说明: LCD中断禁止,完成指定长度的数据传输时不触发中断
114 * 输    入: LCD_TypeDef * LCDx    指定要被设置的LCD,有效值包括LCD
115 * 输    出: 无
116 * 注意事项: 无
117 ******************************************************************************************************************************************/
LCD_INTDis(LCD_TypeDef * LCDx)118 void LCD_INTDis(LCD_TypeDef * LCDx)
119 {
120     LCDx->IM = 1;
121 }
122 
123 /******************************************************************************************************************************************
124 * 函数名称: LCD_INTClr()
125 * 功能说明: LCD中断标志清除
126 * 输    入: LCD_TypeDef * LCDx    指定要被设置的LCD,有效值包括LCD
127 * 输    出: 无
128 * 注意事项: 无
129 ******************************************************************************************************************************************/
LCD_INTClr(LCD_TypeDef * LCDx)130 void LCD_INTClr(LCD_TypeDef * LCDx)
131 {
132     LCDx->IF = 1;
133 }
134 
135 /******************************************************************************************************************************************
136 * 函数名称: LCD_INTStat()
137 * 功能说明: LCD中断状态查询
138 * 输    入: LCD_TypeDef * LCDx    指定要被设置的LCD,有效值包括LCD
139 * 输    出: uint32_t          1 完成指定长度的数据传输    0 未完成指定长度的数据传输
140 * 注意事项: 无
141 ******************************************************************************************************************************************/
LCD_INTStat(LCD_TypeDef * LCDx)142 uint32_t LCD_INTStat(LCD_TypeDef * LCDx)
143 {
144     return (LCDx->IF & 0x01) ? 1 : 0;
145 }
146