查看: 4079|回复: 1

STM32驱动2.4寸显示屏显示SD卡的图片,Modbus通信控制显示文字与图片

[复制链接]
发表于 2013-1-8 18:52:32 | 显示全部楼层 |阅读模式
关键词: Modbus通信
本人自用STM32驱动2.4寸显示屏显示SD卡的图片,Modbus通信控制显示文字与图片   
供大家参考

一个完整的工程给大家分享一下,内容如标题所示

显示屏:采用国产机通用2.4寸显示屏
主控:STM32F103VET6(100)
SD卡座:MINI型。
光藕:TLP-621
电源芯片:初定TD1410+ASM1117
字库:GT23L32S4W
485接口:未定义


原理图
[attachment=6]


通信协议为Modbus rtu

主程序如下

/*******************************************************************************
文件名:        main.c
说  明:       主程序
作  者:         汪平
版  本:        ver1.0
日  期:      2012.07.28
邮箱:        gdwhwp@163.com
个人网站:  www.gdwhwp.com
*******************************************************************************/
#include "ffnFAT.h"
#include
#include
#include
#include "SPI_SD_driver.h"
#include "stm_res.h"
//#include "LCD_Driver\TFT_Driver.h"


#define COLOR(r,g,b) (((r) << 8) & 0xF800) | (((g) << 3) & 0x7E0) | ((b) >> 3); //r红色分量 0~31  g绿色分量 0~63  b蓝色分量 0~31

#define Picture_Reg RegisterData[0]              //第一个寄存是图片显示
#define Keyboard_Reg RegisterData[1]          //第二个寄存器按键状态
#define WordType_Reg RegisterData[2]          //显示文字字体
#define wordcolor_Reg RegisterData[3]          //显示文字颜色
#define backcolor_Reg RegisterData[4]          //显示文字背景颜色

unsigned char Dev_No;  //设备号
struct znFAT_Init_Arg *pArg; //用于指针文件系统参数集合的指针
struct znFAT_Init_Arg Init_Arg_SDCARD; //文件系统参数集合,用于记录文件系统的重要参数
//调试打开SD卡根目录下test.txt文件
struct FileInfoStruct FileInfo_FFN;    //文件参数集合

unsigned char read_Buffer[512];
char Show_HANZI1[]="显示屏只是提供参考";
char Show_HANZI2[]="设计者:汪平";
char Show_wangzan[]="gdwhwp.com";

#define Show_String_Size 24
char Show_String[30][40] =
{
/*    1    */      "设计者:汪平",
/*    2    */      "个人网站:gdwhwp.com",
/*    3    */      "QQ:570542229",
/*    4    */      "写下你要显示的内容",
/*    5    */      "随意。。。。",
/*    6    */      "设计者:汪平",
/*    7    */      "个人网站:gdwhwp.com",
/*    8    */      "QQ:570542229",
/*    9    */      "写下你要显示的内容",
/*    10    */      "随意。。。。",
};

unsigned char Picture_Show = 0;
extern unsigned short Key_State;

UINT32 FileTotalSector;

UINT32 counter = 0; //记录实时读取扇区
UINT8 flagdebug = 0xff;

UINT8 VOL_VALUE=0x25; //

UINT8 CurrentFileNum = 0;
UINT16  SongFileTotal = 0;

UINT8  UserHitKeyReturn = 0;

struct
{
    u16 dcolor;           //显示颜色
    u16 bcolor;           //背景颜色
    u16 type;           //字体类型
    u16 start_y;           //背景颜色
}Show_Word;

///////////////红外///////////////
extern u8 irnum;  //红外用全局变量
extern volatile  u8 irtime;
u8 irpro_ok,irok; //完成标志位
extern UINT8 Uart1_Get_Flag;    //串口1接收到数据标志
extern UINT8 Uart1_Get_Data;    //串口1接收的数据

extern u8 bSerialDataOK;
extern u16 RegisterData[20];

volatile u8 MP3_irRmote_flag = 0;
volatile u8 g_HiPlayer_Stop_Flag = 0;
volatile u8 g_HiPlayer_Pause_Flag = 0;

extern unsigned short Master_UART_Data;
///////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
//函数声明
void SearchNearestLocationPoint(UINT32 nGps_x,UINT32 nGps_y);

extern  void VS1003SendDat(u8 dat);
extern  void VS1003_FlushBuffer() ;
extern  void VS1003_SetHighSpeedSPI();

extern UINT32 znFAT_Read_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf);

extern unsigned char const image[3200];


////////////////////////////////////////////////////////////////////////////////////
void Device_Init(void)
{
    STM_ChipInResConfigInit();
    GPIO_GT23L32S4W_Init();
    SD_Init();

    //文件系统初始化
    pArg=&Init_Arg_SDCARD; //指针指向SD卡文件系统参数集合,znFAT将从这个集合中获取参数
    Dev_No=SDCARD;    //设备号为SDCARD,ffnFAT依照此设备号选择存储设备驱动     SDCARD 在ffnFAT.h里定义
    znFAT_Init(); //初始化FAT32文件系统
}


void Show_String_Sreen(void)
{     
     GT23L32S4W_Read_ZF_ASC((WordType_Reg+2)*(Picture_Reg-200)+WordType_Reg/2,Show_Word.start_y+WordType_Reg/2,Show_String[Picture_Reg-200],WordType_Reg,wordcolor_Reg,backcolor_Reg);
}

void Display_Bmp_Pic()
{
unsigned int i=0;
unsigned int j=0;
unsigned int k=0;
unsigned int color=0;
// set_window();
LCD_Set_area(0,0,239,319);
for(i=0;i<1920;i++) //读取76800个点的颜色数据
{
   znFAT_Read_File(&FileInfo_FFN,(unsigned long)i*120+54,120,read_Buffer);
  for(j=0;j<40;j++)
  {   
   color=COLOR(read_Buffer[2+3*j],read_Buffer[1+3*j],read_Buffer[0+3*j]);
  //  color = (unsigned int)file_buf[k*2+1]<<8|(unsigned int)file_buf[k*2];
   LCD_Write_Data_16(color);
// UART_Put_Num(file_buf);
  }
}
Picture_Show  = 0;
// MAX485_Putc(9);
//UART_Send_Str("图像显示完毕\n");
// FAT32_File_Close(&FileInfo);
//UART_Send_Str("文件已关闭\n");
}
#if 1
//主函数    WHY1S-LSUIR-MCSJV-S6T0S-VQ5IS-2NITP
int main(void)
{
    int dly = 0;
    unsigned int i,j,k;   
    unsigned short Color = 0;
    unsigned char item=0;
    wordcolor_Reg = Show_Word.dcolor = BLUE;
    backcolor_Reg = Show_Word.bcolor = WHITE;
    Show_Word.type = WordType_Reg = 24;
    Show_Word.start_y = 0;
    Device_Init();
    LCD_IO_Init();
    Keyboard_Init();
    GPIO_ResetBits(GPIOA, GPIO_Pin_8); //背光
    LCD_Init();   //tft初始化
//    Clr_Cs;  //打开片选使能   
    Pant(0xffff);    //清屏

    //初始化串口
    USART1_Config(9600);
    MAX485_Puts("UART1");

    //初始化NVIC
       NVIC_Configuration();

    show_asc_8X16_str(30,60,"Hello !Wellcom to use",BLUE,WHITE);
    GT23L32S4W_Read_ZF_ASC(100,80,Show_wangzan,24,BLUE,WHITE);
    GT23L32S4W_Read_ZF_ASC(200,80,Show_HANZI2,24,RED,WHITE);
    LCD_Delay_Ms(2000);
    GT23L32S4W_Read_ZF_ASC(150,50,Show_HANZI1,24,RED,WHITE);

    LCD_Delay_Ms(2000);
    Pant(RED);    //清屏
    LCD_Delay_Ms(1000);
    Pant(BLUE);    //清屏
    LCD_Delay_Ms(1000);
    Pant(GREEN);    //清屏
    LCD_Delay_Ms(2000);
    Pant(0xffff);    //清屏
    //SD_ReadSingleSector(0,read_Buffer);

    while(!znFAT_Open_File(&FileInfo_FFN, "\\*.bmp",SongFileTotal,SongFileTotal+1))    //打开U盘根目录下所有目录中的第n个
    {         
        SongFileTotal++;
    }

    //VS1003_SetHighSpeedSPI();  //SPI高速
    GPIO_SetBits(GPIOA, GPIO_Pin_2);         

    while(1)
    {
        LCD_Delay_Ms(20);
        Board_Key_Scan();   

        if(bSerialDataOK == 1)          //03
        {
            DoWithRevData();
            bSerialDataOK = 0;
        }
        else if(bSerialDataOK == 2)       //06
        {
            bSerialDataOK = 0;
        }
        if(Picture_Reg >= 100 && Picture_Reg < 200)            //图片
        {
            CurrentFileNum = Picture_Reg - 100;
            if(CurrentFileNum
            {
                Picture_Show = 1;
                Master_UART_Data = 0;
                Picture_Reg=0;
            }
//            MAX485_Putc(1);
        }
        else if(Picture_Reg >=200)                     //字
        {

            Show_String_Sreen();
            Picture_Reg=0;
        }
        while(Picture_Show == 1)
        {
            if(!znFAT_Open_File(&FileInfo_FFN,"\\*.bmp",CurrentFileNum,SongFileTotal))
            {
                Display_Bmp_Pic();               
            }
        }

    }
}
#endif

字库程序


har CHR_MSB;
  unsigned char CHR_LSB;
  CHR_MSB=*P_chr;

  if(CHR_MSB<0x80)//ASCII ,半角
  {
    if( CHR_MSB < 0x20 )
      CHR_MSB = 0x20;
    CHR_Address = CHR_MSB - 0x20;
    if( CHR_type == TYPE_16 )      //8X16 点 ASCII 字符
      CHR_Address = CHR_Address*16 + ASC0816YZF_ADDR;
    else if( CHR_type == TYPE_24 )//12*24号半角ASCII为点阵信息为16*24
      CHR_Address = CHR_Address*48 + ASC1224YZF_ADDR;
    else if( CHR_type == TYPE_32 )//16X32 点 ASCII 字符
      CHR_Address = CHR_Address*64 + ASC1632YZF_ADDR;
    if( CHR_type <=16 )
      num = CHR_type;
    else
      num = 2*CHR_type;
  }
  else //中文GB2312
  {
      P_chr++;
      CHR_LSB=*P_chr;
      num = (CHR_type + CHR_type%8)*CHR_type/8;
    //符号区,全角 846+96 = 1038
    if( (CHR_MSB>=0xA1 && CHR_MSB <= 0xAB && CHR_LSB>=0xa1)||(CHR_MSB>=0xa8 && CHR_MSB <= 0xa9 && CHR_LSB<0xa1) )
    {
      if( CHR_MSB>=0xA1 && CHR_MSB <= 0xAB && CHR_LSB>=0xa1 )//双字节字符1区 846
        CHR_Address = (CHR_MSB - 0xA1) * 94 + (CHR_LSB - 0xA1);
      else                                    //双字节字符5区 96
      {
        if(CHR_LSB>0x7f)
          CHR_LSB--;
        CHR_Address=(CHR_MSB-0xa8)*96 +(CHR_LSB-0x40)+846;
      }
      if( CHR_type == TYPE_16 )
        CHR_Address = CHR_Address *32 + ZF1616Y_ADDR;
      else if( CHR_type == TYPE_24 )
        CHR_Address = CHR_Address *72 + ZF2424Y_ADDR;
      else if( CHR_type == TYPE_32 )
        CHR_Address = CHR_Address *128 + ZF3232Y_ADDR;
      else
        CHR_Address = 0x000000;
    }
    //GBK双字节2区 6768
    else if(CHR_MSB>=0xb0 && CHR_MSB <= 0xf7 && CHR_LSB>=0xa1)
    {
      CHR_Address= (CHR_MSB - 0xB0) * 94 + (CHR_LSB - 0xA1);
      if( CHR_type == TYPE_16 )
        CHR_Address = (unsigned int)(CHR_Address*32) + (unsigned int)(HZ1616Y_ADDR);
      else if( CHR_type == TYPE_24 )
        CHR_Address = (unsigned int)((CHR_Address + 846)*72) + 0x68190;
      else if( CHR_type == TYPE_32 )
        CHR_Address = (unsigned int)((CHR_Address + 846)*128) + 0xEDF00;
      else
        CHR_Address=0x000000;
    }

  }

更多内容参考下边链接
http://worldcreativedesign.com/read.php?tid=11




发表于 2013-9-19 10:57:09 | 显示全部楼层
用的是振南znFat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表