奥巴小鸟free
奥巴小鸟free
关注数: 320
粉丝数: 88
发帖数: 346
关注贴吧数: 34
笔记(msp430G2553) 430+8025t很省电,15天从4v26掉到4v19
电路学 电路学的核心在于基尔霍夫定律 把基尔霍夫定律吃透,整本书都透了。不用管电抗电感、一阶二阶都是一个道理。所有内容都是围绕着这两条展开的。 简单来讲,电路学讲的是电路的某一个瞬间的值。在这个时间点上展开各种计算。电容考虑比电阻提前1/4个周期,电感比电阻滞后1/4个周期。然后比较两个之间量的大小,就成了不同的角度。这样简化后,看到电容电感的相关内容,都按照电阻考虑,只是写的过程中不一样而已,这样就方便学习了。
Arm-2D LIST VIEW /* * Copyright (c) 2009-2022 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.apache.org%2Flicenses%2FLICENSE-2.0&urlrefer=4ae836fd61d8cbb8c6ae4cd2b494f49a * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*============================ INCLUDES ======================================*/ #include "arm_2d.h" #define __RTE_ACCELERATION_ARM_2D_SCENE2__ #ifdef __RTE_ACCELERATION_ARM_2D_SCENE2__ #define __USER_SCENE2_IMPLEMENT__ #include "arm_2d_scene_2.h" #include "arm_2d_helper.h" #include "arm_extra_controls.h" #include <stdlib.h> #include <string.h> #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wunknown-warning-option" # pragma clang diagnostic ignored "-Wreserved-identifier" # pragma clang diagnostic ignored "-Wsign-conversion" # pragma clang diagnostic ignored "-Wpadded" # pragma clang diagnostic ignored "-Wcast-qual" # pragma clang diagnostic ignored "-Wcast-align" # pragma clang diagnostic ignored "-Wmissing-field-initializers" # pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" # pragma clang diagnostic ignored "-Wmissing-prototypes" # pragma clang diagnostic ignored "-Wunused-variable" # pragma clang diagnostic ignored "-Wgnu-statement-expression" # pragma clang diagnostic ignored "-Wdeclaration-after-statement" # pragma clang diagnostic ignored "-Wunused-function" # pragma clang diagnostic ignored "-Wmissing-declarations" #elif __IS_COMPILER_ARM_COMPILER_5__ #elif __IS_COMPILER_GCC__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wformat=" # pragma GCC diagnostic ignored "-Wpedantic" #endif /*============================ MACROS ========================================*/ #if __GLCD_CFG_COLOUR_DEPTH__ == 8 # define c_tileCMSISLogo c_tileCMSISLogoGRAY8 #elif __GLCD_CFG_COLOUR_DEPTH__ == 16 # define c_tileCMSISLogo c_tileCMSISLogoRGB565 #elif __GLCD_CFG_COLOUR_DEPTH__ == 32 # define c_tileCMSISLogo c_tileCMSISLogoCCCA8888 #else # error Unsupported colour depth! #endif /*============================ MACROFIED FUNCTIONS ===========================*/ #undef this #define this (*ptThis) /*============================ TYPES =========================================*/ /*============================ GLOBAL VARIABLES ==============================*/ extern const arm_2d_tile_t c_tileCMSISLogo; extern const arm_2d_tile_t c_tileCMSISLogoMask; extern const arm_2d_tile_t c_tileCMSISLogoA2Mask; extern const arm_2d_tile_t c_tileCMSISLogoA4Mask; extern const arm_2d_tile_t c_tileListCoverMask; /*============================ PROTOTYPES ====================================*/ /*============================ LOCAL VARIABLES ===============================*/ ARM_NOINIT static number_list_t s_tNumberList[3]; /*============================ IMPLEMENTATION ================================*/ static void __on_scene2_depose(arm_2d_scene_t *ptScene) { user_scene_2_t *ptThis = (user_scene_2_t *)ptScene; ARM_2D_UNUSED(ptThis); ptScene->ptPlayer = NULL; /* reset timestamp */ arm_foreach(int64_t,this.lTimestamp) { *_ = 0; } if (this.bUserAllocated) { free(ptScene); } } /*----------------------------------------------------------------------------* * Scene 2 * *----------------------------------------------------------------------------*/ static void __on_scene2_background_start(arm_2d_scene_t *ptScene) { user_scene_2_t *ptThis = (user_scene_2_t *)ptScene; ARM_2D_UNUSED(ptThis); } static void __on_scene2_background_complete(arm_2d_scene_t *ptScene) { user_scene_2_t *ptThis = (user_scene_2_t *)ptScene; ARM_2D_UNUSED(ptThis); } static void __on_scene2_frame_start(arm_2d_scene_t *ptScene) { user_scene_2_t *ptThis = (user_scene_2_t *)ptScene; ARM_2D_UNUSED(ptThis); } #include "arm_2d_scene_0.h" static void __on_scene2_frame_complete(arm_2d_scene_t *ptScene) { user_scene_2_t *ptThis = (user_scene_2_t *)ptScene; ARM_2D_UNUSED(ptThis); if (arm_2d_helper_is_time_out(100, &this.lTimestamp[0])) { numer_list_move_selection(&s_tNumberList[0], 1, 100); } if (arm_2d_helper_is_time_out(1000, &this.lTimestamp[1])) { numer_list_move_selection(&s_tNumberList[1], 1, 1000); } if (arm_2d_helper_is_time_out(10000, &this.lTimestamp[2])) { numer_list_move_selection(&s_tNumberList[2], 1, 10000); } // /* switch to next scene after 3s */ //if (arm_2d_helper_is_time_out(3000, &this.lTimestamp[2])) { //arm_2d_scene_player_switch_to_next_scene(ptScene->ptPlayer); //arm_2d_scene0_init(&DISP0_ADAPTER); //arm_2d_scene_player_switch_to_next_scene(&DISP0_ADAPTER); //} } static IMPL_PFB_ON_DRAW(__pfb_draw_scene2_background_handler) { user_scene_2_t *ptThis = (user_scene_2_t *)pTarget; ARM_2D_UNUSED(ptTile); ARM_2D_UNUSED(bIsNewFrame); /*-----------------------draw back ground begin-----------------------*/ /*-----------------------draw back ground end -----------------------*/ arm_2d_op_wait_async(NULL); return arm_fsm_rt_cpl; } static IMPL_PFB_ON_DRAW(__pfb_draw_scene2_handler) { user_scene_2_t *ptThis = (user_scene_2_t *)pTarget; ARM_2D_UNUSED(ptTile); ARM_2D_UNUSED(bIsNewFrame); /*-----------------------draw the foreground begin-----------------------*/ /* following code is just a demo, you can remove them */ arm_2d_fill_colour(ptTile, NULL, GLCD_COLOR_BLACK); arm_2d_align_centre(ptTile->tRegion, 90, 80) { __centre_region.tSize.iWidth = 30; while(arm_fsm_rt_cpl != number_list_show( &s_tNumberList[2], ptTile, &__centre_region, bIsNewFrame)); __centre_region.tLocation.iX += 30; while(arm_fsm_rt_cpl != number_list_show( &s_tNumberList[1], ptTile, &__centre_region, bIsNewFrame)); __centre_region.tLocation.iX += 30; while(arm_fsm_rt_cpl != number_list_show( &s_tNumberList[0], ptTile, &__centre_region, bIsNewFrame)); } // arm_2d_align_centre(ptTile->tRegion, 42, 26) { // arm_2d_draw_box(ptTile, &__centre_region, 2, GLCD_COLOR_GREEN, 255); // } /* draw text at the top-left corner */ arm_lcd_text_set_target_framebuffer((arm_2d_tile_t *)ptTile); arm_lcd_text_set_font(&ARM_2D_FONT_6x8); arm_lcd_text_set_colour(GLCD_COLOR_RED, GLCD_COLOR_WHITE); arm_lcd_text_location(0,0); arm_lcd_puts("Scene 2"); /*-----------------------draw the foreground end -----------------------*/ arm_2d_op_wait_async(NULL); return arm_fsm_rt_cpl; } static IMPL_PFB_ON_DRAW(__arm_2d_number_list_draw_cover) { ARM_2D_UNUSED(bIsNewFrame); number_list_t *ptThis = (number_list_t *)pTarget; arm_2d_align_centre(ptTile->tRegion, c_tileListCoverMask.tRegion.tSize) { arm_2d_fill_colour_with_mask( ptTile, &__centre_region, &c_tileListCoverMask, (__arm_2d_color_t){GLCD_COLOR_BLACK}); } arm_2d_op_wait_async(NULL); return arm_fsm_rt_cpl; } ARM_NONNULL(1) user_scene_2_t *__arm_2d_scene2_init( arm_2d_scene_player_t *ptDispAdapter, user_scene_2_t *ptScene) { bool bUserAllocated = false; assert(NULL != ptDispAdapter); /* initialize number list */ do { number_list_cfg_t tCFG = { .hwCount = 10, .nStart = 0, .iDelta = 1, .tFontColour = GLCD_COLOR_WHITE, .tBackgroundColour = GLCD_COLOR_BLACK, .chNextPadding = 3, .chPrviousePadding = 3, .tListSize = { .iHeight = 80, .iWidth = 28, }, /* draw list cover */ .fnOnDrawListCover = &__arm_2d_number_list_draw_cover, }; number_list_init(&s_tNumberList[0], &tCFG); number_list_init(&s_tNumberList[1], &tCFG); } while(0); /* initialize number list */ do { number_list_cfg_t tCFG = { .hwCount = 6, .nStart = 0, .iDelta = 1, .tFontColour = GLCD_COLOR_WHITE, .tBackgroundColour = GLCD_COLOR_BLACK, .chNextPadding = 3, .chPrviousePadding = 3, .tListSize = { .iHeight = 80, .iWidth = 28, }, /* draw list cover */ .fnOnDrawListCover = &__arm_2d_number_list_draw_cover, }; number_list_init(&s_tNumberList[2], &tCFG); } while(0); numer_list_move_selection(&s_tNumberList[0], 1, 100); numer_list_move_selection(&s_tNumberList[1], 1, 1000); numer_list_move_selection(&s_tNumberList[2], 1, 10000); /*! define dirty regions */ IMPL_ARM_2D_REGION_LIST(s_tDirtyRegions, static) /* a dirty region to be specified at runtime*/ ADD_REGION_TO_LIST(s_tDirtyRegions, 0 /* initialize at runtime later */ ), /* add the last region: * it is the top left corner for text display */ ADD_LAST_REGION_TO_LIST(s_tDirtyRegions, .tLocation = { .iX = 0, .iY = 0, }, .tSize = { .iWidth = __GLCD_CFG_SCEEN_WIDTH__, .iHeight = 8, }, ), END_IMPL_ARM_2D_REGION_LIST() /* get the screen region */ arm_2d_region_t tScreen = arm_2d_helper_pfb_get_display_area( &ptDispAdapter->use_as__arm_2d_helper_pfb_t); /* initialise dirty region 0 at runtime * this demo shows that we create a region in the centre of a screen(320*240) * for a image stored in the tile c_tileCMSISLogoMask */ s_tDirtyRegions[0].tRegion.tLocation = (arm_2d_location_t){ .iX = ((tScreen.tSize.iWidth - c_tileCMSISLogoMask.tRegion.tSize.iWidth) >> 1), .iY = ((tScreen.tSize.iHeight - c_tileCMSISLogoMask.tRegion.tSize.iHeight) >> 1), }; s_tDirtyRegions[0].tRegion.tSize = c_tileCMSISLogoMask.tRegion.tSize; if (NULL == ptScene) { ptScene = (user_scene_2_t *)malloc(sizeof(user_scene_2_t)); assert(NULL != ptScene); if (NULL == ptScene) { return NULL; } bUserAllocated = true; } else { memset(ptScene, 0, sizeof(user_scene_2_t)); } *ptScene = (user_scene_2_t){ .use_as__arm_2d_scene_t = { /* Please uncommon the callbacks if you need them */ //.fnBackground = &__pfb_draw_scene2_background_handler, .fnScene = &__pfb_draw_scene2_handler, //.ptDirtyRegion = (arm_2d_region_list_item_t *)s_tDirtyRegions, //.fnOnBGStart = &__on_scene2_background_start, //.fnOnBGComplete = &__on_scene2_background_complete, //.fnOnFrameStart = &__on_scene2_frame_start, .fnOnFrameCPL = &__on_scene2_frame_complete, .fnDepose = &__on_scene2_depose, }, .bUserAllocated = bUserAllocated, }; arm_2d_scene_player_append_scenes( ptDispAdapter, &ptScene->use_as__arm_2d_scene_t, 1); return ptScene; } #if defined(__clang__) # pragma clang diagnostic pop #endif #endif
STM32F103c8t6 SPI屏幕驱动 #include "lcd.h" #include "lcd_init.h" #include "lcd_init.h" #include "perf_counter.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_spi.h" #include "stm32f10x_rcc.h" #include "stm32f10x_conf.h" #include <stdint.h> #include <stddef.h> #include <stdbool.h> #define SYS_CLOCK_MHZ(36) #define SPI_ST7789_SPISPI1 #define SPI_ST7789_SPI_APBxClock_FUNRCC_APB2PeriphClockCmd #define SPI_ST7789_SPI_CLKRCC_APB2Periph_SPI1 #define SPI_ST7789_GPIO_APBxClock_FUNRCC_APB2PeriphClockCmd #define SPI_ST7789_GPIO_CLKRCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD //BLK #define SPI_ST7789_BLK_PINGPIO_Pin_5 #define SPI_ST7789_BLK_LOW()GPIO_ResetBits(GPIOB, SPI_ST7789_BLK_PIN) #define SPI_ST7789_BLK_HIGH()GPIO_SetBits(GPIOB, SPI_ST7789_BLK_PIN) //RST #define SPI_ST7789_RST_PINGPIO_Pin_6 #define SPI_ST7789_RST_LOW()GPIO_ResetBits(GPIOB, SPI_ST7789_RST_PIN) #define SPI_ST7789_RST_HIGH()GPIO_SetBits(GPIOB, SPI_ST7789_RST_PIN) //DC #define SPI_ST7789_DC_PINGPIO_Pin_3 #define SPI_ST7789_DC_LOW()GPIO_ResetBits(GPIOB, SPI_ST7789_DC_PIN) #define SPI_ST7789_DC_HIGH()GPIO_SetBits(GPIOB, SPI_ST7789_DC_PIN) #defineSPI_ST7789_MODE_CMD() SPI_ST7789_DC_LOW() #defineSPI_ST7789_MODE_DAT() SPI_ST7789_DC_HIGH() //CS(NSS) #define SPI_ST7789_CS_PINGPIO_Pin_4 #define SPI_ST7789_CS_LOW()GPIO_ResetBits(GPIOA, SPI_ST7789_CS_PIN) #define SPI_ST7789_CS_HIGH()GPIO_SetBits(GPIOA, SPI_ST7789_CS_PIN) //SCLK #define SPI_ST7789_SCLK_PINGPIO_Pin_5 #define SPI_ST7789_SCLK_LOW()GPIO_ResetBits(GPIOA, SPI_ST7789_SCLK_PIN) #define SPI_ST7789_SCLK_HIGH()GPIO_SetBits(GPIOA, SPI_ST7789_SCLK_PIN) //MOSI #define SPI_ST7789_MOSI_PINGPIO_Pin_7 #define SPI_ST7789_MOSI_LOW()GPIO_ResetBits(GPIOA, SPI_ST7789_MOSI_PIN) #define SPI_ST7789_MOSI_HIGH()GPIO_SetBits(GPIOA, SPI_ST7789_MOSI_PIN) //#define SPI_ST7789_BLK_LOW(); static void ST7789_DelayUs(uint32_t uiTimes) { uint16_t uiLoops; if(uiTimes > 0) { while(--uiTimes) { uiLoops = SYS_CLOCK_MHZ; while(--uiLoops) { //__nop(); } } } } void ST7789_InitializeGPIO(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_ST7789_GPIO_APBxClock_FUN(SPI_ST7789_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //Disable jtag for use PB3/4 GPIO_InitStructure.GPIO_Pin = SPI_ST7789_DC_PIN|SPI_ST7789_RST_PIN|SPI_ST7789_BLK_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, SPI_ST7789_DC_PIN|SPI_ST7789_BLK_PIN); GPIO_InitStructure.GPIO_Pin = SPI_ST7789_CS_PIN; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, SPI_ST7789_CS_PIN); GPIO_InitStructure.GPIO_Pin =SPI_ST7789_SCLK_PIN|SPI_ST7789_MOSI_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); } void ST7789_InitializeSPI(void) { SPI_InitTypeDef SPI_InitStructure; SPI_ST7789_SPI_APBxClock_FUN(SPI_ST7789_SPI_CLK, ENABLE); SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; // Transmit only SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //Master mode SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8-Bit data. SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // High-clock-signal when free. SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // Software NSS signal SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // Most Significant Bit SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI_ST7789_SPI, &SPI_InitStructure); // Initialize SPI SPI_Cmd(SPI_ST7789_SPI, ENABLE); // Enable SPI control } void ST7789_WriteByte(uint8_t uiByte) { SPI_ST7789_CS_LOW(); while(SPI_I2S_GetFlagStatus(SPI_ST7789_SPI, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI_ST7789_SPI, uiByte); while(SPI_I2S_GetFlagStatus(SPI_ST7789_SPI, SPI_I2S_FLAG_TXE) == RESET); ST7789_DelayUs(1); SPI_ST7789_CS_HIGH(); } void ST7789_WriteWord(uint16_t uiWord) { ST7789_WriteByte(uiWord>>8); ST7789_WriteByte(uiWord); } void ST7789_WriteCommand(uint8_t uiCmd) { SPI_ST7789_MODE_CMD(); ST7789_WriteByte(uiCmd); SPI_ST7789_MODE_DAT(); } void ST7789_BkgLightOn22(bool bBlkOn) { if(bBlkOn) { SPI_ST7789_BLK_LOW(); } else { SPI_ST7789_BLK_HIGH(); //SPI_ST7789_BLK_LOW(); } } void delay_ms_ss2(int time){ volatile int i = 0, j = 0; for(i=0; i < time;i++){ for(j=0;j<1000;j++){} } } void ST7789_Initialize2(void) { ST7789_InitializeSPI(); ST7789_InitializeGPIO(); ST7789_BkgLightOn22(false); SPI_ST7789_MODE_DAT(); SPI_ST7789_CS_HIGH(); SPI_ST7789_RST_LOW(); delay_ms_ss2(100); SPI_ST7789_RST_HIGH(); delay_ms_ss2(100); ST7789_WriteCommand(0x11); delay_ms_ss2(120); ST7789_WriteCommand(0x36); ST7789_WriteByte(0x70); ST7789_WriteCommand(0x3A); ST7789_WriteByte(0x05); ST7789_WriteCommand(0xB2); ST7789_WriteByte(0x0C); ST7789_WriteByte(0x0C); ST7789_WriteByte(0x00); ST7789_WriteByte(0x33); ST7789_WriteByte(0x33); ST7789_WriteCommand(0xB7); ST7789_WriteByte(0x35); ST7789_WriteCommand(0xBB); ST7789_WriteByte(0x19); ST7789_WriteCommand(0xC0); ST7789_WriteByte(0x2C); ST7789_WriteCommand(0xC2); ST7789_WriteByte(0x01); ST7789_WriteCommand(0xC3); ST7789_WriteByte(0x12); ST7789_WriteCommand(0xC4); ST7789_WriteByte(0x20); ST7789_WriteCommand(0xC6); ST7789_WriteByte(0x0F); ST7789_WriteCommand(0xD0); ST7789_WriteByte(0xA4); ST7789_WriteByte(0xA1); ST7789_WriteCommand(0xE0); ST7789_WriteByte(0xD0); ST7789_WriteByte(0x04); ST7789_WriteByte(0x0D); ST7789_WriteByte(0x11); ST7789_WriteByte(0x13); ST7789_WriteByte(0x2B); ST7789_WriteByte(0x3F); ST7789_WriteByte(0x54); ST7789_WriteByte(0x4C); ST7789_WriteByte(0x18); ST7789_WriteByte(0x0D); ST7789_WriteByte(0x0B); ST7789_WriteByte(0x1F); ST7789_WriteByte(0x23); ST7789_WriteCommand(0xE1); ST7789_WriteByte(0xD0); ST7789_WriteByte(0x04); ST7789_WriteByte(0x0C); ST7789_WriteByte(0x11); ST7789_WriteByte(0x13); ST7789_WriteByte(0x2C); ST7789_WriteByte(0x3F); ST7789_WriteByte(0x44); ST7789_WriteByte(0x51); ST7789_WriteByte(0x2F); ST7789_WriteByte(0x1F); ST7789_WriteByte(0x1F); ST7789_WriteByte(0x20); ST7789_WriteByte(0x23); ST7789_WriteCommand(0x21); ST7789_WriteCommand(0x29); } #define LCD_1IN3_SendCommand ST7789_WriteCommand #define LCD_1IN3_SendData_8Bit ST7789_WriteByte void ST7789_Initialize(void) { ST7789_InitializeSPI(); ST7789_InitializeGPIO(); ST7789_BkgLightOn22(false); SPI_ST7789_MODE_DAT(); SPI_ST7789_CS_HIGH(); SPI_ST7789_RST_LOW(); delay_ms_ss2(100); SPI_ST7789_RST_HIGH(); delay_ms_ss2(100); ST7789_WriteCommand(0x11); delay_ms_ss2(120); ST7789_WriteCommand(0x36); ST7789_WriteByte(0x70); LCD_1IN3_SendCommand(0x3A); LCD_1IN3_SendData_8Bit(0x05); LCD_1IN3_SendCommand(0xB2); LCD_1IN3_SendData_8Bit(0x0C); LCD_1IN3_SendData_8Bit(0x0C); LCD_1IN3_SendData_8Bit(0x00); LCD_1IN3_SendData_8Bit(0x33); LCD_1IN3_SendData_8Bit(0x33); LCD_1IN3_SendCommand(0xB7); //Gate Control LCD_1IN3_SendData_8Bit(0x35); LCD_1IN3_SendCommand(0xBB); //VCOM Setting LCD_1IN3_SendData_8Bit(0x19); LCD_1IN3_SendCommand(0xC0); //LCM Control LCD_1IN3_SendData_8Bit(0x2C); LCD_1IN3_SendCommand(0xC2); //VDV and VRH Command Enable LCD_1IN3_SendData_8Bit(0x01); LCD_1IN3_SendCommand(0xC3); //VRH Set LCD_1IN3_SendData_8Bit(0x12); LCD_1IN3_SendCommand(0xC4); //VDV Set LCD_1IN3_SendData_8Bit(0x20); LCD_1IN3_SendCommand(0xC6); //Frame Rate Control in Normal Mode LCD_1IN3_SendData_8Bit(0x0F); LCD_1IN3_SendCommand(0xB0); LCD_1IN3_SendData_8Bit(0x00); LCD_1IN3_SendData_8Bit(0xC8); LCD_1IN3_SendCommand(0xD0); // Power Control 1 LCD_1IN3_SendData_8Bit(0xA4); LCD_1IN3_SendData_8Bit(0xA1); LCD_1IN3_SendCommand(0xE0); //Positive Voltage Gamma Control LCD_1IN3_SendData_8Bit(0xD0); LCD_1IN3_SendData_8Bit(0x04); LCD_1IN3_SendData_8Bit(0x0D); LCD_1IN3_SendData_8Bit(0x11); LCD_1IN3_SendData_8Bit(0x13); LCD_1IN3_SendData_8Bit(0x2B); LCD_1IN3_SendData_8Bit(0x3F); LCD_1IN3_SendData_8Bit(0x54); LCD_1IN3_SendData_8Bit(0x4C); LCD_1IN3_SendData_8Bit(0x18); LCD_1IN3_SendData_8Bit(0x0D); LCD_1IN3_SendData_8Bit(0x0B); LCD_1IN3_SendData_8Bit(0x1F); LCD_1IN3_SendData_8Bit(0x23); LCD_1IN3_SendCommand(0xE1); //Negative Voltage Gamma Control LCD_1IN3_SendData_8Bit(0xD0); LCD_1IN3_SendData_8Bit(0x04); LCD_1IN3_SendData_8Bit(0x0C); LCD_1IN3_SendData_8Bit(0x11); LCD_1IN3_SendData_8Bit(0x13); LCD_1IN3_SendData_8Bit(0x2C); LCD_1IN3_SendData_8Bit(0x3F); LCD_1IN3_SendData_8Bit(0x44); LCD_1IN3_SendData_8Bit(0x51); LCD_1IN3_SendData_8Bit(0x2F); LCD_1IN3_SendData_8Bit(0x1F); LCD_1IN3_SendData_8Bit(0x1F); LCD_1IN3_SendData_8Bit(0x20); LCD_1IN3_SendData_8Bit(0x23); LCD_1IN3_SendCommand(0x21); //Display Inversion On LCD_1IN3_SendCommand(0x11); //Sleep Out LCD_1IN3_SendCommand(0x29); //Display On } void LCD_SPI_init(){ ST7789_InitializeGPIO(); ST7789_InitializeSPI(); ST7789_Initialize(); } #define ST7789_POS_OFFECT_X(40) #define ST7789_POS_OFFECT_Y(53) #define ST7789_SetArea(X1,Y1,X2,Y2)ST7789_WriteCommand(0x2A);\ ST7789_WriteWord(X1+ST7789_POS_OFFECT_X);\ ST7789_WriteWord(X2+ST7789_POS_OFFECT_X);\ ST7789_WriteCommand(0x2B);\ ST7789_WriteWord(Y1+ST7789_POS_OFFECT_Y);\ ST7789_WriteWord(Y2+ST7789_POS_OFFECT_Y);\ ST7789_WriteCommand(0x2C); typedef void(*fn_get_res_data)(uint32_t,uint8_t*,uint32_t); typedef struct _t_meminfo_t { uint32_tuiAddress; uint32_tuiLength; fn_get_res_datafnGetResData; }MEM_INFO; typedef struct _t_bmpres_t { uint16_tuiWidth; uint16_tuiHeight; MEM_INFOstRes; }BMP_RES; #define LCD_BMP_BUFFER_SIZE(64) #define LCD_COLOR_BITS(16) #define LCD_COLOR_BYTES(((LCD_COLOR_BITS-1)/8)+1) static uint8_t G_BMP_BUFFER[LCD_BMP_BUFFER_SIZE] = {0x00}; void SCREEN_DrawBitmap(int16_t iPosX, int16_t iPosY, const BMP_RES* pcstBitmapRes) { /*----------------------------------*/ /* Variable Declaration*/ /*----------------------------------*/ size_tsBmpDataLength = pcstBitmapRes->uiWidth*pcstBitmapRes->uiHeight*LCD_COLOR_BYTES; size_tsRemainingData = sBmpDataLength; size_tsReadDataLeng; size_tsWriteIndex; uint32_tuiStartAddress = pcstBitmapRes->stRes.uiAddress; /*----------------------------------*/ /* Process*/ /*----------------------------------*/ /* Setup paint area. */ ST7789_SetArea(iPosX, iPosY, iPosX+pcstBitmapRes->uiWidth-1, iPosY+pcstBitmapRes->uiHeight-1); /* Read data and write to screen. */ while(sRemainingData > 0) { /* The length of the data to be read this time */ sReadDataLeng = (sRemainingData > LCD_BMP_BUFFER_SIZE)?LCD_BMP_BUFFER_SIZE:sRemainingData; sRemainingData = sRemainingData - sReadDataLeng; /* Read data form flash resource. */ pcstBitmapRes->stRes.fnGetResData(uiStartAddress, G_BMP_BUFFER, sReadDataLeng); sWriteIndex = 0; while(sWriteIndex < sReadDataLeng) { ST7789_WriteByte(G_BMP_BUFFER[sWriteIndex]); sWriteIndex++; } uiStartAddress += sReadDataLeng; } } void LCD_ShowPicture_Spi(int16_t iPosX, int16_t iPosY, u16 uiWidth,u16 uiHeight,const u8 pic[]) { /*----------------------------------*/ /* Variable Declaration*/ /*----------------------------------*/ u16 i,j; u32 k=0; //uint32_tuiStartAddress = pcstBitmapRes->stRes.uiAddress; /*----------------------------------*/ /* Process*/ /*----------------------------------*/ /* Setup paint area. */ ST7789_SetArea(iPosX, iPosY, iPosX+uiWidth-1, iPosY+uiHeight-1); /* Read data and write to screen. */ for(i=0;i<uiWidth;i++) { for(j=0;j<uiHeight;j++) { ST7789_WriteByte(pic[k*2]); ST7789_WriteByte(pic[k*2+1]); k++; } }//uiStartAddress += sReadDataLeng; } void LCD_ShowPicture_Spi2(u16 x,u16 y,u16 length,u16 width,const u8 pic[]) { u16 i,j; u32 k=0; LCD_Address_Set(x,y,x+length-1,y+width-1); for(i=0;i<length;i++) { for(j=0;j<width;j++) { ST7789_WriteByte(pic[k*2]); ST7789_WriteByte(pic[k*2+1]); k++; } } } void SCREEN_DrawHorizontalLine(int16_t iStartX, int16_t iEndX, int16_t iY, uint16_t uiColour) { /*----------------------------------*/ /* Variable Declaration*/ /*----------------------------------*/ int16_t iPointX; /*----------------------------------*/ /* Process*/ /*----------------------------------*/ ST7789_SetArea(iStartX, iY, iEndX, iY); for(iPointX=iStartX; iPointX<=iEndX; iPointX++) { ST7789_WriteWord(uiColour); } } #define LCD_SIZE_WIDTH(240) #define LCD_SIZE_HEIGHT(135) #define X_POS_MAX(LCD_SIZE_WIDTH-1) #define Y_POS_MAX(LCD_SIZE_HEIGHT-1) #defineDEFAULT_BKG_COLOR(0x0000) int16_t SCREEN_Initialize(void) { /*----------------------------------*/ /* Process*/ /*----------------------------------*/ ST7789_Initialize(); return 0; } void SCREEN_ClearDisplay(void) { /*----------------------------------*/ /* Variable Declaration*/ /*----------------------------------*/ int16_tiPosX; int16_tiPosY; /*----------------------------------*/ /* Process*/ /*----------------------------------*/ ST7789_SetArea(0, 0, X_POS_MAX, Y_POS_MAX); for(iPosY=0; iPosY<LCD_SIZE_HEIGHT; iPosY++) { for(iPosX=0; iPosX<LCD_SIZE_WIDTH; iPosX++) { ST7789_WriteWord(DEFAULT_BKG_COLOR); } } } void test_init(){ // Initialize screen device. SCREEN_Initialize(); // Cleanup sceen display. SCREEN_ClearDisplay(); } void SCREEN_BackgroundLightEnable(bool bBlkOn) { ST7789_BkgLightOn22(bBlkOn); } void test_bak_led(){ // Enable screen background light. SCREEN_BackgroundLightEnable(true); SPI_ST7789_BLK_HIGH(); }
数组实现链表 //数组实现链表 typedef int PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; typedef int ElementType; #define SPACESIZE 11 struct Node{ ElementType element; Position next; }; struct Node CursorSpace[SPACESIZE]={{0,1},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{0,8},{0,9},{0,10},{0,0}}; static Position CursorAlloc(void){ Position P; P = CursorSpace[0].next; CursorSpace[0].next = CursorSpace[P].next; return P; } static Position CursorFree(Position P){ CursorSpace[P].next = CursorSpace[0].next; CursorSpace[0].next = P; } bool isEmpty(List L){ return CursorSpace[L].next == 0; } //是否是最后一个元素 bool isLast(Position P,List L){ return CursorSpace[P].next == 0; } //查找链表中的元素 Position ListFind(ElementType X,List L){ Position P; P =CursorSpace[L].next; while( P && CursorSpace[P].element != X){ P = CursorSpace[P].next; } return P; } //查找X的前节点 Position FindPrevious(ElementType X,List L){ Position P; P = L; while( CursorSpace[P].next != 0 && CursorSpace[CursorSpace[P].next].element != X){ P = CursorSpace[P].next; } return P; } //删除链表中X的元素 void Delete(ElementType X,List L){ Position P,TmpCell; P = FindPrevious(X,L); if(!isLast(P,L)){ TmpCell = CursorSpace[P].next; CursorSpace[P].next = CursorSpace[TmpCell].next;; CursorFree(TmpCell); } } //在链表的位置P插入X元素 void ListInsert(ElementType X,List L,Position P){ Position TmpCell; TmpCell = CursorAlloc(); if(TmpCell == 0){ printf("Out of space\r\n"); } CursorSpace[TmpCell].element = X; CursorSpace[TmpCell].next = CursorSpace[P].next; CursorSpace[P].next = TmpCell; }
名言名句 记录一些好的名言名句!!!!!!!!
数据结构 单项链表 单项链表 typedef int ElementType; struct Node; typedef struct Node* PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; Position Header(List L); Position First(List L); Position Advance(Position P);//前进 ElementType Retrive(Position P);//检索 #endif struct Node{ ElementType element; Position next; }; bool isEmpty(List L){ return L->next == NULL; } //是否是最后一个元素 bool isLast(Position P,List L){ return P->next == NULL; } //查找链表中的元素 Position ListFind(ElementType X,List L){ Position P; P = L ->next; while( P != NULL && P->element != X){ P = P->next; } return P; } //删除链表中X的元素 void Delete(ElementType X,List L){ Position P,TmpCell; P = FindPrevious(X,L); if(!isLast(P,L)){ TmpCell = P->next; P->next = TmpCell->next; free(TmpCell); } } //查找X的前节点 Position FindPrevious(ElementType X,List L){ Position P; P = L; while( P->next != NULL && P->next->element != X){ P = P->next; } return P; } //在链表的位置P插入X元素 void ListInsert(ElementType X,List L,Position P){ Position TmpCell; TmpCell = malloc(sizeof(struct Node)); if(TmpCell == NULL){ printf("Out of space\r\n"); } TmpCell->element = X; TmpCell->next = P->next; P->next = TmpCell; } void DeleteList(List L){ Position P,TmpCell; P = L->next; L->next = NULL; while( P != NULL){ TmpCell = P->next; free(P); P = TmpCell; } } void Printf_List(List L){ int i = 0; Position TmpCell; TmpCell = L; while(TmpCell->next != NULL){ printf("%d: %d\r\n",i,TmpCell->next->element); i++; TmpCell = TmpCell->next; } } void Test_List(){ struct Node L_head = {.next = NULL}; Position p; //L_head.next = NULL; List L = &L_head; ListInsert(1,L,&L_head); ListInsert(2,L,&L_head); ListInsert(3,L,&L_head); ListInsert(4,L,&L_head); Printf_List( L); p = ListFind(3, L); printf("p= %d\r\n",p->element); Delete(3, L); Printf_List( L); } int main2(){ Test_List(); }
编译原理-------实现一个简单的 REPL 脚本语言一般都会提供一个命令行窗口,让你输入一条一条的语句,马上解释执行它,并得到输出结果,比如 Node.js、Python 等都提供了这样的界面。这个输入、执行、打印的循环过程就叫做 REPL(Read-Eval-Print Loop),今天我们也简单实现了一个可以计算a+b+c的REPL。 //========================================================================= typedef struct varTree{ int Elementkey; int varValue; char varName[20]; struct varTree* left; struct varTree* right; }varTreeNode_t; varTreeNode_t * My_varTree = NULL; varTreeNode_t* Insert(int varValue,char *varName,int X,varTreeNode_t* Tree){ if(Tree == NULL){ //create and return a one node tree Tree = malloc(sizeof(struct varTree)); if(Tree == NULL){ printf("Out of space!!!!"); }else{ Tree->varValue = varValue; strcpy(Tree->varName,varName); Tree->Elementkey = X; Tree->left = Tree->right = NULL; } }else if(X < Tree->Elementkey){ Tree->left = Insert(varValue,varName,X,Tree->left); }else if(X > Tree->Elementkey){ Tree->right = Insert(varValue,varName,X,Tree->right); }else{ //else X is in the tree already,we'll do nothing } return Tree; } varTreeNode_t* Find(char* varName,varTreeNode_t* Tree){ int X = 0,i; if(Tree == NULL){ return NULL; } for(i = 0; i < 20; i++){ X = X + varName[i]; if(varName[i] == '\0'){ break; } } if( X < Tree->Elementkey){ return Find(varName,Tree -> left); }else if( X > Tree->Elementkey){ return Find(varName,Tree -> right); }else{ return Tree; } } SimpleASTNode_t* assignmentStatement(Save_Token_t* tokens){//赋值语句a=1+3+b+5; SimpleASTNode_t* node = NULL; SimpleASTNode_t* child = NULL; Save_Token_t* token; token = tokens_fun.peek();//预读 if((token != NULL) && (token->type == Id)){ token = tokens_fun.read();//消耗掉Id node = new_SimpleASTNode_2(AssignmentStmt,token->text); token = tokens_fun.peek();//预读 if((token != NULL) && (token->type == Assignment)){ token = tokens_fun.read();//消耗掉Assignment child = additive(tokens); if(child == NULL){//出错,等号右面没有一个合法的表达式 printf("invalide assignment statement, expecting an expression"); }else{ Node_add_child(node,child); token = tokens_fun.peek();//预读 if((token != NULL) && (token->type == SemiColon)){ token = tokens_fun.read();//消耗掉; }else{//报错,缺少分号 printf("invalid statement, expecting semicolon"); } } }else{ tokens_fun.unread(); node = NULL; } } return node; } SimpleASTNode_t* intDeclarationStatement(Save_Token_t* tokens){//变量声明语句 char a = 5+3*6; SimpleASTNode_t* node = NULL; SimpleASTNode_t* child = NULL; Save_Token_t* token; int pos = tokens_fun.getPosition();//记下初始位置 token = tokens_fun.peek();//预读 if((token != NULL) && ((token->type == CHAR)||(token->type == INT))){ token = tokens_fun.read();//消耗掉int char child = assignmentStatement(tokens); if(child == NULL){ tokens_fun.unread(); node = NULL; }else{ node = new_SimpleASTNode_2(IntDeclaration,token->text); Node_add_child(node,child); } } return node; } SimpleASTNode_t* expressionStatement(Save_Token_t* tokens){//表达式语句 a+b+3; SimpleASTNode_t* node = NULL; Save_Token_t* token; int pos = tokens_fun.getPosition();//记下初始位置 node = additive(tokens);//匹配加法规则 if(node != NULL){ token = tokens_fun.peek();//预读 if((token != NULL) && (token->type == SemiColon)){ token = tokens_fun.read();//消耗掉; }else{ node = NULL; tokens_fun.setPosition(pos); } } } //遍历AST,计算值。 int evaluate(SimpleASTNode_t* node,int tab_num){ int X = 0,i; int result = 0,varValue; int value1; int value2; char *varName; SimpleASTNode_t* child; SimpleASTNode_t* child1; SimpleASTNode_t* child2; varTreeNode_t* varnode; switch(node->type){ //case CharDeclaration: //case IntDeclaration: //child = node->left; //result = evaluate(child,tab_num+1); //break; case AdditiveExp: child1 = node->left; value1 = evaluate(child1,tab_num+1); child2 = node->right; value2 = evaluate(child2,tab_num+1); if(strcmp(node->text,"+") == 0){ result = value1 + value2; }else{ result = value1 - value2; } break; case MulticativeExp: child1 = node->left; value1 = evaluate(child1,tab_num+1); child2 = node->right; value2 = evaluate(child2,tab_num+1); if(strcmp(node->text,"*") == 0){ result = value1 * value2; }else{ result = value1 / value2; } break; case Ast_IntLiteral: result = atoi(node->text); break; case Ast_Identifier: varName = node->text;//===================== varnode = Find(varName,My_varTree); if(varnode != NULL){ result = varnode->varValue; }else{ printf("variable %s has not been set any value",varName); } break; case AssignmentStmt: varName = node->text; child = node->left; result = evaluate(child,tab_num+1); varValue = result; for(i = 0; i < 20; i++){ X = X + varName[i]; if(varName[i] == '\0'){ break; } } varnode = Find(varName,My_varTree); if(varnode == NULL){ Insert(varValue,varName,X,My_varTree); }else{ varnode->varValue = varValue; } break; case CharDeclaration: case IntDeclaration: varName = node->text; child = node->left; result = evaluate(child,tab_num+1); varValue = result; for(i = 0; i < 20; i++){ X = X + varName[i]; if(varName[i] == '\0'){ break; } } varnode = Find(varName,My_varTree); if(varnode == NULL){ Insert(varValue,varName,X,My_varTree); }else{ varnode->varValue = varValue; } //==================================== break; default : break; } for(int i = 0; i < tab_num;i++){ //printf(" "); } //printf("Result: %d\r\n",result); return result; } int syntactic_parser(Save_Token_t* tokens){ int result = 0; SimpleASTNode_t* AstTree = NULL; AstTree = assignmentStatement(tokens);//赋值语句a=1+3+b+5; if(AstTree != NULL){ result = evaluate(AstTree,0); return result; } AstTree = intDeclarationStatement(tokens);//变量声明语句 char a = 5+3*6; if(AstTree != NULL){ result = evaluate(AstTree,0); return result; } AstTree = expressionStatement(tokens);//表达式语句 a+b+3; if(AstTree != NULL){ result = evaluate(AstTree,0); return result; } return result; } void tokens_fun_init(){ tokens_fun.peek = token_peek; tokens_fun.read = token_read; tokens_fun.unread = token_unread; tokens_fun.getPosition = token_getPosition; tokens_fun.setPosition = token_setPosition; } int main2(){ tokens_fun_init(); Lexical_analyzer(); //syntactic_parser(); } //my_tokens[100] int main(){ int i ,result; Save_Token_t* tokens; tokens_fun_init(); My_varTree = Insert(0,"calute",100,NULL); while(1){ printf("Repl >",my_tokens); for(i = 0; i < 100; i++){ my_tokens[i] = 0; } gets(my_tokens); //printf("======%s\r\n",my_tokens); if(strcmp(my_tokens,"exit();") == 0){ printf("goodbye\r\n"); break; } set_Token_Index(0); Lexical_analyzer(); //printf("============syntactic_parser===============\r\n"); result = syntactic_parser(tokens); printf("result = %d\r\n",result); set_save_token_index(0); token_setPosition(0); } }
二叉搜索树 #include<stdio.h> #include<string.h> #include<stdlib.h> #define DEBUG(X) printf(X) struct TreeNode; typedef struct TreeNode *Position_t; typedef struct TreeNode SearchTree_t; typedef int ElementType_t; struct TreeNode{ ElementType_t Element; SearchTree_t* Left; SearchTree_t* Right; }; SearchTree_t* MakeEmpty(SearchTree_t* Tree){ if(Tree != NULL){ MakeEmpty(Tree -> Left); MakeEmpty(Tree -> Right); free(Tree); } return NULL; } SearchTree_t* Insert(ElementType_t X,SearchTree_t* Tree){ if(Tree == NULL){ //create and return a one node tree Tree = malloc(sizeof(struct TreeNode)); if(Tree == NULL){ DEBUG("Out of space!!!!"); }else{ Tree->Element = X; Tree->Left = Tree->Right = NULL; } }else if(X < Tree->Element){ Tree->Left = Insert(X,Tree->Left); }else if(X > Tree->Element){ Tree->Right = Insert(X,Tree->Right); }else{ //else X is in the tree already,we'll do nothing } return Tree; } Position_t Find(ElementType_t X,SearchTree_t* Tree){ if(Tree == NULL){ return NULL; } if( X < Tree->Element){ return Find(X,Tree -> Left); }else if( X > Tree->Element){ return Find(X,Tree -> Right); }else{ return Tree; } } Position_t FindMin(SearchTree_t* Tree){ if(Tree == NULL){ return NULL; }else if(Tree->Left == NULL){ return Tree; }else{ return FindMin(Tree->Left); } } Position_t FindMax(SearchTree_t* Tree){ if(Tree != NULL){ while(Tree -> Right != NULL){ Tree = Tree -> Right; } } return Tree; } void print_Tree(SearchTree_t* Tree,int Depth){ int i; if(Tree == NULL){ return; } for(i = 0;Depth > i;i++){ printf(" "); } printf("%d\r\n",Tree->Element); print_Tree(Tree->Left,Depth+1); print_Tree(Tree->Right,Depth+1); } int main(){ SearchTree_t* myTree; myTree = Insert(6,NULL); Insert(2,myTree); Insert(1,myTree); Insert(4,myTree); Insert(3,myTree); Insert(8,myTree); print_Tree(myTree,0); Position_t min = FindMin(myTree); printf("min = %d\r\n",min->Element); Position_t max = FindMax(myTree); printf("max = %d\r\n",max->Element); return 1; }
C语言编译器——语法分析器 可以简单分析赋值语句 如:char a = 10; 生成AST树 const char* const AST_string[] = { "CharDeclaration", "AssignmentExp", "IntLiteral", }; enum syntactic_parser_types{ CharDeclaration = 0, AssignmentExp, Ast_IntLiteral, }syntactic_parser_type; typedef Save_Token_t tokens_fun_t(void); typedef struct tokens_fun{ tokens_fun_t *peek; tokens_fun_t *read; }Token_fun; static int save_token_read_index = 0; Save_Token_t token_peek(void){ if(save_token_read_index >= save_token_index){ //return NULL; } return Mytokens[save_token_read_index]; } Save_Token_t token_read(void){ if(save_token_read_index >= save_token_index){ //return NULL; } return Mytokens[save_token_read_index++]; } typedef struct SimpleASTNode{ enum syntactic_parser_types type; char text[Id_LENGTH]; int level; }SimpleASTNode_t; SimpleASTNode_t AST_node[20] = {}; static int AST_index = 0; void add_AST(enum syntactic_parser_types type,char* text,int level){ AST_node[AST_index].type = type; strcpy(AST_node[AST_index].text,text); AST_node[AST_index].level = level; AST_index++; } void printf_AST(){ int i,j; printf("\r\n=====syntactic_parser======\r\n\r\n"); for( i = 0; i < AST_index; i++){ for(j = 0; j < (AST_node[i].level-1);j++){ //printf("\t"); printf(" "); } printf("%s %s\r\n",AST_string[AST_node[i].type],AST_node[i].text); } } int syntactic_parser(){ Save_Token_t token; Token_fun tokens_fun; tokens_fun.peek = token_peek; tokens_fun.read = token_read; token = tokens_fun.peek();//预读 //if((token != NULL) && (token.type == CHAR)){ if( (token.type == CHAR)){ token = tokens_fun.read();//消耗掉char token = tokens_fun.peek(); if(token.type == Id){ token = tokens_fun.read(); //创建当前节点,并把变量名记到AST节点的文本值中, add_AST(CharDeclaration,token.text,1); token = tokens_fun.peek();//预读 if(token.type == Assignment){ add_AST(AssignmentExp,token.text,2); token = tokens_fun.read(); token = tokens_fun.peek();//预读 if(token.type == IntLiteral){ token = tokens_fun.read(); add_AST(Ast_IntLiteral,token.text,3); } } } } printf_AST(); } int main(){ Lexical_analyzer(); syntactic_parser(); }
C语言编译器——词法分析器代码 简单实现了一个词法分析器,可以解析 money > 45 money >= 45 两条语句 enum token_enum_states{ Init = 0, Id,//abc_ IntLiteral,//1123 GT,//> GE,//>= ERR }token_enum_state = Init; typedef void Fun_append(char ch); typedef struct token{ enum token_enum_states type; char text[20]; Fun_append* append; }Token; Token new_token; static char index = 0; void my_append(char ch){ new_token.text[index] = ch; index++; } void init_index(){ char i; index = 0; for(i = 0; i < 20; i++){ new_token.text[i] = 0; } } #define bool char #define TRUE 1 #define FALSE 0 bool is_alpha(char ch){ if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == '_'){ return TRUE; } return FALSE; } bool is_digit(char ch){ if(ch >= '0' && ch <= '9'){ return TRUE; } return FALSE; } const char* const token_string[] = { "Init", "Id",//abc_ "IntLiteral",//1123 "GT",//> "GE",//>= }; enum token_enum_states initToken(char ch){ if(new_token.type != Init){ printf("%s %s\r\n",token_string[new_token.type],new_token.text); } init_index(); if(is_alpha(ch)){//第一个字符是字母 new_token.type = Id; new_token.append(ch); }else if(is_digit(ch)){//第一个字符是数字 new_token.type = IntLiteral; new_token.append(ch); }else if(ch == '>'){ new_token.type = GT; new_token.append(ch); }else{ new_token.type = Init; } return new_token.type; } char get_token_string(){ static int tokens_index = 0; char ch; char my_tokens[] = "age >= 45"; ch = my_tokens[tokens_index++]; if(ch == 0){ return -1; } return ch; } int main(){ char ch ; new_token.append = &my_append; while(1){ ch = get_token_string(); switch (token_enum_state){ case Init: token_enum_state = initToken(ch); break; case Id: if(is_alpha(ch) || is_digit(ch)){ new_token.append(ch); }else{ token_enum_state = initToken(ch); } break; case GT: if(ch == '='){ new_token.type = GE; new_token.append(ch); }else{ token_enum_state = initToken(ch); } break; case GE: token_enum_state = initToken(ch); break; case IntLiteral: if(is_digit(ch)){ new_token.append(ch); }else{ token_enum_state = initToken(ch); } break; } if(ch < 0){ return 1; } } }
stm32GPIO配置模式
foc学习网站 入门级foc学习网站 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fsimplefoc.cn%2F%23%2Fsimplefoc_translation%2F1&urlrefer=25df64996cc0cf54dc1ad98ae3a5a39f首页.md
自动控制原理 卢京潮 开始学习自动控制原理
M328晶体管测试仪 晶体管测试仪是一个非常实用的小工具,最早他是基于atmel ATMega8开发的,目前升级到了ATMega328P。 可以自动测量电阻,电容、电感,对于电感和电容,还能测试出等效串联的电阻(ESR)。 除此,还可以自动识别二极管、BJT、MOSFET元件,并且测量元器件的相关属性。 这一切所有的操作都很简单,只需要简单的将元件连接到测试座上,不需要区分管脚顺序。 测试仪可以自动分辨它们并识别出管脚的顺序。
32开发都用什么 大家有用c语言开发esp32的吗?需要安装什么软件才能编写程序
讨论一下:物联网怎么学 需要学习嵌入式开发,还需要学什么吗?服务器开发要学吗
嵌入式单片机怎么入门 如题,想学单片机,需要哪些资料,从哪里开始学起,有大佬带我吗
数码管一块钱,驱动一块钱 激光一块钱 主要是光敏二极管邮费要十块钱 光敏二极管有型号推荐吗 cls15 l213R 这个光敏二极管芯片直接接ad就可以了吗 肯定得放大的
学习物联网打卡 从今天开始学习物联网,打卡挑战一下
自平衡莱洛三角形制 在B站BV19v411n7mN基础上添加了充电模块,主控芯片使用ESP32,并配置了调参上位机,可以很方便的通过wifi无线调参。无刷控制使用灯哥开源FOC。制作出一个方便复刻的自平衡莱洛三角形,在桌面上作为一个摆件还是非常不错的。开源链接:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fgitee.com%2Fcoll45%2Ffoc&urlrefer=ac45a750697d55a10a254b615744a999立创原理图及PCB:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Flceda.cn%2F45coll%2Fzi-ping-heng-di-lai-luo-san-jiao_10-10-ban-ben&urlrefer=5cd4c7617872b400100d9cd060072b4c
物联网学习需要哪些知识 如题,学好物联网需要哪些知识,有大佬带我吗?
51单片机驱动点阵屏8*32显示时钟 #include<reg52.h> #include <intrins.h> #include "stdio.h" #define uchar unsigned char #define uint unsigned int #define LED_DATA P2 sbit SCK= P1^7; sbit RCK= P1^6; sbit SER= P1^5; void delay_ms(uint time){ uint i,j; for(i = 0; i < time; i++){ for(j = 0; j < 10; j++); } } char code font7_8[10][7]={ 0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,//0;"0",0 0xFF,0xFF,0xBD,0xBD,0x81,0xBF,0xBF,//0;"1",1 0xBF,0x93,0x9D,0xAD,0xB5,0x99,0xFF,//0;"2",2 0xDF,0xBB,0xAD,0xAD,0xA5,0xC9,0xFF,//0;"3",3 0xCF,0xD7,0xDB,0x9B,0x81,0xDF,0xDF,//0;"4",4 0xFF,0xCB,0xB5,0xB5,0xB5,0xB5,0xCF,//0;"5",5 0xFF,0xC7,0xAB,0xB5,0xB5,0xB1,0xCB,//0;"6",6 0xFF,0xFD,0x9D,0xED,0xF5,0xF9,0xFD,//0;"7",7 0xFF,0xCB,0xB5,0xB5,0xA5,0xC9,0xFF,//0;"8",8 0xFF,0xD3,0xAD,0xAD,0x8D,0xC3,0xFF,//0;"9",9 }; uchar data_buf[32]={ 0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,//0;"0",0 0xFF,0xFF,0xBD,0xBD,0x81,0xBF,0xBF,//0;"1",1 0xBF,0x93,0x9D,0xAD,0xB5,0x99,0xFF,//0;"2",2 0xDF,0xBB,0xAD,0xAD,0xA5,0xC9,0xFF,//0;"3",3 0xff,0xff,0xff,0xff, }; void hc_595_init(){ SCK=0; RCK=0; } void HC_595_writebyte(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { SER=dat&(0x80>>i); SCK=1; SCK=0; } //RCK=1; // RCK=0; } void print_screen(){ char j; unsigned char lie = 0x01; //uchar wei = 0xf0; for(j=0;j<8;j++){ LED_DATA = data_buf[j];//data_buf[j]; lie = 0x01<<j; //for(i = 0; i < 4;i++){ HC_595_writebyte(0x00 ); HC_595_writebyte(0x00); HC_595_writebyte(0x00); HC_595_writebyte(lie&0xff); //} RCK=1; RCK=0; delay_ms(1); //LED_DATA = 0xff; } for(j=0;j<8;j++){ LED_DATA = data_buf[j+8];//data_buf[j]; lie = 0x01<<j; //for(i = 0; i < 4;i++){ HC_595_writebyte(0x00 ); HC_595_writebyte(0x00); HC_595_writebyte(lie&0xff); HC_595_writebyte(0x00); //} RCK=1; RCK=0; delay_ms(1); //LED_DATA = 0xff; } for(j=0;j<8;j++){ LED_DATA = data_buf[j+16];//data_buf[j]; lie = 0x01<<j; //for(i = 0; i < 4;i++){ HC_595_writebyte(0x00 ); HC_595_writebyte(lie&0xff); HC_595_writebyte(0x00); HC_595_writebyte(0x00); //} RCK=1; RCK=0; delay_ms(1); //LED_DATA = 0xff; } for(j=0;j<8;j++){ LED_DATA = data_buf[j+24];//data_buf[j]; lie = 0x01<<j; //for(i = 0; i < 4;i++){ HC_595_writebyte(lie&0xff); HC_595_writebyte(0x00 ); HC_595_writebyte(0x00); HC_595_writebyte(0x00); //} RCK=1; RCK=0; delay_ms(1); //LED_DATA = 0xff; } return; /* for(j = 0; j < 8; j++){ //j=2; LED_DATA = 0xff ^ (0x01<<j); for(i = 0; i < 4;i++){ HC_595_writebyte(data_buf[i+j*4]); } RCK=1; RCK=0; delay_ms(1); for(i = 0; i < 4;i++){ HC_595_writebyte(0x00); } RCK=1; RCK=0; }*/ } char miao=0;fen=12; void show_time(){ char i; for(i=0;i<32;i++){ data_buf[i] = 0xff; } for(i=0; i < 7; i++){ data_buf[i] = font7_8[fen/10][i]; } for(i=8; i < 15; i++){ data_buf[i] = font7_8[fen%10][i-8]; } if(miao&0x01){ data_buf[15] = 0x99; data_buf[16] = 0x99; } for(i=17; i < 24; i++){ data_buf[i] = font7_8[miao/10][i-17]; } for(i=25; i < 32; i++){ data_buf[i] = font7_8[miao%10][i-25]; } } void main(void) { uchar time= 0; hc_595_init(); show_time(); while(1){ //HC_595_writebyte(a); if(time>3){ time = 0; miao++; if(miao > 59){ miao = 0; fen++; if(fen > 59){ fen = 0; } } show_time(); //LED_DATA = 0xff; }else{ //LED_DATA = 0x00; } //delay_ms(500); time++; print_screen(); } }
51计算器程序3 void key_task(); extern uchar condition; //È«¾Ö±äÁ¿ char yun_flag='+';//ÔËËã·ûºÅ yun_flag £¨Ä¬ÈÏΪ+ £© char data c_num[15]=" ";//c_num1 ×Ö·ûÐ͵ÚÒ»²Ù×÷Êý (Êý×é²»¶¨Òå´óСÓëÆäËû±äÁ¿³åÍ») //char data c_num2[15]=" ";//c_num2 ×Ö·ûÐ͵ڶþ²Ù×÷Êý char error;//ÔËËã·¨Ôò´íÎó£» void refresh(); //===================================================== void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1; /*12MHzƵÂÊ*/ while(--uscnt); } /******************************************************************/ /* ºÁÃ뺯ÊýÉùÃ÷ */ /******************************************************************/ void DelayMs(unsigned char ms) { while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } } //============================================== long my_num3 = 0; long my_num2 = 0; long my_num1 = 0; char my_num_len = 1; char num_flag = 0; unsigned char operation_num = 0; char long_to_char(long a,char* p) { char length; sprintf(p,"%ld",a); length = strlen (p); return length; } void refresh(){ //LCD_write_str(0,1,"1234567890123456"); LCD_write_str(0,0," "); LCD_write_str(0,1," "); my_num_len = long_to_char(my_num2,c_num);//num2תΪ×Ö·ûÐÍ if(error==0) { if(num_flag == 0){ //my_num_len = long_to_char(my_num2,c_num);//num2תΪ×Ö·ûÐÍ LCD_write_str(16-my_num_len,2,c_num); }else if(num_flag == 1){ LCD_write_str(16-my_num_len,2,c_num); my_num_len = long_to_char(my_num1,c_num);//num1תΪ×Ö·ûÐÍ LCD_write_str(16-my_num_len ,0,c_num); LCD_write_char(1,15,yun_flag); }else{ my_num_len = long_to_char(my_num1,c_num);//num1תΪ×Ö·ûÐÍ LCD_write_str(0 ,0,c_num); LCD_write_char(my_num_len ,0,yun_flag); yun_flag = '='; long_to_char(my_num2,c_num); LCD_write_str(my_num_len + 1 ,0,c_num); my_num_len = long_to_char(my_num3,c_num);//num1תΪ×Ö·ûÐÍ LCD_write_str(16-my_num_len ,1,c_num); LCD_write_char(16-my_num_len-1,1,'='); } }else { LCD_write_str(0,0,"error!!!"); } } void my_operation2(char keynum)//ÊäÈëÊý×Ö { unsigned char Data1; if(keynum==1)Data1=1;//·ÖÎöÊäÈëÊý×Ö if(keynum==2)Data1=2; if(keynum==3)Data1=3; if(keynum==5)Data1=4; if(keynum==6)Data1=5; if(keynum==7)Data1=6; if(keynum==9)Data1=7; if(keynum==10)Data1=8; if(keynum==11)Data1=9; if(keynum==14)Data1=0; my_num2=my_num2*10+Data1; refresh(); } void my_operation_clear()//ÊäÈëclear all { my_num1=0;// num1ÇåÁã my_num2=0;//num2ÇåÁã operation_num = 0; yun_flag=' ';// yun_flag(Ϊ'+') error=0;//Çåerror num_flag = 0; refresh();//¸üÐÂÒº¾§ } void my_operation(char keynum)//°´Ï ¡¯+¡¢-¡¢*¡¢/´¦Àí { if(operation_num > 1)//Éϴΰ´¼üΪ Êý×Ö¡¢Ð¡Êýµã¡¢+/-¡¢sqrt { if(yun_flag=='+')my_num2=my_num1+my_num2; //°´ÏµÄÊÇ¡®+¡¯ if(yun_flag=='-')my_num2=my_num1-my_num2;//°´ÏµÄÊÇ¡®-¡¯ if(yun_flag=='*')my_num2=my_num1*my_num2;//°´ÏµÄÊÇ¡®*¡¯ if(yun_flag=='/')//°´ÏµÄÊÇ¡®/¡¯ { if(my_num2!=0){ my_num2=my_num1/my_num2; } else{ error=1; } } } if(yun_flag=='='){ my_num1 = my_num3; }else{ my_num1 = my_num2; } if(keynum==4)yun_flag='+';//yun_flag¸üРif(keynum==8)yun_flag='-'; if(keynum==12)yun_flag='*'; if(keynum==16)yun_flag='/'; my_num2=0; //len=0; //key_last=0;//key_last¸üРrefresh(); } void operation_for_equal()//ÊäÈë'=' { if(yun_flag=='+')my_num3=my_num1+my_num2; //°´ÏµÄÊÇ¡®+¡¯ if(yun_flag=='-')my_num3=my_num1-my_num2;//°´ÏµÄÊÇ¡®-¡¯ if(yun_flag=='*')my_num3=my_num1*my_num2;//°´ÏµÄÊÇ¡®*¡¯ if(yun_flag=='/')//°´ÏµÄÊÇ¡®/¡¯ { if(my_num2!=0){ my_num3=my_num1/my_num2; } else{ error=1; } } //yun_flag='=';//yun_flag¸üРoperation_num = 0; refresh(); } void xiaoshucong_key_task(unsigned char key){ switch(key){ case 4 : case 8 : case 12: case 16://+¡¢-¡¢*¡¢/ if(error==0){ num_flag = 1; operation_num++; my_operation(key); } break; case 1 : //Êý×Ö1 case 2 : //Êý×Ö2 case 3 : //Êý×Ö3 case 5 : //Êý×Ö4 case 6 : //Êý×Ö5 case 7 : //Êý×Ö6 case 9 : //Êý×Ö7 case 10 : //Êý×Ö8 case 11 : //Êý×Ö9 case 14 : //Êý×Ö0 if(error==0){ if(yun_flag == '='){ yun_flag = ' '; my_num2 =0; num_flag = 0; } my_operation2(key); } break; case 13 :// clear all my_operation_clear(); break; case 15 :// '=' if(error==0){ num_flag = 2; operation_for_equal(); } break; } } void main(){ char key_num = 0; LCD_init(); refresh(); while(1){ key_num = KeyDriver(); if(key_num){ xiaoshucong_key_task(key_num); } } }
51计算器程序2 void key_task(); extern uchar condition; //È«¾Ö±äÁ¿ char yun_flag='+';//ÔËËã·ûºÅ yun_flag £¨Ä¬ÈÏΪ+ £© char data c_num1[15]=" ";//c_num1 ×Ö·ûÐ͵ÚÒ»²Ù×÷Êý (Êý×é²»¶¨Òå´óСÓëÆäËû±äÁ¿³åÍ») char data c_num2[15]=" ";//c_num2 ×Ö·ûÐ͵ڶþ²Ù×÷Êý char error;//ÔËËã·¨Ôò´íÎó£» void refresh(); //===================================================== void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1; /*12MHzƵÂÊ*/ while(--uscnt); } /******************************************************************/ /* ºÁÃ뺯ÊýÉùÃ÷ */ /******************************************************************/ void DelayMs(unsigned char ms) { while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } } double my_num2 = 0; double my_num1 = 0; char my_num2_len = 1,my_num1_len = 1; char num_flag = 0; unsigned char operation_num = 0; double point_flag = 0;//СÊýµãÊÇ·ñ±»°´Ï char point_num = 0; char double_to_char(double a,char* p) { char length,i,j; for(i=0; i< 15; i++){ p[i] = 0; } sprintf(p,"%f",a); length = strlen (p); for(i = 0; i < length;i++){ if(p[i] == '.'){ for(j = 6; j > 0;j--){ if(p[i+j] != '0'){ break; } } if(j){ p[i+j+1] = '\0'; }else{ p[i] = '\0'; } } } length = strlen (p); return length; } void show_float(){ char i,length,j; if((point_num > 1) ){ length = strlen (c_num2); for(i =0 ; i < length; i++){ if(c_num2[i] == '.'){ break; } } if(i == length ){ LCD_write_str(16-my_num2_len-point_num,2,c_num2); LCD_write_char(16-point_num,2,'.'); for(i=1; i < point_num; i++){ LCD_write_char(16-i,2,'0'); } }else{ if((length-i) > 5){ LCD_write_str(16-my_num2_len,2,c_num2); }else{ LCD_write_str(16-(i+point_num),2,c_num2); for(j=0; j < point_num - (length-i); j++){ LCD_write_char(15-j,2,'0'); } } } }else{ LCD_write_str(16-my_num2_len,2,c_num2); } } void show_num2(){ if(point_num == 1){ LCD_write_str(16-my_num2_len-1,2,c_num2); LCD_write_char(15,2,'.'); }else if(point_num == 0){ LCD_write_str(16-my_num2_len,2,c_num2); } else{ show_float(); } } void refresh(){ //char i; //LCD_write_str(0,1,"1234567890123456"); LCD_write_str(0,0," "); LCD_write_str(0,1," "); my_num2_len = double_to_char(my_num2,c_num2);//num2תΪ×Ö·ûÐÍ if(error==0) { if(num_flag == 0){//shu ru zuo zhi show_num2(); }else if(num_flag == 1){//shu ru you zhi my_num1_len = double_to_char(my_num1,c_num1);//num1תΪ×Ö·ûÐÍ LCD_write_str(16-my_num1_len ,0,c_num1); show_num2(); LCD_write_char(1,15,yun_flag); }else{//deng yu hao my_num2_len = double_to_char(my_num2,c_num2);//num1תΪ×Ö·ûÐÍ LCD_write_str(16-my_num2_len ,1,c_num2); LCD_write_char(1,15,yun_flag); } }else { LCD_write_str(0,0,"error!!!"); } } void point_init(){ point_flag = 0; point_num = 0; } void my_operation2(char keynum)//ÊäÈëÊý×Ö { unsigned char Data1; if(keynum==1)Data1=1;//·ÖÎöÊäÈëÊý×Ö if(keynum==2)Data1=2; if(keynum==3)Data1=3; if(keynum==5)Data1=4; if(keynum==6)Data1=5; if(keynum==7)Data1=6; if(keynum==9)Data1=7; if(keynum==10)Data1=8; if(keynum==11)Data1=9; if(keynum==14)Data1=0; if(point_num){ point_num++; if(point_num > 7){ point_num = 7; } point_flag = point_flag *0.1; my_num2 = my_num2+Data1*point_flag; }else{ my_num2=my_num2*10+Data1; } refresh(); } void my_operation_point(){ point_flag = 1; point_num = 1; refresh(); } void my_operation(char keynum)//°´Ï ¡¯+¡¢-¡¢*¡¢/´¦Àí { if(operation_num > 1)//Éϴΰ´¼üΪ Êý×Ö¡¢Ð¡Êýµã¡¢+/-¡¢sqrt { if(yun_flag=='+')my_num2=my_num1+my_num2; //°´ÏµÄÊÇ¡®+¡¯ if(yun_flag=='-')my_num2=my_num1-my_num2;//°´ÏµÄÊÇ¡®-¡¯ if(yun_flag=='*')my_num2=my_num1*my_num2;//°´ÏµÄÊÇ¡®*¡¯ if(yun_flag=='/')//°´ÏµÄÊÇ¡®/¡¯ { if(my_num2!=0){ my_num2=my_num1/my_num2; } else{ error=1; } } } if(keynum==4)yun_flag='+';//yun_flag¸üРif(keynum==8)yun_flag='-'; if(keynum==12)yun_flag='*'; if(keynum==16)yun_flag='/'; my_num1 = my_num2; my_num2=0; refresh(); } void operation_for_equal()//ÊäÈë'=' { if(yun_flag=='+')my_num2=my_num1+my_num2; //°´ÏµÄÊÇ¡®+¡¯ if(yun_flag=='-')my_num2=my_num1-my_num2;//°´ÏµÄÊÇ¡®-¡¯ if(yun_flag=='*')my_num2=my_num1*my_num2;//°´ÏµÄÊÇ¡®*¡¯ if(yun_flag=='/')//°´ÏµÄÊÇ¡®/¡¯ { if(my_num2!=0){ my_num2=my_num1/my_num2; } else{ error=1; } } yun_flag='=';//yun_flag¸üРoperation_num = 0; refresh(); } void xiaoshucong_key_task(unsigned char key){ switch(key){ case 4 : case 8 : case 12: case 16://+¡¢-¡¢*¡¢/ if(error==0){ num_flag = 1; point_init(); operation_num++; my_operation(key); } break; case 1 : //Êý×Ö1 case 2 : //Êý×Ö2 case 3 : //Êý×Ö3 case 5 : //Êý×Ö4 case 6 : //Êý×Ö5 case 7 : //Êý×Ö6 case 9 : //Êý×Ö7 case 10 : //Êý×Ö8 case 11 : //Êý×Ö9 case 14 : //Êý×Ö0 if(error==0){ if(yun_flag == '='){ yun_flag = ' '; my_num2 =0; num_flag = 0; } my_operation2(key); } break; case 13 :// . my_operation_point(); break; case 15 :// '=' if(error==0){ //operation4(); num_flag = 2; point_init(); operation_for_equal(); } break; } } void main() { char key_num = 0; LCD_init(); refresh(); while(1) { key_num = KeyDriver(); if(key_num){ xiaoshucong_key_task(key_num); } } }
好书推荐 ================================== 考研数学 张宇30讲 武忠祥660 李林880 汤家凤1800 直接660+880+1800,全刷完上个双非没问题 ============================ 自动控制原理呢 卢京潮 ====================== C语言 c primer plus c与指针,c陷阱与缺陷,cppreference cppreference是编译器的实现,在网上搜,有c的实现的 最好这些看完去看汇编,x86的,能够更加深入理解c
51单片机计算器程序 void key_task(); extern uchar condition; //È«¾Ö±äÁ¿ char yun_flag='+';//ÔËËã·ûºÅ yun_flag £¨Ä¬ÈÏΪ+ £© char data c_num1[15]=" ";//c_num1 ×Ö·ûÐ͵ÚÒ»²Ù×÷Êý (Êý×é²»¶¨Òå´óСÓëÆäËû±äÁ¿³åÍ») char data c_num2[15]=" ";//c_num2 ×Ö·ûÐ͵ڶþ²Ù×÷Êý char error;//ÔËËã·¨Ôò´íÎó£» void refresh(); //===================================================== void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1; /*12MHzƵÂÊ*/ while(--uscnt); } /******************************************************************/ /* ºÁÃ뺯ÊýÉùÃ÷ */ /******************************************************************/ void DelayMs(unsigned char ms) { while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } } //============================================== long my_num2 = 0; long my_num1 = 0; char my_num2_len = 1,my_num1_len = 1; char num_flag = 0; unsigned char operation_num = 0; char long_to_char(long a,char* p) { char length; sprintf(p,"%ld",a); length = strlen (p); return length; } void refresh(){ //LCD_write_str(0,1,"1234567890123456"); LCD_write_str(0,0," "); LCD_write_str(0,1," "); my_num2_len = long_to_char(my_num2,c_num2);//num2תΪ×Ö·ûÐÍ if(error==0) { if(num_flag == 0){ LCD_write_str(16-my_num2_len,2,c_num2); }else if(num_flag == 1){ my_num1_len = long_to_char(my_num1,c_num1);//num1תΪ×Ö·ûÐÍ LCD_write_str(16-my_num1_len ,0,c_num1); LCD_write_str(16-my_num2_len,2,c_num2); LCD_write_char(1,15,yun_flag); }else{ my_num2_len = long_to_char(my_num2,c_num2);//num1תΪ×Ö·ûÐÍ LCD_write_str(16-my_num2_len ,1,c_num2); LCD_write_char(1,15,yun_flag); } }else { LCD_write_str(0,0,"error!!!"); } } void my_operation2(char keynum)//ÊäÈëÊý×Ö { unsigned char Data1; if(keynum==1)Data1=1;//·ÖÎöÊäÈëÊý×Ö if(keynum==2)Data1=2; if(keynum==3)Data1=3; if(keynum==5)Data1=4; if(keynum==6)Data1=5; if(keynum==7)Data1=6; if(keynum==9)Data1=7; if(keynum==10)Data1=8; if(keynum==11)Data1=9; if(keynum==14)Data1=0; my_num2=my_num2*10+Data1; refresh(); } void my_operation_clear()//ÊäÈëclear all { my_num1=0;// num1ÇåÁã my_num2=0;//num2ÇåÁã operation_num = 0; yun_flag=' ';// yun_flag(Ϊ'+') error=0;//Çåerror num_flag = 0; refresh();//¸üÐÂÒº¾§ } void my_operation(char keynum)//°´Ï ¡¯+¡¢-¡¢*¡¢/´¦Àí { if(operation_num > 1)//Éϴΰ´¼üΪ Êý×Ö¡¢Ð¡Êýµã¡¢+/-¡¢sqrt { if(yun_flag=='+')my_num2=my_num1+my_num2; //°´ÏµÄÊÇ¡®+¡¯ if(yun_flag=='-')my_num2=my_num1-my_num2;//°´ÏµÄÊÇ¡®-¡¯ if(yun_flag=='*')my_num2=my_num1*my_num2;//°´ÏµÄÊÇ¡®*¡¯ if(yun_flag=='/')//°´ÏµÄÊÇ¡®/¡¯ { if(my_num2!=0){ my_num2=my_num1/my_num2; } else{ error=1; } } } if(keynum==4)yun_flag='+';//yun_flag¸üРif(keynum==8)yun_flag='-'; if(keynum==12)yun_flag='*'; if(keynum==16)yun_flag='/'; my_num1 = my_num2; my_num2=0; //len=0; //key_last=0;//key_last¸üРrefresh(); } void operation_for_equal()//ÊäÈë'=' { if(yun_flag=='+')my_num2=my_num1+my_num2; //°´ÏµÄÊÇ¡®+¡¯ if(yun_flag=='-')my_num2=my_num1-my_num2;//°´ÏµÄÊÇ¡®-¡¯ if(yun_flag=='*')my_num2=my_num1*my_num2;//°´ÏµÄÊÇ¡®*¡¯ if(yun_flag=='/')//°´ÏµÄÊÇ¡®/¡¯ { if(my_num2!=0){ my_num2=my_num1/my_num2; } else{ error=1; } } yun_flag='=';//yun_flag¸üРoperation_num = 0; refresh(); } void xiaoshucong_key_task(unsigned char key){ switch(key){ case 4 : case 8 : case 12: case 16://+¡¢-¡¢*¡¢/ if(error==0){ num_flag = 1; operation_num++; my_operation(key); } break; case 1 : //Êý×Ö1 case 2 : //Êý×Ö2 case 3 : //Êý×Ö3 case 5 : //Êý×Ö4 case 6 : //Êý×Ö5 case 7 : //Êý×Ö6 case 9 : //Êý×Ö7 case 10 : //Êý×Ö8 case 11 : //Êý×Ö9 case 14 : //Êý×Ö0 if(error==0){ if(yun_flag == '='){ yun_flag = ' '; my_num2 =0; num_flag = 0; } my_operation2(key); } break; case 13 :// clear all my_operation_clear(); break; case 15 :// '=' if(error==0){ num_flag = 2; operation_for_equal(); } break; } } void main(){ char key_num = 0; LCD_init(); refresh(); while(1){ key_num = KeyDriver(); if(key_num){ xiaoshucong_key_task(key_num); } } }
卡尔曼滤波程序与MATLAB仿真 卡尔曼滤波程序 // Kalman Filter float EstimateErrorLast; float EstimateValueLast; void KalmanFilterInit(void) { EstimateValueLast=80; EstimateErrorLast=10; } int KalmanFilter(int MeasureValue) { float MeasureError; float EstimateValue; float EstimateError; float KalmanGain; int KalmanFilterData; MeasureValue = MeasureValue; MeasureError=MeasureValue*0.2; KalmanGain = EstimateErrorLast/(EstimateErrorLast + MeasureError); EstimateValue = EstimateValueLast + KalmanGain*(MeasureValue-EstimateValueLast); EstimateError = (1-KalmanGain)*EstimateErrorLast; EstimateValueLast = EstimateValue; EstimateErrorLast = EstimateError; KalmanFilterData = (int)EstimateValue; return KalmanFilterData; } MATLAB仿真 function main N = 300; Realillumin = 82; MeasureVaration = 0.2; Measuremin = Realillumin*(1 - MeasureVaration); Measuremax = Realillumin*(1 + MeasureVaration); Real_illumin = Realillumin*ones(1,N); Measure_Value = Measuremin + (Measuremax-Measuremin)*rand(1,N); Estimate_Value = zeros(1,N); Measure_error = zeros(1,N); Estimate_error = zeros(1,N); KalmanGain = zeros(1,N); SumValue = zeros(1,N); MeanValue = zeros(1,N); Estimate_Value(1) = Measure_Value(1); Measure_error(1) = Measure_Value(1)*MeasureVaration; Estimate_error(1) = Measure_Value(1)*MeasureVaration; for k=2:N Measure_error(k) = Measure_Value(k)*MeasureVaration; KalmanGain(k)= Estimate_error(k-1)/(Estimate_error(k-1)+Measure_error(k)); Estimate_error(k) = (1-KalmanGain(k))*Estimate_error(k-1); Estimate_Value(k) = Estimate_Value(k-1) + KalmanGain(k)*(Measure_Value(k)-Estimate_Value(k-1)); end SumValue(1)=Measure_Value(1); MeanValue(1)=SumValue(1)/1; for k=2:N SumValue(k) = SumValue(k-1)+Measure_Value(k); MeanValue(k) = SumValue(k)/k; end t=1:N; figure('Name','Kalman Filter Simulation','NumberTitle','off'); plot(t,Measure_Value,'-b',t,Estimate_Value,'-r',t,MeanValue,'-k',t,Real_illumin,'-g'); legend('MeasureValue','EstimateValue','MeanValue','Realillumin'); xlabel('sample time'); ylabel('illumin'); title('Kalman Filter Simulation');
4*4矩阵键盘程序 仿真原理图如下程序如下 sbit P3_0 =P3^0; unsigned char LedChar[]= //0-F { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E }; void delay(unsigned long int i) { unsigned long int k; for(k=0;k<i;k++); } unsigned int KeyDriver(); void KeyAction(unsigned int x); bit flag; void main() { unsigned int A; P0 = 0x0f; P1=LedChar[0]; P3_0 = 1; while(1) { A=KeyDriver(); if(A) KeyAction(A-1); } } #define High_PORT P0 #define Low_PORT P2 unsigned int KeyDriver() { unsigned char i; unsigned int back; unsigned char P2_data = 0; Low_PORT=0xF0;// P2: 1111 0000 if((High_PORT&0x0f)!=0x0F){//µÚÒ»´ÎÅÐ¶Ï delay(200); if((High_PORT&0x0f)!=0x0F){//µÚ¶þ´ÎÅÐ¶Ï ´¥·¢P2ÒÆ¶¯ P2_data = 0xFE; for(i=0;i<4;i++){ Low_PORT = (P2_data<<i); back = (High_PORT & 0x0f); if(back!=0x0F){ switch(back){//ÐÐ case 0x0E:back= 0*4+i;break;// 0000 1110 10:A 11:b 12:C 13:D 14:E 15:f case 0x0D:back =1*4+i;break;//0000 1101 case 0x0b:back= 2*4+i;break; //0000 1011 case 0x07:back= 3*4+i;break; //0000 0111 default:break; } return (back +1); } } } } return 0; } void KeyAction(unsigned int x) { P1=LedChar[x]; }
51单片机IIC驱动程序 //SCL<->PB7 //SDA<->PB8 //IM<->PB9 sbit IIC_SCL = P1^0; sbit IIC_SDA = P1^1; //???IIC void IIC_Init(void) { IIC_SCL=1; IIC_SDA=1; } void delay_us(char num) { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } //??IIC???? void IIC_Start(void) { //SDA_OUT(); //sda??? IIC_SDA=1; IIC_SCL=1; delay_us(4); IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4); IIC_SCL=0;//??I2C??,????????? } //??IIC???? void IIC_Stop(void) { //SDA_OUT();//sda??? IIC_SCL=0; IIC_SDA=0;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SCL=1; IIC_SDA=1;//??I2C?????? delay_us(4); } //???????? //???:1,?????? // 0,?????? u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; //SDA_IN(); //SDA????? IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(IIC_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } IIC_SCL=0;//????0 return 0; } //??ACK?? void IIC_Ack(void) { IIC_SCL=0; //SDA_OUT(); IIC_SDA=0; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } //???ACK?? void IIC_NAck(void) { IIC_SCL=0; //SDA_OUT(); IIC_SDA=1; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } //IIC?????? //???????? //1,??? //0,??? void IIC_Send_Byte(u8 txd) { u8 t; //SDA_OUT(); IIC_SCL=0;//?????????? for(t=0;t<8;t++) { IIC_SDA=(txd&0x80)>>7; txd<<=1; delay_us(2); //?TEA5767?????????? IIC_SCL=1; delay_us(2); IIC_SCL=0; delay_us(2); } } //?1???,ack=1?,??ACK,ack=0,??nACK u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; //SDA_IN();//SDA????? for(i=0;i<8;i++ ) { IIC_SCL=0; delay_us(2); IIC_SCL=1; receive<<=1; if(IIC_SDA)receive++; delay_us(1); } if (!ack) IIC_NAck();//??nACK else IIC_Ack(); //??ACK return receive; } void IIC_WriteBytes(u8 WriteAddr,u8* datas,u8 dataLength) { u8 i; IIC_Start(); IIC_Send_Byte(WriteAddr); //????? IIC_Wait_Ack(); for(i=0;i<dataLength;i++) { IIC_Send_Byte(datas[i]); IIC_Wait_Ack(); } IIC_Stop();//???????? delay_ms(10); } void IIC_ReadBytes(u8 deviceAddr, u8 writeAddr,u8* datas,u8 dataLength) { u8 i; IIC_Start(); IIC_Send_Byte(deviceAddr); //????? IIC_Wait_Ack(); IIC_Send_Byte(writeAddr); IIC_Wait_Ack(); IIC_Send_Byte(deviceAddr|0X01);//?????? IIC_Wait_Ack(); for(i=0;i<dataLength-1;i++) { datas[i] = IIC_Read_Byte(1); } datas[dataLength-1] = IIC_Read_Byte(0); IIC_Stop();//???????? delay_ms(10); } void IIC_Read_One_Byte(u8 daddr,u8 addr,u8* datas) { IIC_Start(); IIC_Send_Byte(daddr); //????? IIC_Wait_Ack(); IIC_Send_Byte(addr);//???? IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(daddr|0X01);//?????? IIC_Wait_Ack(); *datas = IIC_Read_Byte(0); IIC_Stop();//???????? } void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 datas) { IIC_Start(); IIC_Send_Byte(daddr); //????? IIC_Wait_Ack(); IIC_Send_Byte(addr);//???? IIC_Wait_Ack(); IIC_Send_Byte(datas); //???? IIC_Wait_Ack(); IIC_Stop();//???????? delay_ms(10); }
51单片机获取按键程序 sbit K0=P3^4; sbit K1=P3^5; sbit K2=P3^2; sbit K3=P3^3; sbit K4=P2^1; sbit K5=P2^2; char get_key0(){ static char key_flag = 0,num=0; switch(key_flag){ case 0: key_flag = 1; num=0; //break; case 1: if((K0 == 0) ){ key_flag = 2; } break; case 2: num++; if(num > 3){ key_flag = 3; } break; case 3: if((K0 == 0) ){ key_flag = 4; }else{ key_flag = 0; } break; case 4: if((K0 == 0)){ num = 1; }else{ key_flag = 0; return 1; } break; } return 0; } char get_key1(){ static char key_flag = 0,num=0; switch(key_flag){ case 0: key_flag = 1; num=0; //break; case 1: if((K1 == 0) ){ key_flag = 2; } break; case 2: num++; if(num > 3){ key_flag = 3; } break; case 3: if((K1 == 0) ){ key_flag = 4; }else{ key_flag = 0; } break; case 4: if((K1 == 0)){ num = 1; }else{ key_flag = 0; return 1; } break; } return 0; } char get_key2(){ static char key_flag = 0,num=0; switch(key_flag){ case 0: key_flag = 1; num=0; //break; case 1: if((K2 == 0) ){ key_flag = 2; } break; case 2: num++; if(num > 3){ key_flag = 3; } break; case 3: if((K2 == 0) ){ key_flag = 4; }else{ key_flag = 0; } break; case 4: if((K2 == 0)){ num = 1; }else{ key_flag = 0; return 1; } break; } return 0; } char get_key3(){ static char key_flag = 0,num=0; switch(key_flag){ case 0: key_flag = 1; num=0; //break; case 1: if((K3 == 0) ){ key_flag = 2; } break; case 2: num++; if(num > 3){ key_flag = 3; } break; case 3: if((K3 == 0) ){ key_flag = 4; }else{ key_flag = 0; } break; case 4: if((K3 == 0)){ num = 1; }else{ key_flag = 0; return 1; } break; } return 0; } char get_key4(){ static char key_flag = 0,num=0; switch(key_flag){ case 0: key_flag = 1; num=0; //break; case 1: if((K4 == 0) ){ key_flag = 2; } break; case 2: num++; if(num > 3){ key_flag = 3; } break; case 3: if((K4 == 0) ){ key_flag = 4; }else{ key_flag = 0; } break; case 4: if((K4 == 0)){ num = 1; }else{ key_flag = 0; return 1; } break; } return 0; } char get_key5(){ static char key_flag = 0,num=0; switch(key_flag){ case 0: key_flag = 1; num=0; //break; case 1: if((K5 == 0) ){ key_flag = 2; } break; case 2: num++; if(num > 3){ key_flag = 3; } break; case 3: if((K5 == 0) ){ key_flag = 4; }else{ key_flag = 0; } break; case 4: if((K5 == 0)){ num = 1; }else{ key_flag = 0; return 1; } break; } return 0; } char getkeys(){ if(get_key0()){ return 1; } if(get_key1()){ return 2; } if(get_key2()){ return 3; } if(get_key3()){ return 4; } if(get_key4()){ return 5; } if(get_key5()){ return 6; } return 0; }
单片机是什么 单片机就是一个微控制器,简单讲就是一个微型的计算机,不过和计算机比,单片机还是缺少了一些I/O设备。但是,单片机虽然是微型的,但他也是五脏俱全的,他的组成如下:中央处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、定时/计数器(ROM)、并行输入输出(I/O)口、全双工串行口、中断系统、时钟电路。 所以,学习使用单片机是了解计算机原理与结构的最佳选择。 下面我们简单讲一下51单片机的结构,如下图中间的ALU(Arithmetic & Logical Unit)算术逻辑单元,由累加器和寄存器等几部分组成。ALU的作用是把传来的数据进行算术运算或逻辑运算, 输入来源是两个8位的二进制数据,分别来自累加器和数据寄存器。ALU能完成对这两个数据进行加、减、与、或、比较大小等操作,最后将结果放入到累加器。 左上角的RAM就是我们单片机的内存,我们定义的变量、数组都会存放到ram中,他是单片机运行时加载的。 其他的就是一些寄存器,我们使用C语言编程时,遇到了到时候在讲。 下一篇我们就进入单片机C语言编程,一边学C语言,一边学51单片机编程。 关注本贴吧,会持续更新单片机编程的内容哦。
51单片机串口基础知识——双机通信(二)串口通信协议 上一篇我们简单配置了下51单片机的串口,设置波特率为9600,数据格式为8N1.有同学认为这个8N1不就是通信协议吗? 这个当然不是了,这个只是对串口的硬件进行配置,如下: 串口参数设置 通信速率 波特率 数据位 停止位 校验位 9600 8位 1位 无 电脑的串口助手设置如下只要大家把串口都配置成8N1,波特率为9600,我们就可以让单片机和电脑进行串口通信了。 但是通信也要有通信协议,否则数据传输会出现问题,就比如,一个用汉语讲话,一个用英语讲,他俩虽然在通话,但是谁也听不懂谁在讲什么。 我们的通信协议最简单的格式就是 数据头 数据 AT 123 复杂一点的协议如下图: 长度(byte) 1 2 1 1 变长 1 1 含义 79H L Ctrl Cmd Data CSUM CXOR 帧格式的各个域中,大于一个字节的域,均使用小端字节序(以下称小端)传输。 79H:帧头。 L:数据域 Data 的长度。 Ctrl:控制域。 Cmd:指令字。 Data:数据域。 CSUM:和校验,是 L、Ctrl、Cmd、Data 所有字节算术和,不考虑溢出。 CXOR:异或校验,初始值为 0,是 L、Ctrl、Cmd、Data 所有字节的异或。 协议的制定是为了保证通信的稳定性和正确性。如上面的复杂协议,最后哈加了和校验和异或校验。 好,协议的知识先讲这么多,以后我们在讲下数据发送超时判断等。接下来我们简单看下C语言是怎么实现串口协议的,我们还是以最简单的协议为例子,如下 --------------------------------------- 串口发送数据程序 char RecvString_buf[16]="AT0000.0\r\n"; void main(void) { int data_adc; Init_USART() ; while(1){ RecvString_buf[2] = data_adc/10000 + '0'; RecvString_buf[3] = data_adc /1000%10 + '0'; RecvString_buf[4] = data_adc/100%10 + '0'; RecvString_buf[5] = data_adc /10 % 10 + '0'; RecvString_buf[7] = data_adc % 10 + '0'; send_data(RecvString_buf,10) ; Delay_1ms(1000); } } /* 串口发送数据 */ void send_data(unsigned char *TXStr,char num) { char i; ES=0; //while(*TXStr!=0) for(i = 0; i < num; i++)// { SBUF=*TXStr; while(TI==0);// TI=0; TXStr++; } ES=1; } --------------------------------------------------- 串口接收数据程序 unsigned char recv_num = 0; unsigned int recv_data_BH = 0; void USART() interrupt 4 { char g_recstr; g_recstr=SBUF; if(RecvString_buf[0] == 'A'){ RecvString_buf[recv_num] = g_recstr; recv_num++; if(recv_num >= 10){ recv_data_BH = (RecvString_buf[2]-'0') * 10000 + (RecvString_buf[3]-'0') * 1000 + (RecvString_buf[4]-'0') * 100 + (RecvString_buf[5]-'0') * 10 + (RecvString_buf[7]-'0') ; recv_num = 0; RecvString_buf[0] = 'b'; } } if((g_recstr == 'A') && (recv_num == 0)){ RecvString_buf[0] = 'A'; recv_num = 1; } RI=0; } 欢迎大家回复和提出问题,关于串口通信的问题我会一一解答(* ̄) ̄) 如果对大家有所帮助,也欢迎关注本贴吧
51单片机串口基础知识——双机通信(一) 玩过51单片机的都应该用过串口,把单片机的数据发送到电脑的串口助手进行显示。今天我们讲一下怎么用两个单片机的串口进行通信,也就是一个单片机采集数据,通过串口发送到另一个单片机进行显示数据,仿真如上图,想要仿真和程序的,可以回复“双机通信程序”来获取。 这个接线也简单,需要注意的是一个单片机的RX要接另一个单片机的TX哦,而不是RX接RX。 下面我简单讲一下51单片机的串口通信程序,供大家参考。 我们串口波特率配置成9600、8位数据位,无校验,1位停止位,也就是我们经常说的8N1. ================================ 接下来讲一下串口要用到的寄存器: (1)SCON控制寄存器: SCON: D7 D6 D5 D4 D3 D2 D1 D0 SM0 SM1 SM2 REN TB8 RB8 TI RI (1).SM0、SM1:串行口工作方式控制位。 SM0 SM1 工作方式 功能 波特率 0 0 方式0 8位同步移位寄存器 F/12 0 1 方式1 10位UART 可变 1 0 方式2 11位UART F/64或F/32 1 1 方式3 11位UART 可变 我们选择方式1,10位UART。啥不是8位数据吗?怎么变成10位了。 哈哈哈,是8位数据位,加1位停止位,在加1位起始位,就是10位咯。 (2).SM2:多机通信控制位。 (3).REN:允许接收位。 (4).TB8:发送接收数据位8。 (5).RB8:接收数据位8。 (6).TI:发送中断标志位。 (7).RI:接收中断标志位。 SCON当然可以根据通讯需要设置的, SCON=0x50是SM1=1和REN=1,设置串口方式1且允许串口接收。 一般配合TMOD=0x20作串口中断程序初始化。 ================================= (2)TMOD寄存器 TMOD寄存器 B7 B6 B5 B4 B3 B2 B1 B0 GATE C/T M1 M0 GATE C/T M1 M0 M1 M0 工作模式 0 0 13位计数/计时器 0 1 16位计数/计时器 1 0 8位自动加载计数/计时器 1 1 定时器1停止工作,定时器0分为两个独立的8位定时器TH0及TL0 TMOD=0X20:使用定时器1,8位自动加载计时器 ===================================== 串口波特率计算 和波特率有关的还有一个寄存器PCON,这个寄存器的最高位置1就可以把波特率提高一倍,即PCON|=0x80,波特率计算公式为TH1 = TL1 = 256 – 晶振值/12/16/波特率 我们以晶振为12M,波特率为9600为例子,如下 TH1 = TL1 = 256 –12000000/12/16/9600 = 250 = 0xfa ========================================= 好有了上面的基础,我们就开始写程序,如下 1、串口初始化程序 void Init_USART() { SCON=0x50; //串口方式1,使能接收 TMOD|=0x20; //定时器1工作方式2(8位自动重装初值) TMOD&=~0x10; TH1=0xfa; //9600bps TL1=0xfa; PCON|=0x80; //SMOD=1 TI=0; //发送中断标志位 RI=0; //接收中断标志位 ES=1; //开启串口中断使能 TR1=1; //启动定时器1 EA = 1; //开启总中断 } TMOD|= 0x20和TMOD= 0x20有什么区别啊,为什么使用前者呢?? TMOD|= 0x20等价于,TMOD= TMOD|0x20 表示将TMOD的第5位置1,而后者表示直接赋值。所以只让TMOD的第5位置1而不改变其他位的值就用TMOD|= 0x20 2、串口发送数据程序 void send_data(unsigned char *TXStr,char num) { char i; ES=0; for(i = 0; i < num; i++) { SBUF=*TXStr; while(TI==0); TI=0; TXStr++; } ES=1; } 3、串口接收数据程序 char g_recstr; void USART() interrupt 4 { g_recstr=SBUF; RI=0; } ============================== 好了,今天先讲这么多,接下来我们会讲一下双机通信的通信协议哦,如果对你有用请给《嵌入式单片机设计》点个关注哦。也欢迎大家在嵌入式单片机设计吧发帖分享你的学习心得,大家一起交流学习。
1
下一页