算法收藏-C语言版

本文介绍了一系列实用的编程技巧,包括生成指定范围内的随机数、使用printf函数进行可变参数打印、数字到字符串的转换方法以及图像显示的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获得一个随机数(min~max)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/**
  * @brief  获得一个随机数
  * @param  None
  * @retval	None
 */
static uint32_t rand_num_create(uint32_t min,uint32_t max)
{
    uint32_t rand_num = 0;
    srand((int)time(0));
    rand_num = min + rand()%( max - min + 1);
    return rand_num;
}

Printf函数封装(打印可变参数)

#include <stdio.h>
#include <string.h>
#include <stdarg.h>                 // 可变参数头文件
#include "bsp_dma_uart.h"
/**
  *@brief 串口1,DMA不定长发送函数
  *@param fmt:需要发送变量
  *@return 使用方法同printf
*/
void bsp_debug_printf(char *fmt, ...)
{
    char printf_buf[USART1_DMA_TX_LENTH] = {0};
	va_list args;
	va_start(args, fmt);
	vsnprintf(printf_buf,USART1_DMA_TX_LENTH, fmt, args);       //打印不超过USART1_DMA_TX_LENTH
    
    
	int i = 0,j = 0;

    while(t_usart1_data_value.Tx_Dma_Busy_Flag && (j < 50000)){j++;}            /*等待DMA空闲*/
    while((DMA_GetFlagStatus(DMA1_FLAG_TC4) != RESET)&&(i < 50000) ){i++;}	

    t_usart1_data_value.Tx_Dma_Busy_Flag = 1;                                   /*置位dma忙标志*/
    memcpy(t_usart1_data_value.Usart1_Tx_Buf, printf_buf, strlen(printf_buf));	/*复制发送数据*/
    DMA_SetCurrDataCounter(DMA1_Channel4, strlen(printf_buf));		            /*设置传输数据长度*/
    DMA_Cmd(DMA1_Channel4, ENABLE);							                    /*打开DMA开始发送*/		
	
}
bsp_debug_printf("data_len:%d\r\n",t_rs485_buff.data_len);

数字转字符串算法

/**
  *@brief 将10进制数字转换为字符串
  *@param num 10进制数字  data 转换后字符串
  *@return None
  *@note  data的空间要足够(> 数字位数)
*/
void app_misc_num_to_string(unsigned long int num,unsigned char *data )
{
	 int i = 0;
	 unsigned char *save_data = data;
	 while(num > 0)
	 {
		 *data = num%10 + 48;
		  data++;
		  i++;
		  num = num/10;
	 }  
	 for(unsigned int j = 0;j < i/2;j++)
	 {
		unsigned char tmp_char;
		tmp_char = *(save_data + j);
		*(save_data + j) = *(data-1-j);
		*(data-1-j) = tmp_char;
	 }
}

数字转字符串

    #include <stdio.h>
    char *id[5] = {0};//使用字符串要记得给末尾/0留空间,比需要转换的多一个字节
    sprintf(remoter_id,"%04d",123);//将数字123转换成字符串"0123"
    sprintf(remoter_id,"%d",1234);//将数字1234转换成字符串"1234"

超时跳出

    uint32_t time_out = 3000000;
    while(!isEPD_W21_BUSY && time_out--){}     

Image2Lcd软件图像生成图码转换

/** @brief 单色图片显示,清屏显示
水平扫描,自左向右,自顶至底,低位在前 转 水平扫描,自左向右16灰
 */
void showBitMap(uint8_t *back_image)
{
    int i = 0,j = 0,k = 0; 
    const uint16_t send_fifo_num = 1024;
    uint8_t *send_data = NULL;
    send_data = os_mem_zalloc(RAM_TYPE_DATA_ON, send_fifo_num);
    memset(send_data,0xff,send_fifo_num);
    
    LCD_TFT_CS_0;
    hw_tft_set_region(0,0,128-1,128-1);
    
    for(i = 0;i < 2048;i++)
    {	
        
        for(j = 0; j < 8; j++)
        {
            if((back_image[i] << j) & 0x80)
            {
                send_data[k] = 0x00;
                send_data[k + 1] = 0x00;
                
            }
            else
            {
                send_data[k] = 0xff;
                send_data[k + 1] = 0xff;
            }
            k += 2;
            if(k >= send_fifo_num)
            {
                hw_spi_send_data(send_data,send_fifo_num); 
                memset(send_data,0xff,send_fifo_num);
                k = 0;
            }
        }
         						
    }
    os_mem_free(send_data);
    LCD_TFT_CS_1;

}

/** @brief 单色图片显示,清屏显示
水平扫描,自右向左单色 转 数据水平,字节垂直,自右向左扫描16灰
 */
void showBitMap(uint8_t *back_image)
{
    int i = 0,j = 0,k = 0,m = 0; 
    const uint16_t send_fifo_num = 1024;
    uint8_t *send_data = NULL;
    send_data = os_mem_zalloc(RAM_TYPE_DATA_ON, send_fifo_num);
    memset(send_data,0xff,send_fifo_num);
    
    LCD_OLED_CS_0;
    hw_oled_set_region(0,0,128-1,64-1);

    for(i = 0; i < 128; i+=2)
    {
        for(j = 0;j < 16; j++)
        {
            for(k = 0; k < 8; k++)
            {
                if(((back_image[i * 16 + j]) << k) & 0x80)
                {
                    send_data[m] = 0x00;
                }
                else
                {
                    send_data[m] = 0xff;
                }
                if(((back_image[(i + 1) * 16 + j]) << k) & 0x80)
                {
                    send_data[m] &= 0xf0;
                }
                else
                {
                    send_data[m] |= 0x0f;
                }
                m++;
                if(m >= send_fifo_num)
                {
                    hw_spi_send_data(send_data,send_fifo_num); 
                    memset(send_data,0xff,send_fifo_num);
                    m = 0; 
                }
            }
        }
    }
    os_mem_free(send_data);
    LCD_OLED_CS_1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值