Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ПРОСМОТР ФАЙЛОВ НА SD КАРТЕ


ПРОСМОТР ФАЙЛОВ НА SD КАРТЕ

Сообщений 1 страница 15 из 15

1

Привет, всем! Нужна помощь в организации просмотра файлов на SD карте. Рабочий код позволяет читать построчно текстовую переменную К из файла "Mach2mm.cnc" и выводить на дисплей. Но проблема в том, что нужно точно указать с какого файла читать. А мне нужно организовать прокрутку файлов на дисплее и выбор с какого читать.

Код:
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

$include "Config_MMCSD_HC.bas"
$include "Config_AVR-DOS.BAS"

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Cursor Off
Cls

Config Serialin = Buffered , Size = 20
Config Clock = Soft
Enable Interrupts
Config Date = Dmy , Separator = .

Dim K As String * 24

Lcd "Test_Dos_Drive compiled at " ; Version()

Wait 1
Cls
'Dim Btemp1 As Byte
Lcd "Wait for Drive"
Wait 1
Cls
If Gbdriveerror = 0 Then
' Include AVR-DOS Configuration and library

Lcd "Init File System ... ";
Wait 1
Cls
Btemp1 = Initfilesystem(1)                    ' Partition 1
' use 0 for drive without Master boot record
If Btemp1 <> 0 Then
Lcd "Error: " ; Btemp1 ; " at Init file system"
Wait 2
Cls

Else
Lcd " OK!"
Wait 1
Cls
End If
Else
Lcd "Error during Drive Init: " ;
Lowerline
Lcd Gbdriveerror
Wait 2
Cls
End If

Do

Open "Mach2mm.cnc" For Input As #1
Input #1 , K
' write is also supported
'Close #1

Lcd "Read Mach2mm.cnc"
Lowerline
Lcd K
Waitms 200
Cls
Loop
End

0

2

Это поможет:

Код:
         Chdir "TEMP"                                                                                         'Меняем директорию на "TEMP"
         Max_file = 0
         Str_temp = Dir( "*.cnc")                                                                         'выбираем имя первого файла на в корневом каталоге с расширением *.cnc
         'If Len(str_temp) > 0 Then Index = 1                                                       'если файл существует устанавливаем номер текущего файла 1
         While Len(str_temp) > 0                                                                          'запускаем цикл пока имя файла не станет равным 0 - файлы кончатся
            'Print Str_temp                                                                                       'выводим на экран имя файла
            Max_file = Max_file + 1                                                                          'увеличиваем значение переменной количества файлов
            Str_temp = Dir()                                                                                 'получаем имя следующего вайла в каталоге
         Wend
         Print "Number of files: " ; Max_file                                                             'выводим общее число файлов

0

3

Спасибо!
Дело сдвинулось. Теперь выводится название файла и количество таких файлов.

Код:
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

$include "Config_MMCSD_HC.bas"
$include "Config_AVR-DOS.BAS"

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Cursor Off
Cls

Config Serialin = Buffered , Size = 20
Config Clock = Soft
Enable Interrupts
Config Date = Dmy , Separator = .

Dim K As String * 12
Dim Str_temp As String * 12
Dim Max_file As Byte
Dim Index As Byte

Lcd "Test_Dos_Drive compiled at " ; Version()

Wait 1
Cls
'Dim Btemp1 As Byte
Lcd "Wait for Drive"
Wait 1
Cls
If Gbdriveerror = 0 Then
  ' Include AVR-DOS Configuration and library

Lcd "Init File System ... ";
Wait 1
Cls
  Btemp1 = Initfilesystem(1)                                ' Partition 1
                                          ' use 0 for drive without Master boot record
  If Btemp1 <> 0 Then
Lcd "Error: " ; Btemp1 ; " at Init file system"
Wait 2
Cls

Else
Lcd " OK!"
Wait 1
Cls
End If
Else
   Lcd "Error during Drive Init: " ;
   Lowerline
   Lcd Gbdriveerror
   Wait 2
Cls
End If
Do

 Chdir "TEMP"                                                                                         'Меняем директорию на "TEMP"
         Max_file = 0
         Str_temp = Dir( "*.cnc")                                                                         'выбираем имя первого файла на в корневом каталоге с расширением *.cnc
         If Len(str_temp) > 0 Then Index = 1                'если файл существует устанавливаем номер текущего файла 1
         While Len(str_temp) > 0                            'запускаем цикл пока имя файла не станет равным 0 - файлы кончатся

Lcd "Read Str_temp"
Lowerline
Lcd Str_temp
Waitms 2000
Cls
           'Print Str_temp                                                                                       'выводим на экран имя файла
            Max_file = Max_file + 1                                                                          'увеличиваем значение переменной количества файлов
            Str_temp = Dir()                                'получаем имя следующего файла в каталоге


         Wend
Lcd "Read Max_file "
Lowerline
Lcd Max_file
Waitms 2000                                                            'выводим общее число файлов
Cls


Cls
Loop
End

Дальше буду работать с бОльшим чем один файл на карте.

0

4

Немного упростил код. Теперь по очереди выводятся названия всех файлов с любыми расширениями.

Код:
Do

Str_temp = Dir( "*.*")                                      'выбираем имя первого файла на в корневом каталоге с любым расширением
While Len(str_temp) > 0                                     'запускаем цикл пока имя файла не станет равным 0 - файлы кончатся

Lcd "Read Str_temp" ; " "
Lowerline
Lcd Str_temp
Waitms 2000
Cls

Str_temp = Dir()                                            'получаем имя следующего вайла в каталоге
         Wend
Loop
End

0

5

Аппетит приходит во время еды... А подскажите , пожалуйста,  как пролистать название папок?

0

6

Вот всё чем пользовался сам:

Код:
'В одной папке не более 512 файлов!
Chdir "\"                                                   'Идём в корень диска
Chdir "Speech"                                          'Меняем директорию карты памяти на "Speech"
Chdir "."                                                   'На директорию выше
Chdir "Mine"                                              'Меняем директорию карты памяти на "Mine"
File_name = Str(mine) + "m.wav"               'полное имя файла из директории и краткого имени

А вот получить список всех директорий я не знаю как...

0

7

Спасибо, попробуем!

0

8

Работа с AVR DOS Bascom

0

9

Когда-то надо было.

Количество папок и файлов

Dim Имя_файла_str As String * 15
  Dim Имя_директории_str As String * 15

  Dim Счетчик_файлов As Word
  Dim Количество_найденных_файлов As Word
  Dim Количество_найденных_директорий As Word

' Ищем папки в корне диска
  Имя_директории_str = Dir( "*.")       ' Выбираем имя первого файла в каталоге с расширением *.bmp

  While Len(имя_директории_str) > 0       ' if there was a file found

' Выводим: имя файла; дату и время создания; размер файла в байтах
      Print Имя_директории_str
''' ; Filedate() ; " " ; Filetime() ;
      Имя_директории_str = Dir()       ' Ищем дальше

      Incr Счетчик_файлов       ' Считаем обнаруженные файлы

  Wend

  Количество_найденных_директорий = Счетчик_файлов : Счетчик_файлов = 0
  Print
  Print "Найдено " ; Количество_найденных_директорий ; " папок"
  Print

  Chdir "picture"       ' Заходим в директорию (аналог команды DOS6.22 "cd picture")

' Ищем файлы в директории

  Имя_файла_str = Dir( "*.*")       ' Выбираем имя первого файла в каталоге с расширением *.bmp

  While Len(имя_файла_str) > 0       ' if there was a file found

' Выводим: имя файла; дату и время создания; размер файла в байтах
      Print Имя_файла_str ; " - " ; Filelen() ; " byte"
''' ; Filedate() ; " " ; Filetime() ;
      Имя_файла_str = Dir()       ' Ищем дальше

      Incr Счетчик_файлов       ' Считаем обнаруженные файлы

  Wend

  Количество_найденных_файлов = Счетчик_файлов : Счетчик_файлов = 0

  Print
  Print "Найдено " ; Количество_найденных_файлов ; " файлов"
  Print

0

10

Александр, спасибо!
В цикле на дисплей выводятся названия папок

Код:
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

$include "Config_MMCSD_HC.bas"
$include "Config_AVR-DOS.BAS"

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Cursor Off
Cls

Config Serialin = Buffered , Size = 20
Config Clock = Soft
Enable Interrupts
Config Date = Dmy , Separator = .

  Dim Имя_файла_str As String * 12
  Dim Имя_директории_str As String * 12
  Dim Счетчик_файлов As Word
  Dim Количество_найденных_файлов As Word
  Dim Количество_найденных_директорий As Word

Lcd "Test_Dos_Drive " ; Version()

Wait 1
Cls
'Dim Btemp1 As Byte
Lcd "Wait for Drive"
Wait 1
Cls
If Gbdriveerror = 0 Then
  ' Include AVR-DOS Configuration and library

Lcd "Init File System ... ";
Wait 1
Cls
  Btemp1 = Initfilesystem(1)                                ' Partition 1
                                          ' use 0 for drive without Master boot record
  If Btemp1 <> 0 Then
Lcd "Error: " ; Btemp1 ; " at Init file system"
Wait 2
Cls

Else
Lcd " OK!"
Wait 1
Cls
End If
Else
   Lcd "Error during Drive Init: " ;
   Lowerline
   Lcd Gbdriveerror
   Wait 2
Cls
End If
Do
Имя_директории_str = Dir( "*.")                             ' Выбираем имя первого файла в каталоге
While Len(имя_директории_str) > 0                           ' Пока длина названия папки больше 0

Lcd "Name Dir" ; " " ; Имя_директории_str           ' Выводим: имя файла
Waitms 2000
Cls
Имя_директории_str = Dir()                                  ' Ищем дальше
Wend

Loop
End

Дальше надо думать, чтобы названия папок(файлов) выводились на многострочный дисплей в виде некоего списка и можно было стрелками "верх/низ" и  "ОК" выбирать нужную папку или файл.

Отредактировано marss70 (2016-09-15 23:38:25)

0

11

marss70 написал(а):

Дальше надо думать, чтобы названия папок(файлов) выводились на многострочный дисплей в виде некоего списка и можно было стрелками "верх/низ" и  "ОК" выбирать нужную папку или файл.


Один из вариантов:
При начальном чтении информации с SD Card, создаёте адресный массив с цифровым эквивалентом(для уменьшения размера) названиями файлов и папок (если Bascom => 2.0.7.8, поддерживаются многомерные массивы), далее делаете с ним, что хотите.

Есть программа для создания менюшек под разные LCD

Написал и поддерживает развитие, пользователь этого форума под ником Yuriy.pv.

Спишитесь, наверняка поможет с менюшкой.

Отредактировано sasha_1973 (2016-09-16 05:48:06)

0

12

Спасибо, Александр!
Надо покопаться. С первого  взгляда похоже на то, что надо.

0

13

Получается, что папки, что файлы, ищутся с помощью одной команды - Dir.
А если они вперемешку идут?
Нужно их ка то разделять.
Наверное можно через свойства смотреть.

0

14

Ну это я что-то пропустил момент. Я на карту только папки насовал и все они пролистались. Вечерком попробую вперемежку ("кони, люди" ) папки и сами файлы записать.  А так, для файлов наверное нужно применять фильтр по расширению типа  Str_temp = Dir( "*.cnc")   или  Str_temp = Dir( "*.txt")

0

15

Попробовал записать на карту и папки и файлы.  Dir( "*.") видит только папки.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ПРОСМОТР ФАЙЛОВ НА SD КАРТЕ