来源:
作者:aqa
网址:http://bbs.21ic.com/icview-2854306-1-1.html

新入职了一家公司,负责消费电子,接触到了应广单片机,现在谈谈应广单片机相关的问题,后续还会更新,本人也只是初学者,发现网上应广单片机相关的资料太少了,一是把自己所知道的发出来,帮助像我这样的初学者,方便学习,二是记录自己的学习历程。

先从一些基础的开始吧,有关于IDE的使用我就不多叙述了,资料连接里面有一个文件介绍了怎么使用,需要的也可以下载,目前我所使用的的仅限于应广的单核单片机,所以这边的都是单核的相关资料,应该单片机的开发语言是MINI-C语言,属于汇编和标准C的合体吧,哈哈哈,具体了解可以去网上查相关资料,资料链接里面也有一个开发语言的介绍,下面是一个简单的例程,驱动车载MP3数码管,展示部分程序,需要的可以点击链接下载:

/****************************************************************
函数名称:void  Set_User_T16(void)
函数功能:定时器计数定时256us
函数参数:无
函数返回值:无
函数说明:
****************************************************************/
#define USER_TIMER_CONFIG()     $ T16M IHRC, /4, BIT10
#define ENABLE_TIMER()               SET1 INTEN.2 //$ INTEN T16 //开定时器中断
#define DISENABLE_TIMER()          SET0 INTEN.2 //关定时器中断
#define INIT_TIMER_VALUE(n)       STT16 n//装载定时器计数值
#define CONST_TIMER_VALUE       0
#define EA_INT()                           ENGINT//开总中断
#define DIS_INT()                          DISGINT//关总中断
/**************************************************************/
void  Set_User_T16(void)/*定时256us进一次中断                   2^10/(16/) = 256us*/
{
        //SET0 T16flag;//reset the flag

        USER_TIMER_CONFIG();
        T16val = CONST_TIMER_VALUE;//256us
        INIT_TIMER_VALUE(T16val);
        INTRQ = 0;//清除INTRQ
        EA_INT();
        ENABLE_TIMER();
}
/************************************************
中断服务函数
************************************************/
void        Interrupt (void)
{
        pushaf;

        if (Intrq.T16)/*256us进入一次中断*/
        {        //        T16 Trig
                //        User can add code
                Intrq.T16        =        0;
                T16val = CONST_TIMER_VALUE;
                INIT_TIMER_VALUE(T16val);
                LED_Scan1();
                //LED_scan2();
        }

        popaf;
}

我目前用的是PMS132B芯片驱动的,上面是一个16位计数器写的计数中断程序,计数256us进入一次中断

/****************************************************************
函数名称:void LED_Scan(void)
函数功能:扫描函数,扫描要显示13:14,其他图标都亮
函数参数:无
函数返回值:无
函数说明:没有用到的引脚设置为高阻态
        if语句里面注释的pbc位所有LED数码管全亮
****************************************************************/
void LED_Scan1(void)
{
        static u8 cnt = 0;

        SetPortIn();//设置高阻态,关闭上拉
        //SetPortOut();
        $ pbdier = 0;

        switch (cnt)//轮询一个引脚为高电平
        {
                case 0:
                        pbc.0 = 1;//设置pb0输出
                        pb.0  = 1;//输出高电平
                        break;
                case 1:
                        pbc.1 = 1;
                        pb.1  = 1;
                        break;
                case 2:
                        pbc.2 = 1;
                        pb.2  = 1;
                        break;
                case 3:
                        pbc.3 = 1;
                        pb.3 = 1;
                        break;
                case 4:
                        pbc.4 = 1;
                        pb.4  = 1;
                        break;
                case 5:
                        pbc.5 = 1;
                        pb.5  = 1;
                        break;
                case 6:
                        pbc.6 = 1;
                        pb.6  = 1;
                        break;
                default:
                        break;
        }
        //将发生变化的引脚所对应要显示的内容更改
        if (PIN1)
        {
                //pbc = 0x3f;
                pbc = 0x35;//配置输出引脚  0:输入          1:输出
                pb  = 0X01;//
        }
        if (PIN2)
        {
                //pbc = 0x3f;
                pbc = 0x2e;
                pb  = 0x02;
        }
        if (PIN3)
        {
                //pbc = 0x7f;
                pbc = 0x7c;
                pb  = 0x04;
        }
        if (PIN4)
        {
                //pbc = 0x3f;
                pbc = 0x1b;
                pb  = 0x08;
        }
        if (PIN5)
        {
                //pbc = 0x7f;
                pbc = 0x72;
                pb  = 0x10;
        }
        if (PIN6)
        {
                //pbc = 0x7f;
                pbc = 0x72;
                pb  = 0x20;
        }
        if (PIN7)
        {
                //pbc = 0x64;
                pbc = 0x44;
                pb  = 0x40;
        }

        cnt++;
        if(cnt >= 7)
        {
                cnt = 0;
        }

        //cnt = (cnt >= 8)?0:cnt+1;
}

上面这个是LED数码管动态扫描程序,与一般的数码管有所区别,一般数码管有共阴和共阳之分,这个没有,动态扫描的原理这里不细说了,不清楚的去网上查找,这个相当于是7个引脚驱动五位七段数码管,相关引脚定义见下图:

数码管实物图:

引脚定义图是用万用表测出来的,测量方法有很多,我用的这种方法而以,阳极和阴极就代表该引脚接在万用表的正极和负极,每一段LED组合在一起形成以以为数码管,上面有五位数码(第五位是将SD、||、USB、 : 等一共七个图标组成了第五位数码管),举个例子方便大家理解,假如现在要点亮第一位数码管的第一段(也就是1A),此时P1引脚输入高电平,P2引脚输入低电平或者接地,1A就亮了:


以上两个图片是动态扫描程序扫描后所能显示的两种效果,图一在扫描程序里为注释的部分



所用仿真开发板型号.

后续还会更新相关的例程,有哪里描述的不对的地方请大佬指点出来,希望本帖子可以帮助到大家,有兴趣的可以留言或者加我QQ464093890一起讨论学习。


需要相关资料的朋友可以点击点击链接下载:
1、IED及其使用手册和MINI-C学习指南链接:
https://pan.baidu.com/s/1qZv-5l2WTA_6KwwwEsJ4lA
提取码:u63h
2、芯片手册链接:
https://pan.baidu.com/s/1pACqdmqrCUK-P5cX4qXzDQ
提取码:b2oo
3、车载MP3数码管.rar (35.67 KB, 下载次数: 26)