WriteReg

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 HKEY hKey;
 wchar_t* sz = _T("C://program files//movestar");
 DWORD sl=100;
 DWORD dwType = REG_SZ;

 if ( ERROR_SUCCESS != RegOpenKey(HKEY_LOCAL_MACHINE,_T("SOFTWARE//Microsoft//Windows NT//CurrentVersion"),&hKey))
 {
  return 1;
 }

 if( ERROR_SUCCESS != RegSetValueEx(hKey,_T("number8"),0,dwType,(LPBYTE)sz,sl))
 {
  return 1;
 }
 RegCloseKey(hKey);
 return 0;
}

 

 

 

http://msdn.microsoft.com/en-us/library/ms724072(VS85).aspx

 

On 64-bit Windows, portions of the registry entries are stored separately for 32-bit application and 64-bit applications and mapped into separate logical registry views using the registry redirector and registry reflection, because the 64-bit version of an application may use different registry keys and values than the 32-bit version. There are also shared registry keys that are not redirected or reflected.

The parent of each 64-bit registry node is the Image-Specific Node or ISN. The registry redirector transparently directs an application's registry access to the appropriate ISN subnode. Redirection subnodes in the registry tree are created automatically by the WOW64 component using the name Wow6432Node. As a result, it is essential not to name any registry key you create Wow6432Node.

The KEY_WOW64_64KEY and KEY_WOW64_32KEY flags enable explicit access to the 64-bit registry view and the 32-bit view, respectively. For more information, see Accessing an Alternate Registry View.

To disable and enable registry reflection for a particular key, use the RegDisableReflectionKey and RegEnableReflectionKey functions. Applications should disable reflection only for the registry keys that they create and not attempt to disable reflection for the predefined keys such as HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER. To determine which keys are on the reflection list, use the RegQueryReflectionKey function.

 

Behavior of Wow6432Node in a 32-bit application

Note: When using the registry API (e.g., RegOpenKeyEx and RegEnumKeyEx) in a 32-bit application, Wow6432Node acts like a symbolic link that loops back to the same 32-bit hive. It does not map into the 64-bit hive as you might think.

For example, walking the registry tree down to HKLM/Software/Wow6432Node in a 32-bit application loops back to HKLM/Software. The result is infinite recursion: HKLM/Software/Wow6432Node/Wow6432Node/Wow6432Node/..., etc.

If you want to view the 64-bit registry hive in 32-bit code you must open HKLM/Software using KEY_WOW64_64KEY. Do not try to open Wow6432Node; it will not work.

As a general rule you should ignore any result from RegEnumKeyEx that returns "Wow6432Node". It is a magic name that triggers special behavior by the registry API.

Windows Server 2008: In the 32-bit hive the registry key HKLM/Software/Wow6432Node is hidden from RegEnumKeyEx. This fixes the infinite recursion bug described above. The hidden key still exists and the infinite recursion can still happen, but only if you explicitly open the key.

 

 The register in 64-bit Windows versions is subdivided into 32-bit and 64-bit hives. Most 32-bit hives have the same names as their counterparts in the 64-bit hives and vice versa. By default, 32-bit hives are displayed in the WOW6432Node node in 64-bit Windows versions. The redirection process is transparent for 32-bit applications, i.e. they can access the register hives as if they worked in the 32-bit environment despite the fact that the data are stored in a different place.
This behavior causes issues when 32-bit applications try to access the WOW6432Node node using of Windows API functions (for instance, RegOpenKeyEx and RegEnumKeyEx). When accessing the HKLM/Software/Wow6432Node node, the redirection mechanism is launched and an eternal loop of the "HKLM/Software/Wow6432Node/Wow6432Node/Wow6432Node/... and so on" kind occurs. You might often encounter such errors in various 32-bit register management utilities like, for instance, here or here.
Beginning with Windows Server 2008, the HKLM/Software/Wow6432Node node is hidden from the RegEnumKeyEx function, although it does not guarantee that an eternal recursion will not occur when trying to directly access this node.
But if you want to work with 64-bit register hives from a 32-bit program, you should open the HKLM/Software node using the KEY_WOW64_64KEY key. But do not try to get a direct access to WOW6432Node and avoid creating new register nodes with the same name.
As an example of an error related to WOW6432Node, consider the defect in a program system consisting of 32-bit and 64-bit units that interact with each other and use different register presentations. The following line in a 32-bit unit stopped working in one program:
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE//ODBC//ODBC.INI//ODBC Data Sources", 0,KEY_QUERY_VALUE,  &hKey);
To make this program friends with other 64-bit parts, you should add the KEY_WOW64_64KEY key:
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE//ODBC//ODBC.INI//ODBC Data Sources", 0,KEY_QUERY_VALUE | KEY_WOW64_64KEY,  &hKey);

在64位windows系统中,注册表分为32位和64位两部分,大多数32位和相应的64位注册表有相同的名字,反之亦然。默认在64位系统中,32位程序的注册表写在WOW6432Node节点下,这种重定向机制对32位应用程序来说是很透明的,例如:它们可以跟在32位环境中一样访问注册表,尽管存放在不同地点。
这种机制导致当32位应用程序试图通过Windows API函数(如:RegOpenKeyEx或RegEnumKeyEx)访问WOW6432Node节点出现问题。当访问HKLM/Software/Wow6432Node节点,通过重定向机制,进入死循环“HKLM/Software/Wow6432Node/Wow6432Node/Wow6432Node/...”,经常可能在各种的32位注册表管理器中遇到这种错误。
在Windows Server 2008中,HKLM/Software/Wow6432Node节点是对RegEnumKeyEx函数隐藏的,虽然这并不能保证当直接访问此节点时不会发生死循环。
但是如果想64位注册表和32位程序不冲突,应该用KEY_WOW64_64KEY打开HKLM/Software,但是不要直接访问WOW6432Node也不要创建相同名字的节点。
举一个与WOW6432Node相关的错误的例子,考虑在一个由32位和64位交互的程序组成的系统中使用不同的注册表表达式,在32位部分,下面的程序将终止执行:
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE//ODBC//ODBC.INI//ODBC Data Sources", 0,KEY_QUERY_VALUE,  &hKey);
为了与64位部分和谐相处,应该加上KEY_WOW64_64KEY关键字:
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE//ODBC//ODBC.INI//ODBC Data Sources", 0,KEY_QUERY_VALUE | KEY_WOW64_64KEY,  &hKey);

Searching for 'WriteReg'... C:\Users\mma\Desktop\test\USBPD\Target\usbpd_pwr_user.c(1069) : STUSB1602_WriteReg(port, 0x2C, val); // ??? 0x2C = VCONN Control C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(350) : LL_TIM_WriteReg(TIMx, CR1, tmpcr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(570) : LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(573) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(670) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(673) : LL_TIM_WriteReg(TIMx, SMCR, tmpsmcr); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(676) : LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(679) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(777) : LL_TIM_WriteReg(TIMx, BDTR, tmpbdtr); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(858) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(861) : LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(867) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(937) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(940) : LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(946) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1016) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1019) : LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1025) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1086) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1089) : LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1095) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1150) : LL_TIM_WriteReg(TIMx, CCMR3, tmpccmr3); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1156) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1210) : LL_TIM_WriteReg(TIMx, CCMR3, tmpccmr3); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1216) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(177) : LL_RCC_WriteReg(CFGR, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(180) : LL_RCC_WriteReg(CR, RCC_CR_HSION); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(183) : LL_RCC_WriteReg(CR, RCC_CR_HSION); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(190) : LL_RCC_WriteReg(PLLCFGR, 16U << RCC_PLLCFGR_PLLN_Pos); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(193) : LL_RCC_WriteReg(CIER, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(196) : LL_RCC_WriteReg(CICR, 0xFFFFFFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(83) : LL_EXTI_WriteReg(IMR1, 0xFFF80000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(85) : LL_EXTI_WriteReg(EMR1, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(87) : LL_EXTI_WriteReg(RTSR1, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(89) : LL_EXTI_WriteReg(FTSR1, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(91) : LL_EXTI_WriteReg(SWIER1, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(94) : LL_EXTI_WriteReg(RPR1, 0x0017FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(95) : LL_EXTI_WriteReg(FPR1, 0x0017FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(97) : LL_EXTI_WriteReg(RPR1, 0x0007FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(98) : LL_EXTI_WriteReg(FPR1, 0x0007FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(100) : LL_EXTI_WriteReg(RPR1, 0x0001FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(101) : LL_EXTI_WriteReg(FPR1, 0x0001FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(103) : LL_EXTI_WriteReg(RPR1, 0x0000FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(104) : LL_EXTI_WriteReg(FPR1, 0x0000FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(109) : LL_EXTI_WriteReg(IMR2, 0x00000003U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(111) : LL_EXTI_WriteReg(EMR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(114) : LL_EXTI_WriteReg(IMR2, 0x0000001FU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(116) : LL_EXTI_WriteReg(EMR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(118) : LL_EXTI_WriteReg(RTSR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(120) : LL_EXTI_WriteReg(FTSR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(122) : LL_EXTI_WriteReg(SWIER2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(124) : LL_EXTI_WriteReg(RPR2, 0x00000004U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(125) : LL_EXTI_WriteReg(FPR2, 0x00000004U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(128) : LL_EXTI_WriteReg(IMR2, 0x00000010U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(130) : LL_EXTI_WriteReg(EMR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_usart.h(183) : * @brief Flags defines which can be used with LL_USART_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_usart.h(242) : * @brief IT defines which can be used with LL_USART_ReadReg and LL_USART_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_usart.h(539) : #define LL_USART_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_ucpd.h(120) : * @brief IT defines which can be used with LL_UCPD_ReadReg and LL_UCPD_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_ucpd.h(311) : #define LL_UCPD_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG((__INSTANCE__)->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_tim.h(629) : * @brief IT defines which can be used with LL_TIM_ReadReg and LL_TIM_WriteReg functions. C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_tim.h(1438) : #define LL_TIM_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG((__INSTANCE__)->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_rcc.h(130) : * @brief Flags defines which can be used with LL_RCC_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_rcc.h(173) : * @brief IT defines which can be used with LL_RCC_ReadReg and LL_RCC_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_rcc.h(815) : #define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG((RCC->__REG__), (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_pwr.h(54) : * @brief Flags defines which can be used with LL_PWR_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_pwr.h(235) : #define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_lpuart.h(153) : * @brief Flags defines which can be used with LL_LPUART_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_lpuart.h(199) : * @brief IT defines which can be used with LL_LPUART_ReadReg and LL_LPUART_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_lpuart.h(431) : #define LL_LPUART_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_gpio.h(227) : #define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_exti.h(267) : #define LL_EXTI_WriteReg(__REG__, __VALUE__) WRITE_REG(EXTI->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dmamux.h(62) : * @brief Flags defines which can be used with LL_DMAMUX_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dmamux.h(122) : * @brief IT defines which can be used with LL_DMA_ReadReg and LL_DMAMUX_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dmamux.h(413) : #define LL_DMAMUX_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dma.h(165) : * @brief Flags defines which can be used with LL_DMA_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dma.h(245) : * @brief IT defines which can be used with LL_DMA_ReadReg and LL_DMA_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dma.h(363) : #define LL_DMA_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_adc.h(484) : * @brief IT defines which can be used with LL_ADC_ReadReg and LL_ADC_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_adc.h(1176) : #define LL_ADC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_usbpd_pwr.c(1830) : TCPP0203IOCtx.WriteReg = BSP_I2C_WriteReg; C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_bus.h(86) : int32_t BSP_I2C_WriteReg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length); C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_bus.h(88) : int32_t BSP_I2C_WriteReg16(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length); C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_bus.c(345) : int32_t BSP_I2C_WriteReg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_bus.c(409) : int32_t BSP_I2C_WriteReg16(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203_reg.h(68) : TCPP0203_Write_Func WriteReg; C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203_reg.c(59) : return ctx->WriteReg(ctx->handle, reg, data, length); C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.h(48) : typedef int32_t (*TCPP0203_WriteReg_Func)(uint16_t, uint16_t, uint8_t *, uint16_t); C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.h(56) : TCPP0203_WriteReg_Func WriteReg; C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(112) : static int32_t TCPP0203_WriteRegWrap(const void *handle, uint8_t Reg, uint8_t *Data, uint8_t Length); C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(146) : pObj->IO.WriteReg = pIO->WriteReg; C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(151) : pObj->Ctx.WriteReg = TCPP0203_WriteRegWrap; C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(795) : static int32_t TCPP0203_WriteRegWrap(const void *handle, uint8_t Reg, uint8_t *pData, uint8_t Length) C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(803) : return pObj->IO.WriteReg(pObj->IO.Address, Reg, pData, Length); Lines matched: 94 Files matched: 22 Total files searched: 159 这些都是关于WriteReg的,我是不是可以自己写关于 STUSB1602来开启VCONN
最新发布
08-06
#include "dcmi_ov2640.h" #include "dcmi_ov2640_cfg.h" DCMI_HandleTypeDef hdcmi; // DCMI¾ä±ú DMA_HandleTypeDef DMA_Handle_dcmi; // DMA¾ä±ú volatile uint8_t DCMI_FrameState = 0; // DCMI״̬±êÖ¾£¬µ±Êý¾ÝÖ¡´«ÊäÍê³Éʱ£¬»á±» HAL_DCMI_FrameEventCallback() Öжϻص÷º¯ÊýÖà 1 volatile uint8_t OV2640_FPS ; // Ö¡ÂÊ /************************************************************************************************* * º¯ Êý Ãû: HAL_DCMI_MspInit * Èë¿Ú²ÎÊý: hdcmi - DCMI_HandleTypeDef¶¨ÒåµÄ±äÁ¿£¬¼´±íʾ¶¨ÒåµÄ DCMI ¾ä±ú * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: ³õʼ»¯ DCMI Òý½Å * ˵ Ã÷: ÎÞ *************************************************************************************************/ void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hdcmi->Instance==DCMI) { __HAL_RCC_DCMI_CLK_ENABLE(); // ʹÄÜ DCMI ÍâÉèʱÖÓ __HAL_RCC_GPIOE_CLK_ENABLE(); // ʹÄÜÏàÓ¦µÄGPIOʱÖÓ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_OV2640_PWDN_CLK_ENABLE; // ʹÄÜPWDN Òý½ÅµÄ GPIO ʱÖÓ /**************************************************************************** Êý¾ÝÒý½Å ʱÖÓºÍͬ²½Òý½Å PH9 ------> DCMI_D0 PG9 ------> DCMI_VSYNC PH10 ------> DCMI_D1 PH8 ------> DCMI_HSYNC PH11 ------> DCMI_D2 PA6 ------> DCMI_PIXCLK PH12 ------> DCMI_D3 PH14 ------> DCMI_D4 SCCB ¿ØÖÆÒý½Å£¬³õʼ»¯ÔÚ camera_sccb.c Îļþ PD3 ------> DCMI_D5 PH7 ------> SCCB_SCL PE5 ------> DCMI_D6 PH13 ------> SCCB_SDA PE6 ------> DCMI_D7 µôµç¿ØÖÆÒý½Å PH15 ------> PWDN ******************************************************************************/ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); // ³õʼ»¯ PWDN Òý½Å OV2640_PWDN_ON; // ¸ßµçƽ£¬½øÈëµôµçģʽ£¬ÉãÏñÍ·Í£Ö¹¹¤×÷£¬´Ëʱ¹¦ºÄ½µµ½×îµÍ GPIO_InitStruct.Pin = OV2640_PWDN_PIN; // PWDN Òý½Å GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // ÍÆÍìÊä³öģʽ GPIO_InitStruct.Pull = GPIO_PULLUP; // ÉÏÀ­ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Ëٶȵȼ¶µÍ HAL_GPIO_Init(OV2640_PWDN_PORT, &GPIO_InitStruct); // ³õʼ»¯ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: MX_DCMI_Init * * º¯Êý¹¦ÄÜ: ÅäÖÃDCMIÏà¹Ø²ÎÊý * * ˵ Ã÷: 8λÊý¾Ýģʽ£¬È«Êý¾Ý¡¢È«Ö¡²¶×½£¬¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void MX_DCMI_Init(void) { hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; // Ó²¼þͬ²½Ä£Ê½£¬¼´Ê¹ÓÃÍⲿµÄVS¡¢HSÐźŽøÐÐͬ²½ hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; // ÏñËØÊ±ÖÓÉÏÉýÑØÓÐЧ hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; // VSµÍµçƽÓÐЧ hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; // HSµÍµçƽÓÐЧ hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; // ²¶»ñµÈ¼¶£¬ÉèÖÃÿһ֡¶¼½øÐв¶»ñ hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; // 8λÊý¾Ýģʽ hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE; // ²»Ê¹ÓÃDCMIµÄJPEGģʽ hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; // DCMI½Ó¿Ú²¶×½ËùÓÐÊý¾Ý hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; // Ñ¡Ôñ¿ªÊ¼×Ö½Ú£¬´Ó Ö¡/ÐÐ µÄµÚÒ»¸öÊý¾Ý¿ªÊ¼²¶»ñ hdcmi.Init.LineSelectMode = DCMI_LSM_ALL; // ²¶»ñËùÓÐÐÐ hdcmi.Init.LineSelectStart = DCMI_OELS_ODD; // Ñ¡Ôñ¿ªÊ¼ÐÐ,ÔÚÖ¡¿ªÊ¼ºó²¶»ñµÚÒ»ÐÐ HAL_DCMI_Init(&hdcmi) ; HAL_NVIC_SetPriority(DCMI_IRQn, 0 ,5); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DCMI_IRQn); // ¿ªÆôDCMIÖÐ¶Ï //// ÔÚJPGģʽÏ£¬Ò»¶¨Òªµ¥¶ÀʹÄܸÃÖÐ¶Ï // __HAL_DCMI_ENABLE_IT(&hdcmi, DCMI_IT_FRAME); // ʹÄÜ FRAME ÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Init * * º¯Êý¹¦ÄÜ: ÅäÖà DMA Ïà¹Ø²ÎÊý * * ˵ Ã÷: ʹÓõÄÊÇDMA2£¬ÍâÉèµ½´æ´¢Æ÷ģʽ¡¢Êý¾Ýλ¿í32bit¡¢²¢¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void OV2640_DMA_Init(void) { __HAL_RCC_DMA2_CLK_ENABLE(); // ʹÄÜDMA2ʱÖÓ DMA_Handle_dcmi.Instance = DMA2_Stream7; // DMA2Êý¾ÝÁ÷7 DMA_Handle_dcmi.Init.Request = DMA_REQUEST_DCMI; // DMAÇëÇóÀ´×ÔDCMI DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; // ÍâÉèµ½´æ´¢Æ÷ģʽ DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; // ÍâÉèµØÖ·½ûÖ¹×ÔÔö DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE; // ´æ´¢Æ÷µØÖ·×ÔÔö DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // DCMIÊý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // ´æ´¢Æ÷Êý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê½ DMA_Handle_dcmi.Init.Priority = DMA_PRIORITY_LOW; // ÓÅÏȼ¶µÍ DMA_Handle_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; // ʹÄÜfifo DMA_Handle_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // È«fifoģʽ£¬4*32bit´óС DMA_Handle_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; // µ¥´Î´«Êä DMA_Handle_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; // µ¥´Î´«Êä HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA __HAL_LINKDMA(&hdcmi, DMA_Handle, DMA_Handle_dcmi); // ¹ØÁªDCMI¾ä±ú HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); // ʹÄÜÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Delay * Èë¿Ú²ÎÊý: Delay - ÑÓʱʱ¼ä£¬µ¥Î» ms * º¯Êý¹¦ÄÜ: ¼òµ¥ÑÓʱº¯Êý£¬²»ÊǺܾ«È· * ˵ Ã÷: ΪÁËÒÆÖ²µÄ¼ò±ãÐÔ,´Ë´¦²ÉÓÃÈí¼þÑÓʱ£¬Êµ¼ÊÏîÄ¿ÖпÉÒÔÌæ»»³ÉRTOSµÄÑÓʱ»òÕßHAL¿âµÄÑÓʱ *****************************************************************************************************************************************/ void OV2640_Delay(volatile uint32_t Delay) { volatile uint16_t i; while (Delay --) { for (i = 0; i < 20000; i++); } // HAL_Delay(Delay); // ¿ÉʹÓÃHAL¿âµÄÑÓʱ } /*************************************************************************************************************************************** * º¯ Êý Ãû: DCMI_OV2640_Init * * º¯Êý¹¦ÄÜ: ³õʼSCCB¡¢DCMI¡¢DMAÒÔ¼°ÅäÖÃOV2640 * *****************************************************************************************************************************************/ int8_t DCMI_OV2640_Init(void) { uint16_t Device_ID; // ¶¨Òå±äÁ¿´æ´¢Æ÷¼þID SCCB_GPIO_Config(); // SCCBÒý½Å³õʼ»¯ MX_DCMI_Init(); // ³õʼ»¯DCMIÅäÖÃÒý½Å OV2640_DMA_Init(); // ³õʼ»¯DMAÅäÖà OV2640_Reset(); // Ö´ÐÐÈí¼þ¸´Î» Device_ID = OV2640_ReadID(); // ¶ÁÈ¡Æ÷¼þID if( (Device_ID == 0x2640) || (Device_ID == 0x2642) ) // ½øÐÐÆ¥Å䣬ʵ¼ÊµÄÆ÷¼þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642 { printf ("OV2640 OK,ID:0x%X\r\n",Device_ID); // Æ¥Åäͨ¹ý OV2640_Config( OV2640_SVGA_Config ); // ÅäÖà SVGAģʽ ------> 800*600£¬ ×î´óÖ¡ÂÊ30Ö¡ // OV2640_Config( OV2640_UXGA_Config ); // ÅäÖà UXGAģʽ ------> 1600*1200£¬×î´óÖ¡ÂÊ15Ö¡ OV2640_Set_Framesize(OV2640_Width,OV2640_Height); // ÉèÖÃOV2640Êä³öµÄͼÏñ´óС OV2640_DCMI_Crop(Display_Width, Display_Height, OV2640_Width, OV2640_Height ); // ½«OV2640Êä³öͼÏñ²Ã¼ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС return OV2640_Success; // ·µ»Ø³É¹¦±êÖ¾ } else { printf ("OV2640 ERROR!!!!! ID:%X\r\n",Device_ID); // ¶ÁÈ¡ID´íÎó return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Continuous * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ·£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óС£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬Á¬ÐøÄ£Ê½ * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬»áÒ»Ö±½øÐд«Ê䣬³ý·Ç¹ÒÆð»òÕßÍ£Ö¹DCMI * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ *LXB *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Continuous(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê½ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA // ʹÄÜDCMI²É¼¯Êý¾Ý,Á¬Ðø²É¼¯Ä£Ê½ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Snapshot * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ·£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óС£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬¿ìÕÕģʽ£¬´«Êäһ֡ͼÏñºóÍ£Ö¹ * * ˵ Ã÷: 1. ¿ìÕÕģʽ£¬Ö»´«ÊäÒ»Ö¡µÄÊý¾Ý * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ * 4. ʹÓøÃģʽ´«ÊäÍê³ÉÖ®ºó£¬DCMI»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ÐèÒªµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Snapshot(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_NORMAL; // Õý³£Ä£Ê½ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Suspend * * º¯Êý¹¦ÄÜ: ¹ÒÆðDCMI£¬Í£Ö¹²¶»ñÊý¾Ý * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬ÔÙµ÷Óøú¯Êý£¬»áÍ£Ö¹²¶»ñDCMIµÄÊý¾Ý * 2. ¿ÉÒÔµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * 3. ÐèҪעÒâµÄ£¬¹ÒÆðDCMIÆÚ¼ä£¬DMAÊÇûÓÐÍ£Ö¹¹¤×÷µÄ *LXB *****************************************************************************************************************************************/ void OV2640_DCMI_Suspend(void) { HAL_DCMI_Suspend(&hdcmi); // ¹ÒÆðDCMI } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Resume * * º¯Êý¹¦ÄÜ: »Ö¸´DCMI£¬¿ªÊ¼²¶»ñÊý¾Ý * * ˵ Ã÷: 1. µ±DCMI±»¹ÒÆðʱ£¬¿ÉÒÔµ÷Óøú¯Êý»Ö¸´ * 2. ʹÓà OV2640_DMA_Transmit_Snapshot() ¿ìÕÕģʽ£¬´«ÊäÍê³ÉÖ®ºó£¬DCMIÒ²»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ * ÐèÒªµ÷Óñ¾º¯Êý»Ö¸´DCMI²¶»ñ * *****************************************************************************************************************************************/ void OV2640_DCMI_Resume(void) { (&hdcmi)->State = HAL_DCMI_STATE_BUSY; // ±ä¸üDCMI±êÖ¾ (&hdcmi)->Instance->CR |= DCMI_CR_CAPTURE; // ¿ªÆôDCMI²¶»ñ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Stop * * º¯Êý¹¦ÄÜ: ½ûÖ¹DCMIµÄDMAÇëÇó£¬Í£Ö¹DCMI²¶»ñ£¬½ûÖ¹DCMIÍâÉè * *****************************************************************************************************************************************/ void OV2640_DCMI_Stop(void) { HAL_DCMI_Stop(&hdcmi); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Crop * * Èë¿Ú²ÎÊý: Displey_XSize ¡¢Displey_YSize - ÏÔʾÆ÷µÄ³¤¿í * Sensor_XSize¡¢Sensor_YSize - ÉãÏñÍ·´«¸ÐÆ÷Êä³öͼÏñµÄ³¤¿í * * º¯Êý¹¦ÄÜ: ʹÓÃDCMIµÄ²Ã¼ô¹¦ÄÜ£¬½«´«¸ÐÆ÷Êä³öµÄͼÏñ²Ã¼ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС * * ˵ Ã÷: 1. ÒòΪÉãÏñÍ·Êä³öµÄ»­Ãæ±ÈÀý¹Ì¶¨Îª4:3£¬²»Ò»¶¨Æ¥ÅäÏÔʾÆ÷ * 2. ÐèҪעÒâµÄÊÇ£¬ÉãÏñÍ·Êä³öµÄͼÏñ³¤¡¢¿í±ØÐëÒªÄܱ»4Õû³ý£¡£¨ ʹÓÃOV2640_Set_Framesizeº¯Êý½øÐÐÉèÖà £© * 3. DCMIµÄˮƽÓÐЧÏñËØÒ²±ØÐëÒªÄܱ»4Õû³ý£¡ * 4. º¯Êý»á¼ÆËãˮƽºÍ´¹Ö±Æ«ÒÆ£¬¾¡Á¿Èû­Ãæ¾ÓÖвüô *****************************************************************************************************************************************/ int8_t OV2640_DCMI_Crop(uint16_t Displey_XSize,uint16_t Displey_YSize,uint16_t Sensor_XSize,uint16_t Sensor_YSize ) { uint16_t DCMI_X_Offset,DCMI_Y_Offset; // ˮƽºÍ´¹Ö±Æ«ÒÆ£¬´¹Ö±´ú±íµÄÊÇÐÐÊý£¬Ë®Æ½´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_CAPCNT; // ˮƽÓÐЧÏñËØ£¬´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_VLINE; // ´¹Ö±ÓÐЧÐÐÊý if( (Displey_XSize>=Sensor_XSize)|| (Displey_YSize>=Sensor_YSize) ) { // printf("ʵ¼ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬Í˳öDCMI²Ã¼ô\r\n"); return OV2640_Error; //Èç¹ûʵ¼ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬ÔòÍ˳öµ±Ç°º¯Êý£¬²»½øÐвüô } // ÔÚÉèÖÃΪRGB565¸ñʽʱ£¬Ë®Æ½Æ«ÒÆ£¬±ØÐëÊÇÆæÊý£¬·ñÔò»­ÃæÉ«²Ê²»ÕýÈ·£¬ // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔ±ØÐë´ÓÆæÊýλ¿ªÊ¼£¬²»È»Êý¾Ý»á´íÂÒ£¬ // ÐèҪעÒâµÄÊÇ£¬¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ £¡ DCMI_X_Offset = Sensor_XSize - Displey_XSize; // ʵ¼Ê¼ÆËã¹ý³ÌΪ£¨Sensor_XSize - LCD_XSize£©/2*2 // ¼ÆËã´¹Ö±Æ«ÒÆ£¬¾¡Á¿Èû­Ãæ¾ÓÖвüô£¬¸ÃÖµ´ú±íµÄÊÇÐÐÊý£¬ DCMI_Y_Offset = (Sensor_YSize - Displey_YSize)/2-1; // ¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔÒª³Ë2 // ×îÖյõ½µÄ¼Ä´æÆ÷Öµ£¬±ØÐëÒªÄܱ»4Õû³ý£¡ DCMI_CAPCNT = Displey_XSize*2-1; // ¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 DCMI_VLINE = Displey_YSize-1; // ´¹Ö±ÓÐЧÐÐÊý // printf("%d %d %d %d\r\n",DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE); HAL_DCMI_ConfigCrop (&hdcmi,DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE);// ÉèÖòüô´°¿Ú HAL_DCMI_EnableCrop(&hdcmi); // ʹÄܲüô return OV2640_Success; } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Reset * * º¯Êý¹¦ÄÜ: Ö´ÐÐÈí¼þ¸´Î» * * ˵ Ã÷: ÔÚÅäÖÃOV2640֮ǰ£¬ÐèÒªÖ´ÐÐÒ»´ÎÈí¼þ¸´Î» * *****************************************************************************************************************************************/ void OV2640_Reset(void) { OV2640_Delay(5); // µÈ´ýÄ£¿éÉϵçÎȶ¨£¬×îÉÙ5ms£¬È»ºóÀ­µÍPWDN OV2640_PWDN_OFF; // PWDN Òý½ÅÊä³öµÍµçƽ£¬²»¿ªÆôµôµçģʽ£¬ÉãÏñÍ·Õý³£¹¤×÷£¬´ËʱÉãÏñÍ·Ä£¿éµÄ°×É«LED»áµãÁÁ // ¸ù¾ÝOV2640µÄÉϵçʱÐò£¬Ó²¼þ¸´Î»µÄ³ÖÐøÊ±¼äÒª>=3ms£¬Â¹Ð¡°àµÄOV2640²ÉÓÃÓ²¼þRC¸´Î»£¬³ÖÐøÊ±¼ä´ó¸ÅÔÚ6ms×óÓÒ // Òò´Ë¼ÓÈëÑÓʱ£¬µÈ´ýÓ²¼þ¸´Î»Íê³É²¢Îȶ¨ÏÂÀ´ OV2640_Delay(5); SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é SCCB_WriteReg( OV2640_SENSOR_COM7, 0x80); // Æô¶¯Èí¼þ¸´Î» // ¸ù¾ÝOV2640µÄÈí¼þ¸´Î»Ê±Ðò£¬Èí¼þ¸´Î»Ö´Ðкó£¬Òª>=2ms·½¿ÉÖ´ÐÐSCCBÅäÖ㬴˴¦²ÉÓñ£ÊØÒ»µãµÄ²ÎÊý£¬ÑÓʱ10ms OV2640_Delay(10); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_ReadID * * º¯Êý¹¦ÄÜ: ¶ÁÈ¡ OV2640 µÄÆ÷¼þID * * ˵ Ã÷: ʵ¼ÊµÄÆ÷¼þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642£¬Åú´Î²»Í¬ID¿ÉÄܻ᲻һÑù * *****************************************************************************************************************************************/ uint16_t OV2640_ReadID(void) { uint8_t PID_H,PID_L; // ID±äÁ¿ SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é PID_H = SCCB_ReadReg(OV2640_SENSOR_PIDH); // ¶ÁÈ¡ID¸ß×Ö½Ú PID_L = SCCB_ReadReg(OV2640_SENSOR_PIDL); // ¶ÁÈ¡IDµÍ×Ö½Ú return(PID_H<<8)|PID_L; // ·µ»ØÍêÕûµÄÆ÷¼þID } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Config * * Èë¿Ú²ÎÊý: (*ConfigData)[2] - ÒªÅäÖõIJÎÊý£¬¿ÉÅäÖÃΪ OV2640_SVGA_Config »ò OV2640_UXGA_Config * * º¯Êý¹¦ÄÜ: ÅäÖà OV2640 ´«¸ÐÆ÷ºÍDSP²ÎÊý * * ˵ Ã÷: 1. ¿ÉÅäÖÃΪ SVGA »òÕß UXGAģʽ * 2. SVGA ·Ö±æÂÊΪ800*600£¬×î¸ßÖ§³Ö30Ö¡ * 3. UXGA ·Ö±æÂÊΪ1600*1200£¬×î¸ßÖ§³Ö15Ö¡ * 4. ²ÎÊý¶¨ÒåÔÚ dcmi_ov2640_cfg.h * *****************************************************************************************************************************************/ void OV2640_Config( const uint8_t (*ConfigData)[2] ) { uint32_t i; // ¼ÆÊý±äÁ¿ for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: pixformat - ÏñËØ¸ñʽ£¬¿ÉÑ¡Ôñ Pixformat_RGB565¡¢Pixformat_JPEG * * º¯Êý¹¦ÄÜ: ÉèÖÃÊä³öµÄÏñËØ¸ñʽ * *****************************************************************************************************************************************/ void OV2640_Set_Pixformat(uint8_t pixformat) { const uint8_t (*ConfigData)[2]; uint32_t i; // ¼ÆÊý±äÁ¿ switch (pixformat) { case Pixformat_RGB565: ConfigData = OV2640_RGB565_Config; break; case Pixformat_JPEG: ConfigData = OV2640_JPEG_Config; break; default: break; } for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: width - ʵ¼ÊÊä³öͼÏñµÄ³¤¶È£¬height - ʵ¼ÊÊä³öͼÏñµÄ¿í¶È * * º¯Êý¹¦ÄÜ: ÉèÖÃʵ¼ÊÊä³öµÄͼÏñ´óС * * ˵ Ã÷: 1. OV2640ÉèÖÃΪ SVGA£¨800*600£© »òÕß UXGA£¨1600*1200£©Ä£Ê½£¬Í¼Ïñ´óСͨ³£Óëʵ¼ÊÓÃµÄÆÁÄ»·Ö±æÂʲ»Ò»Ñù£¬ * Òò´Ë¿ÉÒÔµ÷Óôκ¯Êý£¬ÉèÖÃʵ¼ÊÊä³öµÄͼÏñ´óС * 2. ÐèҪעÒâµÄÊÇ£¬ÒªÉèÖõÄͼÏñ³¤¡¢¿í±ØÐëÄܱ»4Õû³ý£¡ * 3. ²¢²»ÊÇÉèÖÃÊä³öµÄͼÏñ·Ö±æÂÊԽС֡ÂʾÍÔ½¸ß£¬Ö¡ÂÊÖ»ºÍÅäÖõÄģʽÓйأ¬ÀýÈçÅäÖÃΪSVGA×î¸ßÖ»ÄÜÖ§³Ö30Ö¡ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Framesize(uint16_t width,uint16_t height) { if( (width%4)||(height%4) ) // Êä³öͼÏñµÄ´óСһ¶¨ÒªÄܱ»4Õû³ý { return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é SCCB_WriteReg(0X5A, width/4 &0XFF); // ʵ¼ÊͼÏñÊä³öµÄ¿í¶È£¨OUTW£©£¬7~0 bit£¬¼Ä´æÆ÷µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5B, height/4 &0XFF); // ʵ¼ÊͼÏñÊä³öµÄ¸ß¶È£¨OUTH£©£¬7~0 bit£¬¼Ä´æÆ÷µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5C, (width/4>>8&0X03)|(height/4>>6&0x04) ); // ÉèÖÃZMHHµÄBit[2:0]£¬Ò²¾ÍÊÇOUTH µÄµÚ 8 bit£¬OUTW µÄµÚ 9~8 bit£¬ SCCB_WriteReg(OV2640_DSP_RESET,0X00); // ¸´Î» return OV2640_Success; // ³É¹¦ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Horizontal_Mirror * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»áˮƽ¾µÏñ£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄͼÏñÊÇ·ñ½øÐÐˮƽ¾µÏñ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Horizontal_Mirror( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ¼Ä´æÆ÷Öµ // REG04,¼Ä´æÆ÷×é4£¬¼Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã¼Ä´æÆ÷µÄBit[7]£¬ÓÃÓÚÉèÖÃˮƽÊÇ·ñ¾µÏñ if ( ConfigState == OV2640_Enable ) // Èç¹ûʹÄܾµÏñ { OV2640_Reg |= 0X80; // Bit[7]ÖÃ1Ôò¾µÏñ } else // È¡Ïû¾µÏñ { OV2640_Reg &= ~0X80; // Bit[7]ÖÃ0ÔòÊÇÕý³£Ä£Ê½ } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Vertical_Flip * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±·­×ª£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄͼÏñÊÇ·ñ½øÐд¹Ö±·­×ª * *****************************************************************************************************************************************/ int8_t OV2640_Set_Vertical_Flip( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ¼Ä´æÆ÷Öµ // REG04,¼Ä´æÆ÷×é4£¬¼Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã¼Ä´æÆ÷µÄµÚBit[6]£¬ÓÃÓÚÉèÖÃˮƽÊÇ´¹Ö±·­×ª if ( ConfigState == OV2640_Enable ) { // ´Ë´¦ÉèÖòο¼OpenMVµÄÇý¶¯ // Bit[4]¾ßÌåµÄ×÷ÓÃÊÇʲôÊÖ²áûÓÐ˵£¬Èç¹û´¹Ö±·­×ªÖ®ºó£¬¸Ãλ²»ÖÃ1µÄ»°£¬ÑÕÉ«»á²»¶Ô OV2640_Reg |= 0X40|0x10 ; // Bit[6]ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±·­×ª } else // È¡Ïû·­×ª { OV2640_Reg &= ~(0X40|0x10 ); // ½«Bit[6]ºÍBit[4]¶¼Ð´0 } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Saturation * * Èë¿Ú²ÎÊý: Saturation - ±¥ºÍ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2.±¥ºÍ¶ÈÔ½¸ß£¬É«²Ê¾ÍÔ½ÏÊÑÞ£¬µ«µ±ÏàÓ¦µÄÇåÎú¶È»áϽµ£¬Ôëµã±ä¶à * *****************************************************************************************************************************************/ void OV2640_Set_Saturation(int8_t Saturation) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (Saturation) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Brightness * * Èë¿Ú²ÎÊý: Brightness - ÁÁ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ÁÁ¶ÈÔ½¸ß£¬»­Ãæ¾ÍÔ½Ã÷ÁÁ£¬µ«ÊÇ»á±äÄ£ºýһЩ * *****************************************************************************************************************************************/ void OV2640_Set_Brightness(int8_t Brightness) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (Brightness) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x30); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x10); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Contrast * * Èë¿Ú²ÎÊý: Contrast - ¶Ô±È¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ¶Ô±È¶ÈÔ½¸ß£¬»­ÃæÔ½ÇåÎú£¬ºÚ°×Ô½¼Ó·ÖÃ÷ * *****************************************************************************************************************************************/ void OV2640_Set_Contrast(int8_t Contrast) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (Contrast) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x0c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x24); SCCB_WriteReg(OV2640_DSP_BPDATA,0x16); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x1c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x2a); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x18); SCCB_WriteReg(OV2640_DSP_BPDATA,0x34); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Effect * * Èë¿Ú²ÎÊý: effect_Mode - ÌØÐ§Ä£Ê½£¬¿ÉÑ¡Ôñ²ÎÊý OV2640_Effect_Normal¡¢OV2640_Effect_Negative¡¢ * OV2640_Effect_BW¡¢OV2640_Effect_BW_Negative * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃOV2640µÄÌØÐ§£¬Õý³£¡¢¸ºÆ¬¡¢ºÚ°×¡¢ºÚ°×+¸ºÆ¬µÈģʽ * * ˵ Ã÷: ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * *****************************************************************************************************************************************/ void OV2640_Set_Effect(uint8_t effect_Mode) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (effect_Mode) { case OV2640_Effect_Normal: // Õý³£Ä£Ê½ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_Negative: // ¸ºÆ¬Ä£Ê½£¬Ò²¾ÍÊÇÑÕɫȫ²¿È¡·´ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW: // ºÚ°×ģʽ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x18); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW_Negative: // ºÚ°×+¸ºÆ¬Ä£Ê½ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_FrameEventCallback * * º¯Êý¹¦ÄÜ: Ö¡»Øµ÷º¯Êý£¬Ã¿´«ÊäÒ»Ö¡Êý¾Ý£¬»á½øÈë¸ÃÖжϷþÎñº¯Êý * * ˵ Ã÷: ÿ´Î´«ÊäÍêÒ»Ö¡£¬¶ÔÏàÓ¦µÄ±ê־λ½øÐвÙ×÷£¬²¢¼ÆËãÖ¡ÂÊ *****************************************************************************************************************************************/ void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) { static uint32_t DCMI_Tick = 0; // ÓÃÓÚ±£´æµ±Ç°µÄʱ¼ä¼ÆÊýÖµ static uint8_t DCMI_Frame_Count = 0; // Ö¡Êý¼ÆÊý if(HAL_GetTick() - DCMI_Tick >= 1000) // ÿ¸ô 1s ¼ÆËãÒ»´ÎÖ¡ÂÊ { DCMI_Tick = HAL_GetTick(); // ÖØÐ»ñÈ¡µ±Ç°Ê±¼ä¼ÆÊýÖµ OV2640_FPS = DCMI_Frame_Count; // »ñµÃfps DCMI_Frame_Count = 0; // ¼ÆÊýÇå0 } DCMI_Frame_Count ++; // û½øÈëÒ»´ÎÖжϣ¨Ã¿´Î´«ÊäÍêÒ»Ö¡Êý¾Ý£©£¬¼ÆÊýÖµ+1 DCMI_FrameState = 1; // ´«ÊäÍê³É±ê־λÖÃ1 } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_ErrorCallback * * º¯Êý¹¦ÄÜ: ´íÎ󻨵÷º¯Êý * * ˵ Ã÷: µ±·¢ÉúDMA´«Êä´íÎó»òÕßFIFOÒç³ö´íÎó¾Í»á½øÈë *****************************************************************************************************************************************/ void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) { // if( HAL_DCMI_GetError(hdcmi) == HAL_DCMI_ERROR_OVR) // { // printf("FIFOÒç³ö´íÎ󣡣¡£¡\r\n"); // } printf("error:0x%x£¡£¡£¡\r\n",HAL_DCMI_GetError(hdcmi)); } /*********************************************************************************************************************************************************************************************************************************************LXB*************/ // ¹С°à 代码分析
05-12
#include <reg52.h> #include <intrins.h> #include <string.h> // 引脚定义 sbit K1 = P3^0; // 状态切换 sbit K2 = P3^1; // 增加/长按确认 sbit K3 = P3^2; // 移位/复位 sbit K4 = P3^3; // 低功耗模式 sbit BEEP = P1^0; // 蜂鸣器 sbit LED = P1^1; // 低功耗指示灯 // LCD1602引脚定义 sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; #define LCD_DATA P0 // DS1302引脚定义 sbit RST = P1^5; sbit IO = P1^6; sbit SCLK = P1^7; // DS18B20引脚定义 sbit DQ = P3^7; // 全局变量 unsigned char display_state = 0; // 0:日期 1:时间 2:温度 3:闹钟 4:倒计时 unsigned char setting_pos = 0; // 设置位置 bit setting_mode = 0; // 设置模式标志 bit low_power = 0; // 低功耗模式标志 bit alarm_on = 0; // 报警标志 unsigned int timer_minutes = 10; // 倒计时值(分钟) unsigned char alarm_h = 7, alarm_m = 0, alarm_s = 0; // 闹钟时间 bit blink = 0; // 闪烁控制变量 unsigned int power_off_timer = 0; // 低功耗计时器 unsigned int beep_counter = 0; // 蜂鸣器计数器 unsigned char beep_freq = 10; // 蜂鸣器频率 unsigned int no_reset_counter = 0; // 未复位计数器 unsigned char key_state[4] = {0}; // 按键状态数组 unsigned int key_press_time = 0; // 修复:将key_press_time声明为全局变量 // 时间结构体 struct Time { unsigned char year, month, day; unsigned char hour, minute, second; } current_time; char buf[17]; // LCD每行16字符+结束符 // 自定义字符串函数 void int_to_str(unsigned int num, unsigned char digits, char *str) { unsigned char i; for(i = digits; i > 0; i--) { str[i-1] = (num % 10) + '0'; num /= 10; } str[digits] = '\0'; } void float_to_str(float f, unsigned char int_digits, unsigned char frac_digits, char *str) { unsigned int int_part = (unsigned int)f; unsigned int frac_part = (unsigned int)((f - int_part) * 100); int_to_str(int_part, int_digits, str); str[int_digits] = '.'; int_to_str(frac_part, frac_digits, str + int_digits + 1); } void str_concat(char *dest, const char *src) { while(*dest) dest++; while(*src) { *dest = *src; dest++; src++; } *dest = '\0'; } // LCD1602基础函数 void LCD_Delay(unsigned int t) { while(t--); } void LCD_WriteCmd(unsigned char cmd) { RS = 0; RW = 0; LCD_DATA = cmd; EN = 1; LCD_Delay(5); EN = 0; } void LCD_WriteData(unsigned char dat) { RS = 1; RW = 0; LCD_DATA = dat; EN = 1; LCD_Delay(5); EN = 0; } void LCD_Init() { LCD_WriteCmd(0x38); // 8位数据,双行显示 LCD_WriteCmd(0x0C); // 开显示,关光标 LCD_WriteCmd(0x06); // 增量不移位 LCD_WriteCmd(0x01); // 清屏 } void LCD_ShowStr(unsigned char x, unsigned char y, char *str) { if (y == 0) LCD_WriteCmd(0x80 + x); else LCD_WriteCmd(0xC0 + x); while (*str) { LCD_WriteData(*str++); } } // DS1302基础函数 void DS1302_WriteByte(unsigned char dat) { unsigned char i; for(i=0; i<8; i++) { IO = dat & 0x01; dat >>= 1; SCLK = 1; _nop_(); SCLK = 0; _nop_(); } } unsigned char DS1302_ReadByte() { unsigned char i, dat = 0; for(i=0; i<8; i++) { dat >>= 1; if(IO) dat |= 0x80; SCLK = 1; _nop_(); SCLK = 0; _nop_(); } return dat; } void DS1302_WriteReg(unsigned char addr, unsigned char dat) { RST = 0; _nop_(); SCLK = 0; _nop_(); RST = 1; _nop_(); DS1302_WriteByte(addr); DS1302_WriteByte(dat); SCLK = 1; _nop_(); RST = 0; _nop_(); } unsigned char DS1302_ReadReg(unsigned char addr) { unsigned char dat; RST = 0; _nop_(); SCLK = 0; _nop_(); RST = 1; _nop_(); DS1302_WriteByte(addr | 0x01); dat = DS1302_ReadByte(); SCLK = 1; _nop_(); RST = 0; _nop_(); return dat; } // BCD转十进制 unsigned char BCD2Dec(unsigned char bcd) { return (bcd >> 4) * 10 + (bcd & 0x0F); } // 十进制转BCD unsigned char Dec2BCD(unsigned char dec) { return ((dec / 10) << 4) | (dec % 10); } void DS1302_GetTime(struct Time *t) { t->second = BCD2Dec(DS1302_ReadReg(0x81)); t->minute = BCD2Dec(DS1302_ReadReg(0x83)); t->hour = BCD2Dec(DS1302_ReadReg(0x85)); t->day = BCD2Dec(DS1302_ReadReg(0x87)); t->month = BCD2Dec(DS1302_ReadReg(0x89)); t->year = BCD2Dec(DS1302_ReadReg(0x8D)); } // DS18B20基础函数 void DS18B20_Delay(unsigned int t) { while(t--); } bit DS18B20_Init() { bit ack; DQ = 1; DS18B20_Delay(8); DQ = 0; DS18B20_Delay(80); DQ = 1; DS18B20_Delay(14); ack = DQ; DS18B20_Delay(20); return ack; } void DS18B20_WriteByte(unsigned char dat) { unsigned char i; for(i=0; i<8; i++) { DQ = 0; _nop_(); DQ = dat & 0x01; DS18B20_Delay(5); DQ = 1; dat >>= 1; } DS18B20_Delay(5); } unsigned char DS18B20_ReadByte() { unsigned char i, dat = 0; for(i=0; i<8; i++) { dat >>= 1; DQ = 0; _nop_(); DQ = 1; _nop_(); if(DQ) dat |= 0x80; DS18B20_Delay(5); } return dat; } // DS18B20温度读取函数 float DS18B20_GetTemp() { unsigned char LSB, MSB; int temp; float f_temp; unsigned int timeout; // 将timeout声明放在函数开头 if(!DS18B20_Init()) return -99.9; // 初始化失败 DS18B20_WriteByte(0xCC); // Skip ROM DS18B20_WriteByte(0x44); // Convert // 等待转换完成 (750ms) timeout = 750; while(timeout > 0) { // 修复timeout未定义问题 DS18B20_Delay(1000); if(!DQ) break; // 转换完成DQ变低 timeout--; } if(!DS18B20_Init()) return -99.9; // 初始化失败 DS18B20_WriteByte(0xCC); DS18B20_WriteByte(0xBE); // Read Scratchpad LSB = DS18B20_ReadByte(); MSB = DS18B20_ReadByte(); temp = (MSB << 8) | LSB; f_temp = temp * 0.0625; return f_temp; } // 按键处理函数 (非阻塞式) void Key_Process() { // K1处理 - 状态切换 (功能4) if(!K1) { if(key_state[0] == 0) { // K1首次按下 key_state[0] = 1; display_state = (display_state + 1) % 5; setting_mode = (display_state == 3 || display_state == 4); if(setting_mode) setting_pos = 0; // 进入设置模式时重置位置 LCD_WriteCmd(0x01); // 清屏 } } else { key_state[0] = 0; } // K2处理 - 增加/长按确认 (功能4) if(!K2) { if(key_state[1] == 0) { // K2首次按下 key_state[1] = 1; key_press_time = 0; } else { key_press_time++; // 长按超过3秒 if(key_press_time > 300) { // 假设10ms中断,3000ms setting_mode = 0; display_state = 0; // 返回日期模式 LCD_WriteCmd(0x01); key_state[1] = 0; key_press_time = 0; } } // 短按处理 (仅在设置模式) (功能4) if(key_state[1] == 1 && setting_mode) { if(display_state == 3) { // 闹钟设置 switch(setting_pos) { case 0: alarm_h = (alarm_h + 1) % 24; break; case 1: alarm_m = (alarm_m + 1) % 60; break; case 2: alarm_s = (alarm_s + 1) % 60; break; } } else if(display_state == 4) { // 倒计时设置 if(setting_pos == 0) timer_minutes = (timer_minutes + 1) % 1000; } } } else { key_state[1] = 0; } // K3处理 - 移位/复位 (功能5) if(!K3) { if(key_state[2] == 0) { // K3首次按下 key_state[2] = 1; if(setting_mode) { setting_pos = (setting_pos + 1) % 3; // 循环移位 } else if(alarm_on) { alarm_on = 0; // 清除报警 BEEP = 0; // 关闭蜂鸣器 beep_freq = 10; // 重置频率 no_reset_counter = 0; // 复位未响应计数器 } } } else { key_state[2] = 0; } // K4处理 - 低功耗模式 (功能6) if(!K4) { if(key_state[3] == 0) { // K4首次按下 key_state[3] = 1; low_power = !low_power; LED = low_power; // LED指示状态 power_off_timer = 0; if(!low_power) { LCD_WriteCmd(0x0C); // 恢复显示 } } } else { key_state[3] = 0; } } // 显示处理函数 (功能3) void Display_Process() { char temp_buf[6]; // 临时数字缓冲区 buf[0] = '\0'; // 清空主缓冲区 switch(display_state) { case 0: // 日期信息 str_concat(buf, "Data: 20"); int_to_str(current_time.year, 2, temp_buf); str_concat(buf, temp_buf); str_concat(buf, "-"); int_to_str(current_time.month, 2, temp_buf); str_concat(buf, temp_buf); str_concat(buf, "-"); int_to_str(current_time.day, 2, temp_buf); str_concat(buf, temp_buf); break; case 1: // 时间信息 str_concat(buf, "Time: "); int_to_str(current_time.hour, 2, temp_buf); str_concat(buf, temp_buf); str_concat(buf, ":"); int_to_str(current_time.minute, 2, temp_buf); str_concat(buf, temp_buf); str_concat(buf, ":"); int_to_str(current_time.second, 2, temp_buf); str_concat(buf, temp_buf); break; case 2: // 温度信息 { float temp = DS18B20_GetTemp(); if(temp < -50) { str_concat(buf, "Temp: --.-- C"); } else { str_concat(buf, "Temp: "); float_to_str(temp, 2, 2, temp_buf); str_concat(buf, temp_buf); str_concat(buf, " C"); } } break; case 3: // 闹钟设置 (功能4) str_concat(buf, "Alarm: "); if(setting_mode && blink) { switch(setting_pos) { case 0: str_concat(buf, "--"); break; default: int_to_str(alarm_h, 2, temp_buf); str_concat(buf, temp_buf); } str_concat(buf, ":"); switch(setting_pos) { case 1: str_concat(buf, "--"); break; default: int_to_str(alarm_m, 2, temp_buf); str_concat(buf, temp_buf); } str_concat(buf, ":"); switch(setting_pos) { case 2: str_concat(buf, "--"); break; default: int_to_str(alarm_s, 2, temp_buf); str_concat(buf, temp_buf); } } else { int_to_str(alarm_h, 2, temp_buf); str_concat(buf, temp_buf); str_concat(buf, ":"); int_to_str(alarm_m, 2, temp_buf); str_concat(buf, temp_buf); str_concat(buf, ":"); int_to_str(alarm_s, 2, temp_buf); str_concat(buf, temp_buf); } break; case 4: // 倒计时设置 (功能4) str_concat(buf, "Timer: "); if(setting_mode && blink) { str_concat(buf, "---"); } else { int_to_str(timer_minutes, 3, temp_buf); str_concat(buf, temp_buf); } str_concat(buf, " min"); break; } buf[16] = '\0'; LCD_ShowStr(0, 0, buf); } // 报警处理 (功能7) void Alarm_Process() { if(alarm_on) { beep_counter++; // 基础报警 if(beep_counter % (500/beep_freq) == 0) { BEEP = !BEEP; } // 5秒内未按下K3则增加频率 (功能7) if(no_reset_counter++ > 500) { // 5秒 no_reset_counter = 0; if(beep_freq < 50) beep_freq += 5; // 增加频率 } } else { BEEP = 0; // 关闭蜂鸣器 } } // 低功耗处理 (功能6) void LowPower_Process() { static unsigned char blink_count = 0; if(low_power) { power_off_timer++; // 10秒后闪烁息屏 if(power_off_timer > 1000) { // 10秒 // 闪烁3次后息屏 if(blink_count < 3) { LCD_WriteCmd(0x08); // 关显示 LCD_Delay(50000); LCD_WriteCmd(0x0C); // 开显示 blink_count++; } else if(blink_count == 3) { LCD_WriteCmd(0x08); // 息屏 blink_count++; } } } else { blink_count = 0; } } // 倒计时处理 void Timer_Process() { static unsigned int second_counter = 0; static unsigned int seconds_remaining = 0; // 将声明移到函数开头 if(timer_minutes > 0 && !alarm_on) { if(++second_counter >= 100) { // 1秒 second_counter = 0; if(seconds_remaining == 0) { timer_minutes--; seconds_remaining = 59; if(timer_minutes == 0) { alarm_on = 1; // 触发报警 no_reset_counter = 0; // 重置未响应计数器 } } else { seconds_remaining--; } } } } // 主函数 void main() { // 初始化 LCD_Init(); DS1302_WriteReg(0x8E, 0x00); // 允许写操作 // 设置初始时间 (2023-12-25 08:30:00) DS1302_WriteReg(0x8C, Dec2BCD(23)); // 2023年 DS1302_WriteReg(0x88, Dec2BCD(12)); // 12月 DS1302_WriteReg(0x86, Dec2BCD(25)); // 25日 DS1302_WriteReg(0x84, Dec2BCD(8)); // 08时 DS1302_WriteReg(0x82, Dec2BCD(30)); // 30分 DS1302_WriteReg(0x80, Dec2BCD(0)); // 00秒 DS1302_WriteReg(0x8E, 0x80); // 写保护 // 定时器0初始化 (10ms中断) TMOD = 0x01; TH0 = 0xDC; TL0 = 0x00; ET0 = 1; EA = 1; TR0 = 1; // 初始显示 DS1302_GetTime(&current_time); LCD_ShowStr(0, 0, "Multifunction Clock"); LCD_ShowStr(0, 1, " Initializing... "); LCD_Delay(200000); LCD_WriteCmd(0x01); // 清屏 while(1) { Key_Process(); Display_Process(); Alarm_Process(); LowPower_Process(); Timer_Process(); } } // 定时器0中断服务程序 (10ms) void Timer0_ISR() interrupt 1 { static unsigned int ms_count = 0; static unsigned int blink_count = 0; static unsigned int temp_update = 0; // 重装定时器 TH0 = 0xDC; TL0 = 0x00; // 闪烁控制 (0.5秒周期) (功能4) if(++blink_count >= 50) { blink_count = 0; blink = !blink; } // 时间更新 (每秒) if(++ms_count >= 100) { // 1秒 ms_count = 0; DS1302_GetTime(&current_time); // 检查闹钟 (功能1) if(current_time.hour == alarm_h && current_time.minute == alarm_m && current_time.second == alarm_s) { alarm_on = 1; no_reset_counter = 0; // 重置未响应计数器 } // 温度更新 (每5秒) if(++temp_update >= 5) { temp_update = 0; // 温度在显示函数中读取 } } } 这段多功能时钟的数据无法在普中51单片机的LCD1602显示屏上显示出来,请找出问题并进行程序修改,程序要适用于keil软件,写出修改后的完整程序
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值