题目:第一个数码管显示1,亮0.5s,关闭,第二个显示2,亮0.5s,关闭,第六个显示6,亮关;再第一个亮,循环。
//第一个亮1,0.5s,第二个亮2,0.5s,直到第六个
#include <reg52.h>
#include<intrins.h>
sbit dula=P2^6; //申明U1锁存器的锁存端
sbit wela=P2^7; //申明U2锁存器的锁存端
void delayms(uint x);
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar a,b;
void main()
{
while(1) //主程序里面执行一个while语句,一直在循环,这个与书中一样
{
b=0xfe; // 给b赋的初值,位选第一位点亮: 1111 1110
for (a=1;a<7;a++) //for循环里面,表达式2为真,执行语句,然后表达式3,然后继续表达式2,为真执行语句,表达式3……当a=6,<7,位选是6,段选是6,位选变为b=7,段选a=a+1=7, a<7不成立,则跳出for语句,不执行语句。 出来后while有2个语句,while一直为真,则while的2个语句重复执行,第一个语句赋值,第二个语句又开始使用。a=1,b=第一位,开始亮灯。
{
wela=1; //打开位选锁存端,书中是先段选,再位选
P0=b; //定位位选,第a个灯亮,第a端对应数据为0,其他为1.
wela=0; //关闭位选锁存端
P0=ff; //消影作用。
dula=1;
P0=table[a];
dula=0;
delayms(500);
b=_crol_(b,1) //这里跟书中不同,使用一个循环左移1位,这样就能让位选成为第二位,第三位……
}
}
}
void delayms(uint x)
{
uint i,j;
for(i=x; i>0; i--)
for (j=110; j>0; j--);
}
当把每个灯点亮的时间缩短至1ms,则这时候6个数码管上非常稳定,清晰地显示着123456字样了,所以,所谓动态扫描显示,是轮流向各位数码管送出字形码和相应的位选,因为时间特别的快,利用发光管的余辉和人眼视觉暂留作用,人眼睛感觉好像各个数码管同时都在显示,其实是一位一位轮流显示,特别快,肉眼无法分辨。