jiekou001 发表于 2021-4-25 15:19

看了官方这个例子,我学到了不少写延时函数技能

/****************************************************************************************
*
* 文件名: main.c
* 项目名: 14-LED_8x8
* 版 本: v1.0
* 日 期: 2016年05月31日 15时33分45秒
* 作 者: Administrator
* 程序说明:8X8LED模块循环显示Led_Power_Code中的数据。
* 适用芯片: KF8FXXX系列——KF8F2156、KF8F3156、KF8F4156
*                         KF8TSXXXX系列——KF8TS2716、KF8TS2516(4x8LED)
*                         KF8VXXX系列——KF8V327、KF8V427、KF8V429
****************************************************************************************/
#include<KF8TS2716.h>
//定义段码
char const smg_arr[] =         {
                                                                  0Xa0,//0
                                                        0Xbe,//1
                                                        0X62,//2
                                                        0X2a,//3
                                                        0X3c,//4
                                                        0X29,//5
                                                        0X21,//6
                                                        0Xba,//7
                                                        0X20,//8
                                                        0X28,//9
                                                        0xff,//关
                                                        0xdf,        //:
                                                        };
int const Led_Power_Code =         {
                                       0X00C8,//200
                                                             0X0190,//400
                                                             0X0320,//800
                                                             0X03E8,//1000
                                                             0X0514,//1300
                                                             0X0640,//1600
                                                             0X0708,//1800
                                                             0X0834,//2100
                                                          };
int display_data;
unsigned inttemp_data;
unsigned char unint,decade,hundred,thound;
//;************************************************************************************
//;* 函 数 名:delay_ms
//;* 函数功能: 延时函数
//;* 入口参数: 无
//;* 返    回:无
//;************************************************************************************
void delay_ms(int ms_data)
{
        int j=0;
        while(ms_data--)
        {
                _CWDT();
                j=100;
                while(j--);
        }
}
/****************************************************************************************
* 函数名:   init_mcu
* 函数功能:mcu初始化函数
* 入口参数:无
* 返回:       无
****************************************************************************************/
void init_mcu()
{
        /***时钟初始化****/
        OSCCTL = 0x60;          //设置为8M
        /***端口初始化****/
        TR0 = 0X04;            //P02设置为输入,其余口为输出
        TR1 = 0x00;            //P1设置为输出
        TR2 = 0X00;            //P2设置为输出
        TR3 = 0X00;            //P3设置为输出

    P0LR=0x00;                                //P0输出低
    P1LR=0x00;            //P1输出低
    P2LR=0x00;                                //P2输出低
    P3LR=0x00;                                //P3输出低

    P0=0x00;
    P1=0x00;
    P2=0x00;
    P3=0x00;
}
/****************************************************************************************
* 函数名:   init_led()
* 函数功能:LED初始化函数
* 入口参数:无
* 返回:       无
****************************************************************************************/
void init_led()
{
        LEDOMS0 = 0x00;    //推挽输出
        LEDOMS1 = 0x00;    //推挽输出

        LEDPRE = 0x60;   //LED时钟源选择1:64分频;LED预分频比选择1:1 500hz
        LEDDATA0 = 0XFF;
        LEDDATA2 = 0XFF;
        LEDDATA3 = 0XFF;
        LEDDATA4 = 0XFF;

        LEDLUM = 0x05;       //设置辉度6:16
        LEDCTL = 0x90;   //打开LED模块,开通LEDDAT0--LEDDAT4;选择共阴数码管
}
/****************************************************************************************
* 函数名:   display_LED()
* 函数功能:LED显示
* 入口参数:无
* 返回:       无
****************************************************************************************/
void display_LED()
{
        DIVAH = display_data>>8;
        DIVAL = display_data;
        DIVB = 10;
        DIVEN = 1;
        while(!DIVOEN);
        unint = DIVR;   //        取余数
        temp_data = DIVQH;
        temp_data = (temp_data<<8) + DIVQL;
        DIVAH = temp_data>>8;
        DIVAL = temp_data;
        DIVB = 10;
        DIVEN = 1;
        while(!DIVOEN);
        decade = DIVR;   //        取余数
        temp_data = DIVQH;
        temp_data = (temp_data<<8) + DIVQL;
        DIVAH = temp_data>>8;
        DIVAL = temp_data;
        DIVB = 10;
        DIVEN = 1;
        while(!DIVOEN);
        hundred = DIVR;
        temp_data = DIVQH;
        temp_data = (temp_data<<8) + DIVQL;
        DIVAH = temp_data>>8;
        DIVAL = temp_data;
        DIVB = 10;
        DIVEN = 1;
        while(!DIVOEN);
        thound = DIVR;
        LEDDATA0 = smg_arr;
        LEDDATA2 = smg_arr;
        LEDDATA3 = smg_arr;
        LEDDATA4 = smg_arr;
}
//主函数
void main()
{
        int i=0;
        init_mcu();
        init_led();
        while(1)
        {
                if(i<7)
                {
                        i++;
                }
                else
                {
                        i=0;
                }
                display_data = Led_Power_Code;
                delay_ms(2000);
                display_LED();
        }
}



有没有发现,那个j=0;
而后面有个while(j--);
这非常好啊,j--是先使用,不管后面是个几,都进行了判断,但是什么都不再继续进行。
学了一个大招,这样也不用担心被优化了。

两只袜子 发表于 2021-4-27 16:14

楼主厉害

weifeng90 发表于 2021-5-7 19:18

延时函数是考研软件攻城狮的能力

单片小菜 发表于 2021-5-7 22:46

感谢楼主的分享,不错的例子程序的。

嵌入小菜菜 发表于 2021-5-7 23:49

感谢楼主的分享,仔细的复习一下,也是好的。

yangxiaor520 发表于 2021-5-11 08:10

延时函数很考验技能的

单片小菜 发表于 2021-5-12 11:55

记在小本本上,这样好一些。

weifeng90 发表于 2021-6-3 21:06

多看看别人的代码能学到不少

sanfuzi 发表于 2021-6-4 11:54

一些经典的延时函数

uiint 发表于 2021-6-4 11:54

可使用不同类型的变量来进行延时设计

hellosdc 发表于 2021-6-4 11:55

可以通过定位器来测量

mituzu 发表于 2021-6-4 11:55

一种是硬件延时   

suzhanhua 发表于 2021-6-4 11:56

要用到定时器/计数器,这种方法可以提高CPU的工作效率

isseed 发表于 2021-6-4 11:56

使用定时器/计数器实现精确延时

wangdezhi 发表于 2021-6-4 11:56

可由晶振频率算出延时时间

biechedan 发表于 2021-6-4 11:57

最简单的定时器中断

chenci2013 发表于 2021-6-4 11:57

怎么用C语言做单片机的精确延时

gygp 发表于 2021-6-4 11:57

Delay()函数延时的时间是怎么计算的

suzhanhua 发表于 2021-6-4 11:58

主要采用循环体进行。 

isseed 发表于 2021-6-4 11:58

单片机的延时程序通过执行指令来达到延时效果
页: [1] 2
查看完整版本: 看了官方这个例子,我学到了不少写延时函数技能