打印
[RISC-V MCU 应用开发]

【RISC-V MCU CH32V103测评】与数码相框再续前缘

[复制链接]
515|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2020-12-14 18:00 编辑

前面在使用CH579M-R1开发板时,便利用它对U盘的读写能力实现了图片显示功能,当时是利用按键触发翻页处理,这次则是在CH32V103开发板上再次重现了该功能,且将手动翻页改为延时自动翻页。
彩色OLED屏、米客方德4Gb T卡与CH32V103开发板的连接关系如图1所示。

1 整体构成

在图片中的浏览过程中,其演示效果如图2~4所示。
2 卡通画效果

3 油画效果

4 国画效果

在程序中,进行相关语句定义有:
#define LCD_W 160
#define LCD_H 80
#define OLED_SCLK_Set()  GPIO_WriteBit(GPIOA, GPIO_Pin_2,Bit_SET) //CLK
#define OLED_SCLK_Clr()  GPIO_WriteBit(GPIOA, GPIO_Pin_2,Bit_RESET)
#define OLED_SDIN_Set()  GPIO_WriteBit(GPIOA, GPIO_Pin_3,Bit_SET) //DIN
#define OLED_SDIN_Clr()  GPIO_WriteBit(GPIOA, GPIO_Pin_3,Bit_RESET)
#define OLED_RST_Set()   GPIO_WriteBit(GPIOB, GPIO_Pin_3,Bit_SET) //RES
#define OLED_RST_Clr()   GPIO_WriteBit(GPIOB, GPIO_Pin_3,Bit_RESET)
#define OLED_DC_Set()    GPIO_WriteBit(GPIOB, GPIO_Pin_4,Bit_SET) //DC
#define OLED_DC_Clr()    GPIO_WriteBit(GPIOB, GPIO_Pin_4,Bit_RESET)
#define OLED_CS_Set()    GPIO_WriteBit(GPIOB, GPIO_Pin_5,Bit_SET) //CS
#define OLED_CS_Clr()    GPIO_WriteBit(GPIOB, GPIO_Pin_5,Bit_RESET)
#define OLED_BLK_Set()   GPIO_WriteBit(GPIOB, GPIO_Pin_6,Bit_SET)//BLK
#define OLED_BLK_Clr()   GPIO_WriteBit(GPIOB, GPIO_Pin_6,Bit_RESET)
相应的引脚功能配置函数为:
void App_OledInit(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;                                         //定义一个GPIO_InitTypeDef类型的结构体
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);                     //使能与LED相关的GPIO端口时钟
   GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; //配置GPIO引脚
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                           //设置GPIO模式为推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                          //设置GPIO口输出速度
   GPIO_Init(GPIOB,&GPIO_InitStructure);                                       //调用库函数,初始化GPIOA
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                     //使能与LED相关的GPIO端口时钟
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;                      //配置GPIO引脚
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                           //设置GPIO模式为推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                          //设置GPIO口输出速度
   GPIO_Init(GPIOA,&GPIO_InitStructure);                                       //调用库函数,初始化GPIOA
  GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);                                  //设置引脚输出高电平
}
实现数码相框的主程序为:
int main()
{
    UINT8 s, c, i,B,w=0;
    UINT16 TotalCount,z;
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf("USBHD HOSTTest\r\n");
    USBHD_ClockCmd(RCC_USBCLKSource_PLLCLK_1Div5,ENABLE);
    pHOST_RX_RAM_Addr = RxBuffer;
    pHOST_TX_RAM_Addr = TxBuffer;
    USB_HostInit();
    CHRV3LibInit();
    printf( "Wait DeviceIn\r\n" );
    App_OledInit();
    Lcd_Init();
    LCD_Clear(BLACK);
    LCD_Address_Set(0,0,159,79);
    while ( 1 )
    {
            s = ERR_SUCCESS;
            if ( R8_USB_INT_FG& RB_UIF_DETECT )
            {
                R8_USB_INT_FG =RB_UIF_DETECT ;
                s =AnalyzeRootHub( );
                if ( s ==ERR_USB_CONNECT )   FoundNewDev = 1;
            }
            if ( FoundNewDev || s== ERR_USB_CONNECT )
            {
                FoundNewDev =0;
                mDelaymS( 200);
                s =InitRootDevice( Com_Buffer );
                if ( s == ERR_SUCCESS)
                {
                    CHRV3DiskStatus= DISK_USB_ADDR;
                    for ( i = 0; i != 10;i ++ )
                    {
                        printf( "Wait DiskReady\n" );
                        s =CHRV3DiskReady( );
                        if ( s == ERR_SUCCESS)
                        {
                            break;
                        }
                       mDelaymS( 50 );
                    }
                    B=1;
                    z=0;
                    if ( CHRV3DiskStatus>= DISK_MOUNTED )
                    {
                      LOOP:
                      z=0;
                     LCD_Address_Set(0,0,159,79);
                      if(B==1)
                      {
                      if(w==0) strcpy( (PCHAR)mCmdParam.Open.mPathName, "/C51/MOLED2.BIN" );
                      if(w==1) strcpy( (PCHAR)mCmdParam.Open.mPathName, "/C51/MOLED1.BIN" );
                      if(w==2) strcpy( (PCHAR)mCmdParam.Open.mPathName, "/C51/MOLED.BIN" );
                      。。。
                      s =CHRV3FileOpen( );
                      if ( s ==ERR_MISS_DIR || s == ERR_MISS_FILE )
                      {
                          printf( "no find\n" );
                      }
                      else
                      {
                          while(z<256)
                          {
                         TotalCount = 100;
                          printf( "read char :\n",TotalCount );
                          while ( TotalCount )
                          {
                               if ( TotalCount >(MAX_PATH_LEN-1) )  c = MAX_PATH_LEN-1;
                               else c = TotalCount;
                              mCmdParam.ByteRead.mByteCount = c;
                              mCmdParam.ByteRead.mByteBuffer= &buf[0];
                              s = CHRV3ByteRead( );
                              TotalCount -= mCmdParam.ByteRead.mByteCount;
                               for ( i=0;i!=mCmdParam.ByteRead.mByteCount; i++ )
                              {
                                     LCD_WR_DATA8(buf);
                              }
                               if ( mCmdParam.ByteRead.mByteCount < c )
                              {
                                   printf( "\n" );
                                   printf( "file end\n" );
                                   break;
                              }
                          }
                          printf( "%3d", z );
                          z++;
                          }
                          printf( "Close\n" );
                          i =CHRV3FileClose( );
                         mStopIfError( i );
                          mDelaymS(2000);
                           w++;
                          if(w==N) w=0;
                       }
                      }
                     mDelaymS(1000);
                      goto LOOP;
                    }
                }
            }
            mDelaymS( 100 );
            SetUsbSpeed( 1 );
        }
}
经程序的编译处理,其占用存储空间的情况如下图所示。

使用特权

评论回复

相关帖子

沙发
nvjwiciw659| | 2020-12-13 17:44 | 只看该作者
针不戳,就是分辨率太低了哈哈

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2020-12-13 18:24 | 只看该作者
nvjwiciw659 发表于 2020-12-13 17:44
针不戳,就是分辨率太低了哈哈

测试性的,有时间换个大的。其实只是画面小了些,细节还是很清楚的!

使用特权

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

本版积分规则

446

主题

2675

帖子

37

粉丝