- void ET_1() interrupt 1 // 是由中断向量表决定的, 这里用定时器0 是interrupt 1
- {
- static uchar wei=0x01,i=0; //用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.
- static uint j=0; // 这个没有用
-
- TH0=(65536-2000)/256; //定时器T0的高8位重新赋初值
- TL0=(65536-2000)%256; //定时器T0的低8位重新赋初值
-
- //以下代码完成数码管动态扫描刷新
- P2=0x00; // 解决数码管鬼影, 关闭数码管的位,赋值过程都做好后,再重新打开
- P0=duanma[led]; //运用数码管显示字符转换表 提取并转为数码管显示字符
- P2=wei; // 打开数码管的位
- wei=wei<<1; ////将字符变量wei,循环左移1位 ,重新赋给wei变量。 此外”<<“符号为左移命令符号。
- if(++i==8) //自增i 当i的值等于8时
- {i=0;wei=0x01;} // 这里用8个位数码管 达到8次后i计数值清零 数码管的位重新赋最右位
- }
复制代码
这是运用数码管动态显示的原理,并最终借助于中断系统来完成实用的数码管显示程序。
多个数码管显示数字的时候,我们实际上是轮流点亮数码管(一个时刻内只有一个数码管是亮的),利用人眼的视觉暂留现象(也叫余辉效应),可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫做动态扫描。
这里用static把wei定义成了一个静态局部变量。静态局部变量和普通局部变量一样,只能在定义它的函数里面使用它。普通局部变量在程序退出函数以后,就会释放,静态局部变量则不会被释放,它在整个生命周期都存在。下次读到是上次修改后的值。
我认为这个是针对于static定义的局部变量而言的,除了只能在定义它的函数内局部使用外其他的和全局变量是一样的(只在第一次调用时初始化,用完后空间不会释放,已存值不会改变)。比方说以上的 i 在第一次调用时被初始化为0.然后自加为1,那么第二次调用时 i 的初始值就是1,运行完就是2。
|