打印

工作之后这样写程序2

[复制链接]
5159|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一个牧师|  楼主 | 2009-8-9 21:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前两天发了1,还有兄弟过来捧场,谢谢板砖啊……

今天先说说主程序基准时间的选取吧
我个人理解是最小优先的选取方法
举个例子来说
我要做个闹钟
板上有4个数码管,有按键若干
一个数码管的扫描间隔如果超过12ms也许就会发现闪烁现象,当然我说的是大多数的数码管啊
4个数码管分四次扫描   12/4=3
也就是说我主程序每扫一次数码管的时间间隔不能超过3ms
按键扫描时间间隔可以随意定,但是最好是要定在10ms以内,因为如果是定义为40ms以上有效我们可以
扫描4次这样有利于干扰排除
所以主程序的基准时基就不能超过3ms
我一般定的是2ms(能扫描完各个子程序就行  当然得按实际需要定)
下面再给大家介绍一下    在《工作之后这样写程序1》中介绍给大家如何解决  扫描频率不一样
的问题,和如何实现四个数码管分四次扫描。
这样的问题都归为一个程序的“指针”
main:
bts1 ftc1irq
jmp main   
bclr ftc1irq  //2ms
call display  
call key_scan
jmp main  




下面结合程序来看一下
display:
mov a,display_dptr
b0add pcl,a
jmp scan_com1 //第一个2ms
jmp scan_com2 //第二个2ms
jmp scan_com3 //第三个2ms
jmp scan_com4 //第四个2ms  第五个2ms再回到scan_com1
scan_com1:
bclr com4  //关四数码管显示
mov a,ledbuf[0] //送显示数据
call com_num
b0bset com1  //开一数码管显示
jmp display_timer //对显示指针进行加一,跳出显示程序
scan_com2:
bclr com1
mov a,ledbuf[1]
call com_num
b0bset com2
jmp display_timer
scan_com3:
bclr com2
mov a,ledbuf[2]
call com_num
b0bset com3
jmp display_timer
scan_com4:
bclr com3
mov a,ledbuf[3]
call com_num
b0bset com4
jmp display_timer

display_timer: //对显示指针的操作,每次加一,加到4后清零  跳出数码管扫描程序
incms display_dptr
mov a,#4
cmprs a,display_dptr
ret //和4不等时跳出
clr display_dptr//和4相等时清零
ret

key_scan:
键盘处理有很多种要求,常用的有三种,这里要是说程序就有点太麻烦了,明天先介绍第一种。
先介绍一下有那三种吧
1,功能键模式,按下去只有一次动作。之后一直按也不会有效果
2,加减键,一般要求有连按,按下40ms就有动作,之后每到500ms在动作一次(时间不固定)
3,按下无动作,键弹起看是否有效。这样一般是大模式转换,比如+-键和模式键复用,
当按下3s一上转换模式,3秒以下是+-功能。我现在做的案子这三种都有命苦啊
今天就不说怎么扫描了,说下在《工作之后这样写程序1》中扫描频率的解决吧,其实这个按键扫描频率不
解决也没事,2ms扫一次也可以,但是以后在程序中总会碰到这样的问题。就说一下吧
同样也是用指程序针来做
mov a,key_scan_dptr
b0add pcl,a
jmp key_dptr_pro //对指针进行操作  不近扫描  之后跳出
jmp key_dptr_pro //对指针进行操作  不近扫描  之后跳出
jmp key_dptr_pro //对指针进行操作  不近扫描  之后跳出
jmp key_dptr_pro //对指针进行操作  不近扫描  之后跳出
jmo key_scan_pro //近按键扫描   对指针操作
扫描方法就是一种了,主程序都采用分时复用了,其它程序都得分时复用了。
明天来说一下按键扫描,在论坛中戒指320写的键盘程序就是分时复用的典型应用,没事多去踩下
我俩同事哈哈……:lol

相关帖子

沙发
一个牧师|  楼主 | 2009-8-9 22:01 | 只看该作者
display:
        mov        a,display_dptr
        b0add        pcl,a
        jmp        scan_com1        //第一个2ms
        jmp        scan_com2        //第二个2ms
        jmp        scan_com3        //第三个2ms
        jmp        scan_com4        //第四个2ms  第五个2ms再回到scan_com1       
scan_com1:
        bclr        com4                //关四数码管显示
        mov        a,ledbuf[0]        //送显示数据
        call        com_num
        b0bset        com1                //开一数码管显示
        jmp        display_timer        //对显示指针进行加一,跳出显示程序
scan_com2:
        bclr        com1
        mov        a,ledbuf[1]
        call        com_num
        b0bset        com2
        jmp        display_timer
scan_com3:
        bclr        com2
        mov        a,ledbuf[2]
        call        com_num
        b0bset        com3
        jmp        display_timer
scan_com4:
        bclr        com3
        mov        a,ledbuf[3]
        call        com_num
        b0bset        com4
        jmp        display_timer



display_dptr                         数码管扫描程序的“指针”

使用特权

评论回复
板凳
oksmn| | 2009-8-10 00:33 | 只看该作者
很喜欢这样的技术贴,写得详细,收益匪浅

使用特权

评论回复
地板
红金龙吸味| | 2009-8-10 01:09 | 只看该作者
写的不错撒,但是看见汇编脑壳疼。

使用特权

评论回复
5
IC_99| | 2009-8-10 01:44 | 只看该作者
研究研究,学习一下

使用特权

评论回复
6
rasar| | 2009-8-10 08:39 | 只看该作者
路过

使用特权

评论回复
7
jiyiche| | 2009-8-10 20:48 | 只看该作者
有没有C语言版的?谢谢楼主

使用特权

评论回复
8
一个牧师|  楼主 | 2009-8-10 22:21 | 只看该作者
学单片机入门的时候是用c学的
但是好久不用了
估计现在写是有难度了
本来想写51的汇编了,但是用惯了松翰的位指令总觉得在用51的有点麻烦
现在工作都是用汇编写
哎……用惯了一个版本就是这样,其它的技能可能就慢慢退化了。
最近也再慢慢的复习c,不过现在肯定是没那么多时间来写了。
这个你先看吧,看思路,不明白的留言。肯定会答复!

使用特权

评论回复
9
badbird1234| | 2009-8-11 08:48 | 只看该作者
什么公司搞这么多SONIX的程序员
小项目还真多

使用特权

评论回复
10
一个牧师|  楼主 | 2009-8-11 18:41 | 只看该作者
现在刚过来两个你就说多
都过来你说啥啊 ?
我这在讲一点程序的写法
你竟然问这个
思维还真是活跃啊

使用特权

评论回复
11
badbird1234| | 2009-8-11 20:19 | 只看该作者
发现你们都很牛X
居然写了那么多汇编还没晕
向你们学习
呵呵

使用特权

评论回复
12
skymaster| | 2009-8-11 22:17 | 只看该作者
汇编执行效率高

使用特权

评论回复
13
new1988| | 2009-8-12 07:10 | 只看该作者
谁可以发个C的列子上来看看啊,谢谢了

使用特权

评论回复
14
Etual| | 2009-8-12 08:46 | 只看该作者
main:
    bts1 ftc1irq            // 判断2ms标志位是否置为1,这个标志位在中断里面处理
    jmp main               // 还没有到的话就死循环等待
    bclr ftc1irq  //2ms  到了,清楚刚才的标志位
    call display          // 顺序执行各个任务,这里只有2个,扫描LED和KEY
    call key_scan
    jmp main              // 大循环完成,返回等待下一个时间片(2ms)的到来


基本楼主想说的最核心的就是这个时间片的处理。
另外那个数码管扫描的用C来描述的话就是
switch(display_dptr)
case 0:
    scan_com0();
    break;
case 1:
    scan_com1();
    break;
...
...
...

楼主的单片机用移动PC指针的办法跳转,怎么我觉得台湾的单片机都一个样子 ......

再另外,如果楼主想清楚解释时间片的话,最好涉及一下每个任务里面怎么运用状态机
否则初学者看到这个大脑还是会打麻花的 - -b
也就是怎么设置标志位,怎么判断时间已经到达,怎么长延时,怎么状态跳转等。

支持楼主,顶一下~~~

使用特权

评论回复
15
qiao1102| | 2009-8-12 09:36 | 只看该作者
本帖最后由 qiao1102 于 2009-8-12 09:50 编辑

楼主想要表达的是思路,

使用特权

评论回复
16
思考| | 2009-8-12 17:42 | 只看该作者
呵呵,原来和戒指是同事啊,难怪都用的SONIX,我还以为是最近SONIX很火呢,都在用它.不过可以看出你们公司还不错.

使用特权

评论回复
17
njreach| | 2016-9-18 11:52 | 只看该作者
lz你好,我也是搞汇编的,而且咱俩的架构差不多,可以告诉我你的qq吗?咱们详细沟通,或者你加下我的736898032

使用特权

评论回复
18
长的帅怪我落| | 2016-9-18 15:59 | 只看该作者
汇编。。唉 好久不用 忘得差不多了

使用特权

评论回复
19
NE5532| | 2016-9-18 17:11 | 只看该作者
这个比较适合用类C来写。

使用特权

评论回复
20
416356084| | 2016-9-18 18:10 | 只看该作者
学习

使用特权

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

本版积分规则

5

主题

22

帖子

2

粉丝