/*************************************************************************************
* KF8F系列单片机开发板演示程序
* 标 题: LED硬件驱动
* 项 目 名: 13-LED-Drive_TEST
* 开发环境:ChipON IDE
* 版 本: V1.0 (2015/10/09)
* 使用芯片:KF8F4156
* 作 者:上海芯旺微电子技术有限公司
* 功能简述: 实现LED显示的开启和关闭,实现模拟定时下的计时累加
*
* 跳线接法:需给单片机供电,同时连接JP2 以及码输出P3口和段输出P00 P01 P03 P04,
* 可以连接P12和J21 当LED显示时灭灯,关闭时亮灯
* 特殊说明:这里采用LED共阴极模块,同时电源应该选择5V工作。
*************************************************************************************/
#include<KF8F4156.h>
//0x80 1段共阴 0x83 1段共阳;
//0x84 2段共阴 0x87 2段共阳;
//0x88 3段共阴 0x8B 3段共阳;
//0x8C 4段共阴 0x8F 4段共阳;
//0x90 5段共阴 0x93 5段共阳;
//0x94 6段共阴 0x97 6段共阳;
//0x98 7段共阴 0x9B 7段共阳;
//0x9C 8段共阴 0x9F 8段共阳;
#define LED_WORK_MODE 0x8C
unsigned char L_1,L_2,L_3,L_4; // 目标显示值
unsigned int timer; // 时间计数
unsigned char work_flag=1; // 显示与否的标志
unsigned char ARR_List[18]={ // 0亮 1灭 码值与引脚连接相关
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90, // 9
0x88, // a
0x83, // b
0xA7, // c
0xA1, // d
0x86, // e
0x8E, // f
0xBF, // -
0xFF, // 空
};
//;******************************************************************************
//;* 函 数 名: init_mcu()
//;* 函数功能: 初始化
//;* 入口参数: 无
//;* 返 回: 无
//;******************************************************************************
void init_mcu()
{
//晶振频率选择
OSCCTL = 0x60; //8M
//端口初始化
TR0 = 0x04;
TR1 = 0x00;
TR2 = 0x00;
TR3 = 0x00; // LED输出
P0LR = 0X1B; // COM 端高电平
P1LR = 0X00;
P2LR = 0X00;
P3LR = 0X00;
OPTR=0x44; //使能上拉,T0计时模式,等待启动
AIE=1;
}
//;************************************************************************************
//;* 函 数 名: led_init
//;* 函数功能: 选择参数
//;* 入口参数:
//;* 返 回:
//;************************************************************************************
void led_init()
{
//输出模式选项 : 0 ——推挽 1 ——开漏
LEDOMS0=0x00; //LED-COMx端输出模式设置位
LEDOMS1=0x00; //LED-SEGx端输出模式设置位
//开漏方式选择: 1——P管 0——N管
LEDODS0=0xFF; //LED-COMx端开漏方式选择位
LEDODS1=0xFF; //LED-SEGx端开漏方式选择位
// 辉度调节 0 15:16 1 14:16 2 12:16 3 10:16
// 辉度调节 4 8:16 5 6:16 6 4:16 7 2:16
LEDLUM=0x01;
// 扫描频率: B7-B4 时钟分频 B3-B0 预分频 更多见数据手册
// CLK(led)=SCLK / ( ((B3~B0)+1) * POWER(2,(B7~B4)) )
// 视觉停留需要至少50HZ不闪烁,LED模块内部还有1个32分频,
// 因此4段下需要4*50*32=6.4k的设定频率
// 因此8段下需要8*50*32=12.8k的设定频率
LEDPRE=0x72;
LEDDATA3=ARR_List[10]; //千位
LEDDATA2=ARR_List[11]; //百位
LEDDATA1=ARR_List[12]; //十位
LEDDATA0=ARR_List[13]; // 0 亮 1灭,与共阴共阳无关 //个位
LEDCTL=LED_WORK_MODE; // 默认开启 显示 ABCD
//while(1);
}
//;************************************************************************************
//;* 函 数 名: Start_for_led
//;* 函数功能: 启动LED的显示
//;* 入口参数:
//;* 返 回:
//;************************************************************************************
void Start_for_led()
{
//计数初始值
L_1=9;
L_2=9;
L_3=8;
L_4=7;
timer=0;
// 启动LED
LEDCTL=LED_WORK_MODE;
// 启动计时 计数
T0=0x64;
T0IE=1;
work_flag=1;
}
//;************************************************************************************
//;* 函 数 名: Stop_for_led
//;* 函数功能: 关闭LED的显示
//;* 入口参数:
//;* 返 回:
//;************************************************************************************
void Stop_for_led()
{
T0IE=0;
LEDCTL=0x00;
work_flag=0;
}
//主函数
void main()
{
unsigned int timeA=0,timeB=0;
init_mcu();
led_init();
Start_for_led();// 优先LED显示
P1LR2=0;
while(1)
{
LEDDATA3=ARR_List[L_1];
LEDDATA2=ARR_List[L_2];
LEDDATA1=ARR_List[L_3];
LEDDATA0=ARR_List[L_4];
// 开启关闭切换
timeA++;
if(timeA>20000)
{
timeA=0;
timeB++;
if(timeB>5)
{
timeB=0;
if(!work_flag)
{
Start_for_led();
P1LR2=0;
}
else
{
Stop_for_led();
P1LR2=1;
}
}
}
}
}
//===================================================
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
//===================================================
if(T0IF)
{
T0IF=0;
T0=0x64;
timer++;
if(timer>80) // 加快慢控制
{
timer=0;
//------
L_4++;
if(L_4==10)
{
L_4=0;
L_3++;
if(L_3==10)
{
L_3=0;
L_2++;
if(L_2==10)
{
L_2=0;
L_1++;
if(L_1==10)
{
L_1=0;
}
}
}
}
}
}
//===================================================
}
//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
|