PS.今天白天有点事情,其实东西昨天晚上都写的差不多了,但是也只有现在发布了,望见谅。。。
写在前面的话:相信大家在平时写程序的时候也感受到了一点:频繁的使用138译码器来选通模块的操作(无论是总线操作还是位操作)。那么既然这样,我们何不创建一个无返回值的函数帮助我们来选通各种各样的器件呢?这样的话可以提高程序的可读性和便于理解性。
代码如下:
void switch_138(unsigned char dat){ switch(dat){ case 0:P27=0;P26=0;P25=0;break; case 1:P27=0;P26=0;P25=1;break; case 2:P27=0;P26=1;P25=0;break; case 3:P27=0;P26=1;P25=1;break; case 4:P27=1;P26=0;P25=0;break; case 5:P27=1;P26=0;P25=1;break; case 6:P27=1;P26=1;P25=0;break; case 7:P27=1;P26=1;P25=1;break; //default:break; } }
【一、数码管静态显示】通过观察电路图可以发现,Y0~Y2网络标签什么也没有连接Y3连接了8255的CS;Y4对应Y4C连接了控制流水灯的锁存器,如法炮制,Y5C选通了继电器蜂鸣器;Y6C是数码管位选,Y7C是数码管段选。
接下来的工作不用说就知道了,最笨的方法也就是位选选通,送入数据;段选选通,送入数据;话不多说,呈上代码:
void display(unsigned char n){ switch_138(7); P0=leddata[n]; switch_138(6); P0=0xff; //数码管位选 全选 switch_138(0); }
这是一个实现静态显示的一个简单的方法,基本思路是:位选选通,送入数据;段选选通,送入数据(上面已经说过了),最后一行的switch_138(0);是让其它的锁存器都锁存住数据而已;当然还有更多更好的方法欢迎大家的评论与留言
【二、延时函数以及debuger的简介】 在写单片机程序的时候,延时函数往往也是必不可少的语句,但是请注意,延时函数是一把双刃剑,有利也有弊;利就是可以延时。。。而弊端是它在延时的时候单片机等于是闲着的,什么也没有干;那么至于如何解决这个问题,之后我会介绍一个简单的方法去解决,在这里要提及延时函数的内部循环值如何确定。这里就要用到keil软件里的debuger仿真了,可以通过键盘ctrl+F5进入,也可以点击这个图标:
这时,就不得不介绍一下这几个窗口了:
这里我们只用查看状态栏中的sec(单位S)就可以了,它记录这当前工作执行的时间;如图,现在将要执行的是init_time()这个函数,也就是说现在的时间。
各种执行动作依次包括:1、复位;2、全速运行;3:停止;4:进入当前函数执行;5、跳跃到当前函数执行(也记录时间);6:跳出当前函数(表示’模拟’执行完毕);7、单步运行光标所指行;(其中4、5、6、7)都是单步执行;
请注意!在debug之前一定要选择正确的芯片型号和晶振频率,不然的话算出的时间是错误的。如下图:先点击小锤子,然后输入晶振频率:
之后是选择对应的型号:
如果用的是内部RC震荡器的话用stc-isp下载程序的时候一定要调节好对应的频率!
由此根据需要,可以单步运行测试大致ms级别的运行时间;请注意,单片机软件延时的话,运行的时间并不是线性的,所以不是准确的,仅仅只能作为粗略的延时而已,在非必要的情况下建议不要较多的使用。但是debuger这个东西是非常有用的,除了计算时间之外还可以修改当前的变量或是某个寄存器的值,从而软件模拟执行效果,其它功能大家希望能够自行探索…
接下来就是数码管动态的显示独立按键的操作了,敬请期待!