搜索
bottom↓
回复: 23

自制PIC16F的C编译器更新版(v1.10)【恢复】

[复制链接]

出0入0汤圆

发表于 2008-11-9 02:38:39 | 显示全部楼层 |阅读模式
自制PIC16F 'C'编译器的初版曾发表在21IC网站,回响比较热烈。

这个更新版纠正了许多错误,增添了一些新功能。并附上所需的汇编器、连接器,使之完整、使用。

另外,还附上了简易使用说明。



希望它不会使你失望。并提出你的宝贵意见。



也许不久后,我还将贴出最新的Enhanced PIC16F1xxxx C 编译器。



点击此处下载 ourdev_489952.rar(文件大小:382K) (原文件名:pic16cc.rar) 

出0入0汤圆

发表于 2009-1-21 16:35:34 | 显示全部楼层
牛!

出0入0汤圆

发表于 2009-1-21 15:53:27 | 显示全部楼层
标记一下  哪天试下

出0入0汤圆

发表于 2009-1-21 14:15:01 | 显示全部楼层
和PICC对比一下,你能做的和他一样吗,如果可以免费共享定有很多人用的

出0入0汤圆

发表于 2009-1-21 12:25:11 | 显示全部楼层
!!!

出0入4汤圆

发表于 2008-11-25 23:49:02 | 显示全部楼层
好,很好!

出0入0汤圆

发表于 2008-11-25 22:37:47 | 显示全部楼层
标记,顶一下了

出0入0汤圆

发表于 2008-11-17 21:09:46 | 显示全部楼层
顶一下~
头像被屏蔽

出0入0汤圆

发表于 2008-11-17 18:19:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2008-11-17 02:30:32 | 显示全部楼层
以下是一段MP3播放器的FAT16文件模块,使用本C编译器编译。由于PIC16Fxx芯片内存太少,

且功能受限(不搜索子目录)。主要目的是提示如何使用本编译器。



///////////////////////////////////////////////////////////////////////////////

//

//         Name:  MMCFILE.C

//

//        NOTE: this file system only supports FAT(16) format!

//

///////////////////////////////////////////////////////////////////////////////

#include <16f887.h>

#include "define.h"

#include "mmcspi.h"

#include "mmcfile.h"

#include "lcd3310.h"



/* ---   --- */

#define SIGNATURE1   0x55  // signature(1) of file system

#define SIGNATURE2   0xaa  // signature(2) of file system



typedef enum {FAT12, FAT16, FAT_UNKNOWN} FAT_TYPE;



#define HOT_CLUSTER(c)  ((FILE_entry.fatType == FAT12)? ((c) && (c) < 0xff6): ((c) && (c) < 0xfff6))



#define END_CLUSTER(c)  ((FILE_entry.fatType == FAT12)? ((c)>= 0x0ff8): ((c)>= 0xfff8))



#define IS_SUBDIR(c)    ((c & 0x3c) == 0x10)

#define IS_ARCHIV(c)    ((c & 0x3c) == 0x20)



typedef struct {

        char seqNum;

    char name1[10];

    unsigned char attrib;

    unsigned char reserve;

    unsigned char chkSum;

    char name2[12];

    unsigned int startCluster;

    char name3[4];

} LFNDirEntry_t;                                                // VFAT long file name entry



// globally available buffer

bank2 unsigned char FILE_tempBuf1[MMC_SECTOR_SIZE/8];

bank3 FileDesc_t  fileDesc;

bank3 FileEntry_t FILE_entry;





///////////////////////////////////////////////////////////////////////////////

char FILE_InitEntry (void) @ bank2

{

    BootSector_t bank2 *pp = FILE_tempBuf1;



        if ( MMC_ReadSegOffset (FILE_tempBuf1, 0, 510) == MMC_OK )

    {

        if ( FILE_tempBuf1[0] == SIGNATURE1 && FILE_tempBuf1[1] == SIGNATURE2 )

        {

                        if ( MMC_ReadSegOffset (FILE_tempBuf1, 0, 446) != MMC_OK )

                                return FILE_ERR_FMT;



                        Partition_t bank2 *p = FILE_tempBuf1;



            if ( !(p->bootType & 0x7f) &&

                 ( p->fileSysType == 0x04 || p->fileSysType == 0x06 ) )

            {

                FILE_entry.startSector = p->firstSector;        // only access partition-1 !!!

            }

            else

            {

                FILE_entry.startSector = 0;

            }



            if ( MMC_ReadSegOffset (FILE_tempBuf1, FILE_entry.startSector, 0) != MMC_OK )

                return FILE_ERR_FMT;





            if ( pp->numOfFAT == 2    &&

                 pp->sectorPerCluster && pp->sectorSize == MMC_SECTOR_SIZE )

            {

                FILE_entry.sectorPerCluster = pp->sectorPerCluster;



                FILE_entry.fatStart    = FILE_entry.startSector + pp->reserveSectors;

                FILE_entry.numOfFAT    = pp->numOfFAT;

                FILE_entry.sectorPerFAT= pp->sectorPerFAT;

                FILE_entry.rootEntries = pp->rootEntries;

                FILE_entry.rootStart   = FILE_entry.fatStart + FILE_entry.numOfFAT * FILE_entry.sectorPerFAT;

                FILE_entry.dataStart   = FILE_entry.rootStart + (pp->rootEntries + 15) / 16;





                return FILE_OK;

            }

        }

    }

    return FILE_ERR_FMT;

}



#define FILE_ClusterFatSector(cluster)        (FILE_entry.fatStart + cluster/256)

#define FILE_ClusterFatOffset(cluster)        ((cluster & 0xff) << 1)



///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

static unsigned int FILE_NextCluster (unsigned int cluster)

{

    if ( cluster < 2 || cluster>= 0xfff0 )

        return 0xffff;



    unsigned long sector = FILE_ClusterFatSector (cluster);

    unsigned int  offset = FILE_ClusterFatOffset (cluster);



        if ( MMC_ReadSegOffset (FILE_tempBuf1, sector, offset) != MMC_OK )

                return 0xffff;



        return *((unsigned int bank2 *)FILE_tempBuf1);

}





///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

static unsigned long FILE_GetDataSector (unsigned int cluster)

{

//        unsigned long c = cluster - 2;

        return FILE_entry.dataStart + (cluster - 2) * FILE_entry.sectorPerCluster;

}



///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

char FILE_EntryType (DirEntry_t bank2 *dir)

{

#if 0

        char bank2 *p = dir;        // problem in v1.13!!!

    char c = dir->fileName[0];//*p;



    if ( c == 0xe5 || c == 0x00 || c == '.' )

                return NULL_ENTRY;



        char attr = dir->attrib;



        if ( MEMCMP_ROM (dir->fileExt, "MP3", 3) && (attr == 0x01 || attr == 0x20) )

                return MP3_FILE;



        if ( attr == 0x10 )

                return SUB_DIR;

#else

        unsigned char c = dir->fileName[0];



    if ( c == 0xe5 || c == 0x00 || c == '.' )

                return NULL_ENTRY;



        unsigned char attr = dir->attrib & 0x3f;



        if ( MEMCMP_ROM (dir->fileExt, "MP3", 3) && (attr == 0x01 || attr == 0x20) )

                return MP3_FILE;



        if ( attr == 0x10 )

                return SUB_DIR;

#endif

        return UNKNOWN_ENTRY;

}



///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

static FileDesc_t bank2* FILE_ReturnFileHandle (DirEntry_t bank2 *dir)

{

        MEMCPY (fileDesc.fileName, dir->fileName, 11);                // get filename+ext

        fileDesc.size         = dir->fileSize;                                        // get file size

        fileDesc.cluster = dir->startCluster;                                // get file (start) cluster)

        fileDesc.sector  = 0;

        fileDesc.segment = 0;

        return &fileDesc;

}



///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

FileDesc_t *FILE_FindFile (unsigned int index)

{

        unsigned long sector = FILE_entry.rootStart;



        while ( sector < FILE_entry.dataStart )

        {

                unsigned char i, seg;

                for (seg = 0; seg < 8; seg++)

                {

                        if ( MMC_ReadSegment (FILE_tempBuf1, sector, seg) != MMC_OK )

                                return NULL;



                        for (i = 0; i < MMC_SECTOR_SIZE/8; i += DIR_ENTRY_SIZE)

                        {

                                DirEntry_t bank2 *dir = (DirEntry_t *)&FILE_tempBuf1;



                                if ( FILE_EntryType (dir) == MP3_FILE )        // it's an MP3 file!

                                {

                                        if ( --index == 0 )

                                                return FILE_ReturnFileHandle (dir);

                                }

                        }

                }

                sector++;

        }



        return NULL;

}



///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

unsigned char *readFileSector (FileDesc_t bank2 *file)

{

        unsigned char seg = file->segment;

        unsigned long sector;



        if ( seg == 0 || seg>= 8 )

        {

                file->segment = 0;



            if ( file->sector>= FILE_entry.sectorPerCluster )

                {

                file->cluster = FILE_NextCluster (file->cluster);

                file->sector  = 0;

                }



            if ( file->cluster>= 0xfff0 )

                        return NULL;



                if ( file->sector == 0 )

                        file->startSector = FILE_GetDataSector (file->cluster);



            sector = file->startSector + file->sector;

            file->sector++;

        }



        if ( MMC_ReadSegment (FILE_tempBuf1, sector, file->segment++) != MMC_OK )

                return NULL;



        return FILE_tempBuf1;

}



///////////////////////////////////////////////////////////////////////////////

char nextFileSector (FileDesc_t bank2 *file)

{

    if ( file->sector>= FILE_entry.sectorPerCluster )

        {

        file->cluster = FILE_NextCluster (file->cluster);

        file->sector  = 0;

        }



    if ( file->cluster>= 0xfff0 )

                return 0;



        if ( file->sector == 0 )

                file->startSector = FILE_GetDataSector (file->cluster);



    file->sector++;

        return -1;

}



///////////////////////////////////////////////////////////////////////////////

unsigned int FILE_searchMP3Files (void)

{

        unsigned long sector = FILE_entry.rootStart;

//        unsigned long sector = FILE_entry.fatStart;



        unsigned int  cnt = 0;



        while ( sector < FILE_entry.dataStart )

        {

                unsigned char seg, i;

                for (seg = 0; seg < 8; seg++)

                {

//                        if ( MMC_ReadSegOffset (FILE_tempBuf1, sector, seg*64) != MMC_OK )

                        if ( MMC_ReadSegment (FILE_tempBuf1, sector, seg) != MMC_OK )

                    return cnt;



                        for (i = 0; i < MMC_SECTOR_SIZE/8; i += DIR_ENTRY_SIZE)

                        {

                                DirEntry_t bank2 *dir = &FILE_tempBuf1;



                                if ( FILE_EntryType (dir) == MP3_FILE )        // it's an MP3 file!

                                        cnt++;

                        }

                }



                sector++;

        }



        return cnt;

}

出0入4汤圆

发表于 2008-11-16 17:43:35 | 显示全部楼层
如果能弄个通用的就好了,把那一大堆不同厂家的都加上……

出0入0汤圆

发表于 2008-11-16 16:16:28 | 显示全部楼层
这个要顶,像这样牛的不多了

出0入0汤圆

发表于 2008-11-14 23:11:39 | 显示全部楼层
顶楼主  牛人



1楼这么性急啊?  上来就要源代码- -

出330入0汤圆

发表于 2008-11-14 22:55:44 | 显示全部楼层
我来看下到底酷不酷

出0入0汤圆

发表于 2008-11-9 08:25:29 | 显示全部楼层
支持~以后再用吧

出0入0汤圆

发表于 2008-11-9 06:53:23 | 显示全部楼层
公布源代码不?

出0入0汤圆

发表于 2009-3-26 17:18:55 | 显示全部楼层
牛人

出0入0汤圆

发表于 2009-3-28 10:35:39 | 显示全部楼层
支持!

出0入0汤圆

发表于 2009-4-2 18:13:39 | 显示全部楼层
强,太有才了。

出0入0汤圆

 楼主| 发表于 2009-4-4 04:53:10 | 显示全部楼层
P16CC最新版(v1.220)ourdev_432671.rar(文件大小:327K) (原文件名:p16cc_v1.220.rar)

出0入0汤圆

发表于 2009-4-4 22:00:39 | 显示全部楼层
同picc的差距大吗?

出0入0汤圆

 楼主| 发表于 2009-4-5 00:15:24 | 显示全部楼层
回楼上:自制的山寨版,从总体性能上肯定比不上大厂家的。到底如何,试试就清楚了。
期待大家的评价。

出0入0汤圆

发表于 2009-4-5 01:46:27 | 显示全部楼层
公開源碼應該是沒必要。畢竟是人家的心血。支持先...

出0入0汤圆

发表于 2009-7-19 23:53:37 | 显示全部楼层
标记一下,有才!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 14:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表