在网上找到几个很便宜很便宜的移动电源板子,啥资料都么有,买来换上单片机折腾一下。先把6脚数码管搞定。,压缩包是这次折腾的资料。
单片机源程序如下:
- // MS83F1402的充电器方案应用
- // ----------------
- // VDD ------------|1(VDD) (GND)14|--------- GND
- //_LEVEL ------------|2(RA7) (PA0)13|--------- DBG_CLK A_ADC
- // _STAT ------------|3(PA6) (PA1)12|---------- DBG_DAT B+_ADC
- //_BST ------------|4(PA4) (PA2)11|------------- LL1
- // LL6 ------------|5(PC3) (PA3)10|------------- LL2
- // LL5 ------------|6(PC2) (PC0)09|------------- LL3
- // _KEY ------------|7(PC4) (PC1)08|------------- LL4
- // ----------------
- #include "SYSCFG.h"
- //宏定义
- #define OSC_16M 0x70
- #define OSC_8M 0x60
- #define OSC_4M 0x50
- #define OSC_2M 0x40
- #define OSC_1M 0x30
- #define OSC_500K 0x20
- #define OSC_250K 0x10
- #define OSC_32K 0x00
- #define WDT_256K 0x80
- #define WDT_32K 0x00
- //-----------------------------------//
- //GPIO功能
- //PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 //0-输出 1-输入
- //_LEVEL _STAT \ _BST LL2 LL1 B+_ADC A_ADC //0b11011111 0xdf
- //PC7 PC6 PC6 PC4 PC3 PC2 PC1 PC0
- //\ \ \ _KEY LL6 LL5 LL4 LL3 //0b00001111 0x0f
- #define _KEY PC4 //平时为高电平,低电平触发,复用功能为PWM3
- #define _BST PA4 //
- #define _STAT PA6 //
- #define _LEVEL PA7 //充电芯的状态指示灯
- //6脚数码管IO
- #define SetPortIn() { TRISA = 0xdf; PORTA = 0x00; TRISC = 0x0f; PORTC = 0x00;}//高阻态
- #define LL1 PA2
- #define LL2 PA3
- #define LL3 PC0
- #define LL4 PC1
- #define LL5 PC2
- #define LL6 PC3
- //-----------------------------------//
- //函数名称:DelayUs
- //功能: 短延时函数 --16M-2T--大概快1%左右.
- //输入参数:Time 延时时间长度 延时时长Time Us
- //返回参数:无
- void DelayUs(unsigned char Time)
- {
- do{
- NOP();
- --Time;
- }while( Time > 0 );
- }
- //函数名称:DelayMs
- //功能: 短延时函数
- //输入参数:Time 延时时间长度 延时时长Time ms
- //返回参数:无
- void DelayMs(unsigned char t)
- {
- unsigned char a,b;
- for(a=0;a<t;a++)
- {
- for(b=0;b<5;b++)
- {
- DelayUs(197); //快1%
- CLRWDT();
- }
- }
- }
- //-----------------------------------//
- //功能: 单片机上电始化
- //函数名:_INIT
- //功能:上电器件初始化
- // OSCCON寄存器 Bit7 >>> LFMOD=0 >>> WDT振荡器频率=32KHz
- // Bit6:4 >>> IRCF[2:0]=101 >>> 内部RC频率=4MHz
- // Bit0 >>> SCS=1 >>> 系统时钟选择为内部振荡器
- // MSCKCON寄存器 bit6 >>> VREG_OE=0 >>> 禁止稳压输出
- // Bit5 >>> T2CKSRC=0 >>> Timer2时钟源为系统时钟
- // Bit4 >>> SLVREN=0 >>> 关闭LVR
- // INTCON寄存器 设为0,禁止所有中断
- // CMCON0寄存器0B00000111; 关闭比较器,CxIN为数字IO口
- // ANSEL寄存器 设为0,关闭中断引脚模拟输入功能,也就是把相应位设为0,置为数字IO
- // WDTCON寄存器0B00010001;看门狗定时器预分配比 datasheet 第39页
- // 7:5 N/A
- // 4:1 WDTPS[3:0] 1000 1:8192
- // 0 SWDTEN 软件打开/关闭看门狗定时器:
- // 1 = 打开
- // 0 = 关闭
- #define _INIT()\
- {\
- OSCCON = WDT_32K|OSC_16M|0x00;\
- MSCKCON = 0B00000000;\
- INTCON = 0B00000000;\
- CMCON0 = 0B00000111;\
- ANSEL = 0B00000000;\
- }
- //功能:端口初始化
- //MS83F的IO口初始化可分为:
- //1.数字输出
- //2.数字输入
- //3.模拟输出
- //4.模拟输入
- //相关寄存器有:
- //1.CMCON0
- //2.ANSEL
- //3.TRISA和TIRSC
- //4.PORTA和PORTC
- //5.WPUA、OPTION和WPUC(OPTION的BIT7为PORTA口内部上拉总闸)
- //6.WPD
- //需要特别注意的是:CMOCN0上电模式是0,也就是对应的IO口为模拟口
- //ANSEL上电复位默认为0xFF,也就是所有AD口都默认为模拟口
- //这两个寄存器一般是要初始化的,尤其是需要把IO口设置为数字口
- //因此程序中有CMCON0=0x07和ANSEL=0 这点很多人会忽略到
- void GPIO_INIT(void)
- {
- CMCON0 |= 0B00000111; //关闭比较器,CxIN为数字IO口
- ANSEL |= 0B00000000; //所有IO口都为数字IO
-
-
- TRISA = 0B11011111; //PA输入输出 0-输出 1-输入
- PORTA = 0B00000000;
- WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
- //PA0,PA1模拟输入 BATT_ADC
- //PA2 LL1
- //PA3 LL2
- //PA4 _BST
- //PA5在芯片内部
- //PA6 _STAT
- //PA7 _LEVEL
-
- TRISC = 0B00001111; //PC输入输出 0-输出 1-输入
- PORTC = 0B00000000;
- WPUC = 0B00010000; //PC端口上拉控制 1-开上拉 0-关上拉
-
- //PC0 LL3
- //PC1 LL4
- //PC2 LL5
- //PC3 LL6
- //PC4 KEY
- //SOP14封装无PC5 PC6 PC7引脚
- OPTION = 0B00000000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
- //Bit7(PAPU)=0 ENABLED PULL UP PA
-
- //注意,各个引脚要有确定的状态
- _KEY = 1; // PC4 //平时为高电平,低电平触发,复用功能为PWM3
- _BST = 0; // PA4
- _STAT = 0; // PA6 //休眠的时候这里要设置为1
- _LEVEL = 0; // PA7 //充电状态指示灯
-
- }
- //=========================================//
- //函数名: main
- //功能: 主函数
- void main()
- {
- _INIT();//系统初始化
- CLRWDT();
- GPIO_INIT(); //GPIO初始化
- while( 1 )
- {
-
- SetPortIn();
- TRISA &= ~( 1 << 2); //将PA2设为输出 LL1
- TRISA &= ~( 1 << 3); //将PA3设为输出 LL2
- LL1 = 1; //1A
- LL2 = 0;
- DelayUs(500);
- LL1 = 0;
- LL2 = 1; //2A
- DelayUs(500);
-
- SetPortIn();
- TRISA &= ~( 1 << 2); //将PA2 设为输出 LL1
- TRISC &= ~( 1<< 0); //将PC0 设为输出 LL3
- LL1 = 1;
- LL3 = 0; //1B
- DelayUs(500);
- LL1 = 0;
- LL3 = 1; //2B
- DelayUs(500);
- SetPortIn();
- TRISA &= ~( 1 << 2); //将PA2 设为输出 LL1
- TRISC &= ~( 1<< 1); //将PC1 设为输出 LL4
- LL1 = 1;
- LL4 = 0; //1C
- DelayUs(500);
- LL1 = 0;
- LL4 = 1; //2C
- DelayUs(500);
-
- SetPortIn();
- TRISA &= ~( 1 << 2); //将PA2 设为输出 LL1
- TRISC &= ~( 1<< 2); //将PC2 设为输出 LL5
- LL1 = 1;
- LL5 = 0; //1D
- DelayUs(500);
- LL1 = 0;
- LL5 = 1; //2D
- DelayUs(500);
-
- SetPortIn();
- TRISA &= ~( 1 << 2); //将PA2 设为输出 LL1
- TRISC &= ~( 1<< 3); //将PC3 设为输出 LL6
- LL1 = 1;
- LL6 = 0; //1E
- DelayUs(500);
- LL1 = 0;
- LL6 = 1; //2E
- DelayUs(500);
-
- //----------------------------------------------------------//
- SetPortIn();
- TRISA &= ~( 1 << 3); //将PA3设为输出 LL2
- TRISC &= ~( 1<< 0); //将PC0 设为输出 LL3
- LL2 = 1;
- LL3 = 0; //??
- DelayUs(500);
- LL2 = 0;
- LL3 = 1; //2F
- DelayUs(500);
- SetPortIn();
- TRISA &= ~( 1 << 3); //将PA3设为输出 LL2
- TRISC &= ~( 1<< 1); //将PC1 设为输出 LL4
- LL2 = 1;
- LL4 = 0; //OUT
- DelayUs(500);
- LL2 = 0;
- LL4 = 1; //2G
- DelayUs(500);
-
- SetPortIn();
- TRISA &= ~( 1 << 3); //将PA3设为输出 LL2
- TRISC &= ~( 1<< 2); //将PC2 设为输出 LL5
- LL2 = 1;
- LL5 = 0; //5.0V 1.0A
- DelayUs(500);
- LL2 = 0;
- LL5 = 1; //1F
- DelayUs(500);
-
- SetPortIn();
- TRISA &= ~( 1 << 3); //将PA3设为输出 LL2
- TRISC &= ~( 1<< 3); //将PC3 设为输出 LL6
- LL2 = 1;
- LL6 = 0; //??
- DelayUs(500);
- LL2 = 0;
- LL6 = 1; //1G
- DelayUs(500);
-
- //----------------------------------------------------------//
- SetPortIn();
- TRISC &= ~( 1<< 0); //将PC0 设为输出 LL3
- TRISC &= ~( 1<< 1); //将PC1 设为输出 LL4
- LL3 = 1;
- LL4 = 0; //5.0V 2.0A
- DelayUs(500);
- LL3 = 0;
- LL4 = 1; //3B
- DelayUs(500);
-
- SetPortIn();
- TRISC &= ~( 1<< 0); //将PC0 设为输出 LL3
- TRISC &= ~( 1<< 2); //将PC2 设为输出 LL5
- LL3 = 1;
- LL5 = 0; //IN
- DelayUs(500);
- LL3 = 0;
- LL5 = 1; //3C
- DelayUs(500);
-
- SetPortIn();
- TRISC &= ~( 1<< 0); //将PC0 设为输出 LL3
- TRISC &= ~( 1<< 3); //将PC3 设为输出 LL6
- LL3 = 1;
- LL6 = 0; //??
- DelayUs(500);
- LL3 = 0;
- LL6 = 1; //%
- DelayUs(500);
-
- //----------------------------------------------------------//
- SetPortIn();
- TRISC &= ~( 1<< 1); //将PC1 设为输出 LL4
- TRISC &= ~( 1<< 2); //将PC2 设为输出 LL5
- LL4 = 1;
- LL5 = 0; //??
- DelayUs(500);
- LL4 = 0;
- LL5 = 1; //??
- DelayUs(500);
-
- SetPortIn();
- TRISC &= ~( 1<< 1); //将PC1 设为输出 LL4
- TRISC &= ~( 1<< 3); //将PC3 设为输出 LL6
- LL4 = 1;
- LL6 = 0; //??
- DelayUs(500);
- LL4 = 0;
- LL6 = 1; //??
- DelayUs(500);
-
- //----------------------------------------------------------//
- SetPortIn();
- TRISC &= ~( 1<< 2); //将PC2 设为输出 LL5
- TRISC &= ~( 1<< 3); //将PC3 设为输出 LL6
- LL5 = 1;
- LL6 = 0; //??
- DelayUs(500);
- LL5 = 0;
- LL6 = 1; //??
- DelayUs(500);
- }
-
- }
-
复制代码
以上资料51hei提供下载:
6脚数码管测试.zip
(355.97 KB, 下载次数: 49)
|