发新帖我要提问
12
返回列表
打印
[应用相关]

STM32+2.4GNRF24L的应用

[复制链接]
楼主: dingbo95
手机看帖
扫描二维码
随时随地手机跟帖
21
dingbo95|  楼主 | 2018-4-30 22:41 | 只看该作者 回帖奖励 |倒序浏览
#ifndef USE_FLASH_CHAR
/****************************************************************************
* Function Name  : GUI_Show12ASCII
* Description    : 写12号ASCII码
* Input          : x:起始X坐标
*                * y:起始Y坐标
*                * p:字符串首地址
*                * wordColor:字体颜色
*                * backColor:背景颜色
* Output         : None
* Return         : None
****************************************************************************/

void GUI_Show12ASCII(uint16_t x, uint16_t y, uint8_t *p,
                     uint16_t wordColor, uint16_t backColor)
{
        uint8_t i, wordByte, wordNum;
        uint16_t color;

        while(*p != '\0')   //检测是否是最好一个字
        {
        /* 在字库中的ASCII码是从空格开始的也就是32开始的,所以减去32 */
                wordNum = *p - 32;
               
        TFT_SetWindow(x, y, x+7, y+15);           //字宽*高为:8*16
                for (wordByte=0; wordByte<16; wordByte++) //每个字模一共有16个字节
                {
                        color = ASCII8x16[wordNum][wordByte];
                        for (i=0; i<8; i++)
                        {
                                if ((color&0x80) == 0x80)
                                {
                                        TFT_WriteData_Color(wordColor);
                                }                                                
                                else
                                {
                                        TFT_WriteData_Color(backColor);
                                }        
                                color <<= 1;
                        }
                }

                p++;    //指针指向下一个字
               
        /* 屏幕坐标处理 */
        x += 8;
        if(x > TFT_XMAX -8)   //TFT_XMAX -8
        {
            x = 0;
            y += 16;   
        }
        }
}

#else

使用特权

评论回复
22
dingbo95|  楼主 | 2018-4-30 22:41 | 只看该作者
/****************************************************************************
* Function Name  : GUI_Show12Char
* Description    : 通过FLASH字库显示12号字母和汉字(使用GBK)
* Input          : x:起始X坐标
*                * y:起始Y坐标
*                * ch:字符串首地址
*                * wordColor:字体颜色
*                * backColor:背景颜色
* Output         : None
* Return         : None
****************************************************************************/

void GUI_Show12Char(uint16_t x, uint16_t y, uint8_t *ch,
                    uint16_t wordColor, uint16_t backColor)
{
    uint8_t i, j, color, buf[32];
    uint16_t asc;
    uint32_t wordAddr = 0;

    while(*ch != '\0')
    {
        /*显示字母,ASCII编码 */
        if(*ch < 0x80)  //ASCII码从0~127
        {
            /* 在字库中的ASCII码是从空格开始的也就是32开始的,所以减去32 */
                    wordAddr = *ch - 32;
            wordAddr *= 16;
            wordAddr += GUI_FLASH_ASCII_ADDR;
            
            /* 读取FLASH中该字的字模 */
            FLASH_ReadData(buf, wordAddr, 16);
            
            /* 显示该文字 */               
            TFT_SetWindow(x, y, x+7, y+15);           //字宽*高为:8*16
                    for (j=0; j<16; j++) //每个字模一共有16个字节
                    {
                            color = buf[j];
                            for (i=0; i<8; i++)
                            {
                                    if ((color&0x80) == 0x80)
                                    {
                                            TFT_WriteData_Color(wordColor);
                                    }                                                
                                    else
                                    {
                                            TFT_WriteData_Color(backColor);
                                    }        
                                    color <<= 1;
                            }
                    }
   
                    ch++;    //指针指向下一个字
                   
            /* 屏幕坐标处理 */
            x += 8;
            if(x > TFT_XMAX -8)   //TFT_XMAX -8
            {
                x = 0;
                y += 16;   
            }            
        }
        /* 显示汉字,GBK编码 */
        else
        {
            /* 将汉字编码转换成在FLASH中的地址 */
            asc = *ch - 0x81;     //高字节是表示分区,分区是从0x81到0xFE,所以转换成地址-0x80
            wordAddr = asc * 190; //每个分区一共有190个字
   
            asc = *(ch + 1); //低字节代表每个字在每个分区的位置,它是从0x40到0xFF
            if(asc < 0x7F)   //在0x7F位置有个空位,但是我们取模不留空,所以大于0x7F之后多减一
            {
                asc -= 0x40;
            }
            else
            {
                asc -= 0x41;
            }
            
            wordAddr += asc; //求出在GBK中是第几个字
            wordAddr *= 32;  //将字位置转换位FLASH地址
            wordAddr += GUI_FLASH_12CHAR_ADDR; //加上首地址
   
            /* 读取FLASH中该字的字模 */
            FLASH_ReadData(buf, wordAddr, 32);
   
            /* 在彩屏上面显示 */
            TFT_SetWindow(x, y, x+15, y+15);
            for(i=0; i<32; i++)
            {
                 
                color = buf[i];            
                for(j=0; j<8; j++)
                        {
                                if((color & 0x80) == 0x80)
                                {
                                        TFT_WriteData_Color(wordColor);
                                }                                                
                                else
                                {
                                        TFT_WriteData_Color(backColor);
                                }
                                color <<= 1;
                        }//for(j=0;j<8;j++)结束
            }
   
            /* 屏幕坐标处理 */
            x += 16;
            if(x > TFT_XMAX -15)   //TFT_XMAX -15
            {
                x = 0;
                y += 16;   
            }
   
            /* 写下一个字,每个汉字占两个字节所以+2 */
            ch += 2;            
        }
    }   
}

使用特权

评论回复
23
dingbo95|  楼主 | 2018-4-30 22:43 | 只看该作者
/****************************************************************************
* Function Name  : GUI_Show12Chinese
* Description    : 通过FLASH字库显示12号汉字(使用GBK)
* Input          : x:起始X坐标
*                * y:起始Y坐标
*                * cn:字符串首地址
*                * wordColor:字体颜色
*                * backColor:背景颜色
* Output         : None
* Return         : None
****************************************************************************/

void GUI_Show16Chinese(uint16_t x, uint16_t y, uint8_t *cn,
                       uint16_t wordColor, uint16_t backColor)
{   
    uint8_t i, j, color, buf[63];
    uint16_t asc;
    uint32_t wordAddr = 0;   
    while(*cn != '\0')
    {  
        /* 将汉字编码转换成在FLASH中的地址 */
        asc = *cn - 0x81;     //高字节是表示分区,分区是从0x81到0xFE,所以转换成地址-0x80
        wordAddr = asc * 190; //每个分区一共有190个字

        asc = *(cn + 1); //低字节代表每个字在每个分区的位置,它是从0x40到0xFF
        if(asc < 0x7F)   //在0x7F位置有个空位,但是我们取模不留空,所以大于0x7F之后多减一
        {
            asc -= 0x40;
        }
        else
        {
            asc -= 0x41;
        }
        
        wordAddr += asc; //求出在GBK中是第几个字
        wordAddr *= 63;  //将字位置转换位FLASH地址
        wordAddr += GUI_FLASH_16CHAR_ADDR; //加上首地址

        /* 读取FLASH中该字的字模 */
        FLASH_ReadData(buf, wordAddr, 63);

        /* 在彩屏上面显示 */
        TFT_SetWindow(x, y, x+23, y+20);
        for(i=0; i<63; i++)
        {
            color = buf[i];            
            for(j=0; j<8; j++)
                    {
                            if((color & 0x80) == 0x80)
                            {
                                    TFT_WriteData_Color(wordColor);
                            }                                                
                            else
                            {
                                    TFT_WriteData_Color(backColor);
                            }
                            color <<= 1;
                    }//for(j=0;j<8;j++)结束
        }

        /* 屏幕坐标处理 */
        x += 21;
        if(x > 218)   //TFT_XMAX -21
        {
            x = 0;
            y += 21;   
        }

        /* 写下一个字,每个汉字占两个字节所以+2 */
        cn += 2;      
    }   
}

#endif

使用特权

评论回复
24
dingbo95|  楼主 | 2018-4-30 22:43 | 只看该作者
/****************************************************************************
* Function Name  : GUI_FontUpdate
* Description    : 更新字库
* Input          : updateState:选择更新的字库
* Output         : None
* Return         : None
****************************************************************************/

void GUI_FontUpdate(uint8_t updateState)
{
    FRESULT res;
        FIL fsrc;
        UINT  br;
    uint32_t wordAddr, i, j;

#ifdef __MALLOC_H       
    uint8_t *p;
    p = malloc(4096);                  //开辟一个内存块
    if(p == 0)
    {
        return;
    }
#else
        uint8_t buffer[512];
#endif           

    /* 更新ASCII字库 */
    if((updateState & GUI_UPDATE_ASCII) == GUI_UPDATE_ASCII)
    {
        /* 设置写入起始地址 */
        wordAddr = GUI_FLASH_ASCII_ADDR;
        j = 0;

        /* 打开读取文件 */
        res = f_open(&fsrc, GUI_ASCII_FILE, FA_READ);       
            if(res == FR_OK)  //打开成功
        {
                 for (;;)      //开始读取数据
                 {      
#ifdef __MALLOC_H       
                res = f_read(&fsrc, p, 4096, &br);
   
                /* 将读取到的数据写入FLASH */
                FLASH_WriteData(p, wordAddr, br);
                      wordAddr += br;   //写入地址增加

#else
                res = f_read(&fsrc, buffer, sizeof(buffer), &br);
   
                /* 将读取到的数据写入FLASH */
                FLASH_WriteData(buffer, wordAddr, br);
                      wordAddr += br;   //写入地址增加
#endif
                j += br;
                i = j * 100 / 1456;
                GUI_Box(0, 80, i, 90, RED);   

                if (res || br == 0)
                            {
                                    break;    // error or eof
                            }
            }
        }
             
        f_close(&fsrc);  //不论是打开,还是新建文件,一定记得关闭
    }

    /* 更新12号汉字库 */
    if((updateState & GUI_UPDATE_12CHAR) == GUI_UPDATE_12CHAR)
    {
        wordAddr = GUI_FLASH_12CHAR_ADDR;
        j = 0;

        res = f_open(&fsrc, GUI_12CHAR_FILE, FA_READ);
           
            if(res == FR_OK)
        {  
                 for (;;)  
                 {      
#ifdef __MALLOC_H       
                res = f_read(&fsrc, p, 4096, &br);
   
                /* 将读取到的数据写入FLASH */
                FLASH_WriteData(p, wordAddr, br);
                      wordAddr += br;   //写入地址增加
#else
                res = f_read(&fsrc, buffer, sizeof(buffer), &br);
   
                FLASH_WriteData(buffer, wordAddr, br);
                      wordAddr += br;
#endif
                j += br;
                i = j * 100 / 766080;
                GUI_Box(0, 95, i, 105, RED);   

   
                if (res || br == 0)
                            {
                                    break;    // error or eof
                            }
            }
        }
        f_close(&fsrc);  //不论是打开,还是新建文件,一定记得关闭
    }
   
    /* 更新16号汉字库 */
    if((updateState & GUI_UPDATE_16CHAR) == GUI_UPDATE_16CHAR)
    {
        
        wordAddr = GUI_FLASH_16CHAR_ADDR;
        j = 0;

        res = f_open(&fsrc, GUI_16CHAR_FILE, FA_READ);       
            if(res == FR_OK)
        {
                 for (;;)  
                 {      
#ifdef __MALLOC_H       
                res = f_read(&fsrc, p, 4096, &br);
   
                /* 将读取到的数据写入FLASH */
                FLASH_WriteData(p, wordAddr, br);
                      wordAddr += br;   //写入地址增加
#else
                res = f_read(&fsrc, buffer, sizeof(buffer), &br);
   
                FLASH_WriteData(buffer, wordAddr, br);
                      wordAddr += br;
#endif
                j += br;
                i = j * 100 / 1508220;
                GUI_Box(0, 110, i, 120, RED);   

   
                if (res || br == 0)
                            {
                                    break;    // error or eof
                            }
            }
        }
             
        f_close(&fsrc);  //不论是打开,还是新建文件,一定记得关闭
    }
#ifdef __MALLOC_H       
    free(p);
#endif
}

#endif

使用特权

评论回复
25
dingbo95|  楼主 | 2018-4-30 22:44 | 只看该作者
void lcd_display()           //LCD初始化显示
{
        TFT_ClearScreen(BLACK);
        GUI_Show12ASCII(10,10,"PRECHIN",GREEN,BLACK);
        GUI_Show12ASCII(10,30,"www.prechin.com",GREEN,BLACK);
        GUI_Show12ASCII(10,50,"NRF24L01 Test!",GREEN,BLACK);       
        GUI_Show12ASCII(10,70,"2015-11-13",GREEN,BLACK);
        GUI_Show12ASCII(10,90,"K_UP:RX_Mode  K_DOWN:TX_Mode",GREEN,BLACK);
       

}

使用特权

评论回复
26
dingbo95|  楼主 | 2018-4-30 22:45 | 只看该作者
void data_pros()        //数据处理函数
{
        u8 key;
        static u8 mode=2;  //模式选择
        u8 rx_buf[33]="www.prechin.com ";
        static u16 t=0;
        while(1)                //等待按键按下进行选择发送还是接收
        {
                key=keyscan(0);       
                if(key==K_UP_PRESS)           //接收模式
                {
                        mode=0;
                        GUI_Show12ASCII(10,140,"RX_Mode",RED,BLACK);       
                        GUI_Show12ASCII(10,160,"Received Data:",RED,BLACK);
                        GUI_Show12ASCII(120,160,"                ",RED,BLACK);
                        break;
                }
                if(key==K_DOWN_PRESS)         //发送模式
                {
                        mode=1;
                        GUI_Show12ASCII(10,140,"TX_Mode",RED,BLACK);
                        GUI_Show12ASCII(10,160,"Send Data:    ",RED,BLACK);
                        GUI_Show12ASCII(120,160,"              ",RED,BLACK);
                        break;
                }       
        }
       
        if(mode==0)                //接收模式
        {       
                NRF24L01_RX_Mode();       
                while(1)
                {
                        if(NRF24L01_RxPacket(rx_buf)==0) //接收到数据显示
                        {
                                rx_buf[32]='\0';
                                GUI_Show12ASCII(120,160,rx_buf,RED,BLACK);
                                break;                       
                        }
                        else
                        {
                                delay_ms(1);
                        }
                        t++;
                        if(t==1000)
                        {
                                t=0;
                                led1=~led1; //一秒钟改变一次状态
                        }       
                }       
        }
        if(mode==1)                 //发送模式
        {
                               
                NRF24L01_TX_Mode();
                while(1)
                {
                        if(NRF24L01_TxPacket(rx_buf)==TX_OK)
                        {
                                GUI_Show12ASCII(120,160,rx_buf,RED,BLACK);
                                break;       
                        }
                        else
                        {
                                GUI_Show12ASCII(120,160,"Send Data Failed  ",RED,BLACK);
               
                        }       
                }       
        }
}

使用特权

评论回复
27
失心恋2015| | 2018-10-24 11:32 | 只看该作者
楼主能否分享下工程文件,1510347480@qq.com    谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则