发新帖我要提问
12
返回列表
打印
[单片机类]

【灯光控制任务书】+看中了那个行车记录仪(视频已上传)

[复制链接]
楼主: liupk
手机看帖
扫描二维码
随时随地手机跟帖
21
liupk|  楼主 | 2018-3-14 15:15 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 liupk 于 2018-3-14 15:22 编辑

按键处理函数key_proc();

在中断里面如果


key_flag = 1;  //10ms按键扫描标志位置1


标志位置一后就会调用   


read_key(void)  读取键值


当读取键值以后


需要对键值进行处理


/*
*********************************************************************************************************
*        函 数 名: key_proc
*        功能说明: 按键处理函数
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void key_proc(void)
{
        if(key_flag)
        {
            key_flag = 0;
            key_temp = read_key();
        }        
        //进入按键处理程序部分
        switch(key_temp)
        {
            case 1:        //S7控制L5
                                led5_temp = ~led5_temp;
                                if(led5_temp)
                                {
                                        led5 = 1<<4;


                                }else
                                {
                                        led5 = 0<<4;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                
                                
                break;

            case 2:         //S6控制L6
                                led6_temp = ~led6_temp;
                                if(led6_temp)
                                {
                                        led6 = 1<<5;

                                }else
                                {
                                        led6 = 0<<5;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;
                break;     
                        case 3:         //S5控制L7
                                 led7_temp = ~led7_temp;
                                if(led7_temp)
                                {
                                        led7 = 1<<6;

                                }else
                                {
                                        led7 = 0<<6;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;
                break;
            case 4:           //S4控制L8
                                led8_temp = ~led8_temp;
                                if(led8_temp)
                                {
                                        led8 = 1<<7;

                                }else
                                {
                                        led8 = 0<<7;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;
                break;      
        }
                key_temp = 0;  //完成按键处理程序后,清除键值           
}




8个LED指示灯分为2组:L1~L4为远程控制组,
本地控制组的指示灯由独立按键控制开关。
S5控制L7,S4控制L8


这个是题目的要求


以下面的一个例子说明


case 1:        //S7控制L5
                                led5_temp = ~led5_temp;
                                if(led5_temp)
                                {
                                        led5 = 1<<4;


                                }else
                                {
                                        led5 = 0<<4;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                
                                
                break;



当按键为S7按下时候,先将   led5_temp = ~led5_temp;  取反一次(保证每次按下时,执行的动作也就是亮灭与上次的相反)
分别视情况执行
led5 = 1<<4;
或者
led5 = 0<<4;


XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;        

这样写的好处是为了,每个灯的亮灭不会影响别的灯,不会干扰

使用特权

评论回复
22
liupk|  楼主 | 2018-3-14 15:35 | 只看该作者
        display_proc();
显示处理函数




在定时器中断0里面每隔  1ms就会刷新一个数码管  display();
每隔1ms  就会累加一次ms  直到ms达到了1000。。。。。。。


/*
*********************************************************************************************************
*        函 数 名: display_proc
*        功能说明: 显示处理函数
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void display_proc(void)
{
                if(ms == 1000)
                {
                        ms = 0;
                        S++;


                        if(S==60)//秒
                        {
                                S=0;
                                M++;
                        }
                        if(M==60)//分
                        {
                                M=0;
                                H++;
                        }
                        if(H==24)//时
                                H=0;


                        dspbuf[7] = S%10;  //秒
                        dspbuf[6] = S/10;


                        dspbuf[5] = 11;           //-(横线)


                        dspbuf[4] = M%10;  //分
                        dspbuf[3] = M/10;


                        dspbuf[2] = 11;           //-(横线)


                        dspbuf[1] = H%10;  //时
                        dspbuf[0] = H/10;
                }
}





如果达到了ms==1000  则ms清零
秒S++
如果S==60秒 则S清零
分M++
如果分M==60分 则分M清零
时H++
如果时H==24 则H清零。




然后不同的数码管对应显示不同的数值。






使用特权

评论回复
23
liupk|  楼主 | 2018-3-14 15:42 | 只看该作者
本帖最后由 liupk 于 2018-3-14 15:54 编辑

最后一个函数   uart_proc();
实现串口的处理。


根据题目的要求   


当发送

0XA0 0XA1 0XA2 .....0XAF


时,对应的是L1----L4不同的灯亮


当发送


0XB0


时,对应的是返回串口一个当前时间数据


后面对时间值进行了处理,然后使标志位
uart_flag = 1;
   


/*
*********************************************************************************************************
*        函 数 名: uart_proc
*        功能说明: 串口数据处理
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void uart_proc(void)
{
        if((RxdByte & 0xA0) == 0xA0)(这一句是多余了,当时没有考虑好,其实不用把高位清零,直接switch里面判断0XA0 0XA1 0XA2 .....0XAF就好了)

                {
                         switch(RxdByte&0x0F)
                        {
                                 case 0x00:        
                                        led1 = 1<<0;led2 = 1<<1;led3 = 1<<2;led4 = 1<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x01:
                                        led1 = 0<<0;led2 = 1<<1;led3 = 1<<2;led4 = 1<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x02:
                                        led1 = 1<<0;led2 = 0<<1;led3 = 1<<2;led4 = 1<<3;                                                
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x03:
                                        led1 = 0<<0;led2 = 0<<1;led3 = 1<<2;led4 = 1<<3;                                               
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x04:
                                        led1 = 1<<0;led2 = 1<<1;led3 = 0<<2;led4 = 1<<3;                                               
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x05:
                                        led1 = 0<<0;led2 = 1<<1;led3 = 0<<2;led4 = 1<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x06:
                                        led1 = 1<<0;led2 = 0<<1;led3 = 0<<2;led4 = 1<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x07:
                                        led1 = 0<<0;led2 = 0<<1;led3 = 0<<2;led4 = 1<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x08:
                                        led1 = 1<<0;led2 = 1<<1;led3 = 1<<2;led4 = 0<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x09:
                                        led1 = 0<<0;led2 = 1<<1;led3 = 1<<2;led4 = 0<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x0A:
                                        led1 = 1<<0;led2 = 0<<1;led3 = 1<<2;led4 = 0<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x0B:
                                        led1 = 0<<0;led2 = 0<<1;led3 = 1<<2;led4 = 0<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x0C:
                                        led1 = 1<<0;led2 = 1<<1;led3 = 0<<2;led4 = 0<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x0D:
                                        led1 = 0<<0;led2 = 1<<1;led3 = 0<<2;led4 = 0<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x0E:
                                        led1 = 1<<0;led2 = 0<<1;led3 = 0<<2;led4 = 0<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;
                                case 0x0F:
                                        led1 = 0<<0;led2 = 0<<1;led3 = 0<<2;led4 = 0<<3;                                       
                                        XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                                               
                                        break;                               
                        }                       
                }
                if(RxdByte  == 0xB0)
                {
               
                        str[0] = '0';
                        str[1] = 'x';


                        str[2] = H/10 + '0';
                        str[3] = H%10 + '0';
                        str[4] = ' ';


                        str[5] = '0';
                        str[6] = 'x';


                        str[7] = M/10 + '0';
                        str[8] = M%10 + '0';
                        str[9] = ' ';


                        str[10] = '0';
                        str[11] = 'x';


                        str[12] = S/10 + '0';
                        str[13] = S%10 + '0';
                        str[14] = ' ';


                        str[15] = '\0';


                        uart_flag = 1;
               
                }
}




然后在串口中断里面根据


uart_flag = 1;


做出条件判断


if(uart_flag)
{
        uart_flag = 0;
        uart_sendstring(str);
}


uart_sendstring(str);  
这个函数来自于官方提供的例程
/*
*********************************************************************************************************
*        函 数 名: uart_sendstring
*        功能说明: 通过串口发送字符串
*        形    参:str
*        返 回 值: 无
*********************************************************************************************************
*/
void uart_sendstring(unsigned char *str)
{
    unsigned char *p;
   
    p = str;
    while(*p != '\0')
    {
        SBUF = *p;
                while(TI == 0);  //等待发送标志位置位
                TI = 0;
        p++;
    }
}




4.png (408.85 KB )

4.png

使用特权

评论回复
24
liupk|  楼主 | 2018-3-14 15:55 | 只看该作者
暂时就这些

使用特权

评论回复
25
caijie001| | 2018-3-16 06:50 | 只看该作者
@21ic小喇叭 把后面楼主更新的分析过程移到前面去

使用特权

评论回复
26
一路向北lm| | 2018-3-17 17:37 | 只看该作者
不错啊,加油

使用特权

评论回复
27
crocodile598| | 2018-3-26 21:52 | 只看该作者
我想问个问题,我基本思路也是这样,但是我数码管动态显示的时候会影响LED的显示怎么解决啊?

使用特权

评论回复
28
liupk|  楼主 | 2018-3-26 23:52 | 只看该作者
crocodile598 发表于 2018-3-26 21:52
我想问个问题,我基本思路也是这样,但是我数码管动态显示的时候会影响LED的显示怎么解决啊? ...

我qq   1302731753

使用特权

评论回复
29
crocodile598| | 2018-3-27 16:59 | 只看该作者
liupk 发表于 2018-3-26 23:52
我qq   1302731753

我刚刚仔细读了你的LED显示程序我觉得有参考的价值,也打开了我的思路,谢谢了。

使用特权

评论回复
30
liupk|  楼主 | 2018-3-27 17:12 | 只看该作者
crocodile598 发表于 2018-3-27 16:59
我刚刚仔细读了你的LED显示程序我觉得有参考的价值,也打开了我的思路,谢谢了。 ...

我前面有上传的官方例程,你单独的看官方例程中的数码管显示的代码,这样比较容易看一些

使用特权

评论回复
31
ohy3686| | 2018-4-2 23:42 | 只看该作者
本地控制有点小bug
按下S6和S7会控制L5和L6
这个题目没有要求

使用特权

评论回复
评论
liupk 2018-4-3 09:17 回复TA
好的我改一下 
32
liupk|  楼主 | 2018-4-3 09:25 | 只看该作者
本地控制有点小bug
按下S6和S7会控制L5和L6
这个题目没有要求



根据题目的要求需要更改下面这个函数




void key_proc(void)
{
        if(key_flag)
        {
            key_flag = 0;
            key_temp = read_key();
        }        
        //进入按键处理程序部分
        switch(key_temp)
        {
            case 1:        //S7控制L5
                                led5_temp = ~led5_temp;
                                if(led5_temp)
                                {
                                        led5 = 1<<4;

                                }else
                                {
                                        led5 = 0<<4;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;                               
                               
                break;
            case 2:         //S6控制L6
                                led6_temp = ~led6_temp;
                                if(led6_temp)
                                {
                                        led6 = 1<<5;

                                }else
                                {
                                        led6 = 0<<5;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;
                break;     
                        case 3:         //S5控制L7
                                 led7_temp = ~led7_temp;
                                if(led7_temp)
                                {
                                        led7 = 1<<6;

                                }else
                                {
                                        led7 = 0<<6;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;
                break;
            case 4:           //S4控制L8
                                led8_temp = ~led8_temp;
                                if(led8_temp)
                                {
                                        led8 = 1<<7;

                                }else
                                {
                                        led8 = 0<<7;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;
                break;      
        }
                key_temp = 0;  //完成按键处理程序后,清除键值          
}




更改为



void key_proc(void)
{
        if(key_flag)
        {
            key_flag = 0;
            key_temp = read_key();
        }        
        //进入按键处理程序部分
        switch(key_temp)
        {

                        case 3:         //S5控制L7
                                 led7_temp = ~led7_temp;
                                if(led7_temp)
                                {
                                        led7 = 1<<6;

                                }else
                                {
                                        led7 = 0<<6;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;
                break;
            case 4:           //S4控制L8
                                led8_temp = ~led8_temp;
                                if(led8_temp)
                                {
                                        led8 = 1<<7;

                                }else
                                {
                                        led8 = 0<<7;
                                }
                                XBYTE[0x8000] = led1|led2|led3|led4|led5|led6|led7|led8;
                break;      
        }
                key_temp = 0;  //完成按键处理程序后,清除键值          
}












使用特权

评论回复
33
liupk|  楼主 | 2018-4-3 09:30 | 只看该作者
ohy3686 发表于 2018-4-2 23:42
本地控制有点小bug
按下S6和S7会控制L5和L6
这个题目没有要求

改好了,老师

灯光控制任务书.rar

56.71 KB

第二版修改后的程序

使用特权

评论回复
34
ohy3686| | 2018-4-3 09:52 | 只看该作者

嗯...按照规矩,我还是得按照之前提交的程序来评分哦
已经相当profect了,留点美中不足吧。

使用特权

评论回复
评论
liupk 2018-4-3 09:52 回复TA
嗯嗯,好的好的,谢谢老师 
35
Goalpost| | 2018-4-12 16:05 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则