4位8段共阳数码管动态显示固定数字0123
下面是我根据程序做的注释,如有错误之处请指正!
单片机源程序如下(每一行都有详细的注释):- /* 4位8段共阳数码管显示固定数字:数码管的动态显示0123
- 数码管显示原理
- 1.静态显示
- 多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,
- 否则一体的多位同时显示必须时显示相同内容。
- 当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,
- 而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,
- 而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,
- 因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,
- 那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)
- 2.动态显示
- 位选控制亮不亮,而段选控制显示数字,
- 那怎样显示不同的数字呢?这就利用了人体肉眼观察的能力。
- 举个例子,
- 假设段选1控制第一位数码管数字显示1,那么在显示第二个数码管是段选控制数码管显示2,
- 而位选控制灯第二位数码管亮,第一位数码管灭。但是给人的感受是第一位数码管并没有灭(实际已经灭了),
- 因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。 */
- #include <reg52.h>//包含51系列头文件
- typedef unsigned char uchar;
- //typedef和define的作用是相似的(但实质却不一样),都是给unsigned char定义一个别名。
- //也就是说,在定义这个别名之后,你用uchar就等于unsigned char
- //unsigned char意为无符号字符型数据,占8位数,范围是0~255,简写缩写为uchar
- /* typedef和define的区别
- typedef 是用来定义一种类型的新别名的,它不同于宏(#define),不是简单的字符串替换。
- 它的新名字具有一定的封装性,所以新命名的标识符具有更易定义变量的功能。
- 它是语言编译过程的一部分,但它并不实际分配内存空间。
- 而 #define 只是简单的字符串替换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。
- 因此,它不会做正确性检查,不管含义是否正确它照样会带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。
- 接下来看下面的示例代码:
- typedef char * PCHAR1;
- #define PCHAR2 char *
- PCHAR1 c1, c2;// c1、c2 都为char *,typedef为char *引入了一个新的别名
- PCHAR2 c3, c4;//相当于char * c3, c4;c3是char *,而c4是char
- 在定义上述的变量时,c1、c2 与 c3 按照预期都被定义成 char* 类型。
- 值得注意的是,c4 却被定义成 char 类型,而不是我们所预期的 char*。
- 其根本原因就在于 #define 只是简单的字符串替换,而 typedef 则是为一个类型引入一个新的别名。
- */
- uchar table[] =
- //uchar是数组类型,占8位数,范围是0~255。
- //table是数组名称,可以自由定义,但不能和关键字重名,后面必须加[],内部可注明当前数组内的元素个数,也可不注明。
- {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //从前往后分别是0123456789
- uchar address[] =
- //uchar是数组类型,占8位数,范围是0~255。
- //address是数组名称,可以自由定义,但不能和关键字重名,后面必须加[],内部可注明当前数组内的元素个数,也可不注明。
- {0x7F,0xBF,0xDF,0xEF}; //从前往后分别是0111~1110,共阳数码管,故0为有效,分别对应数码的千百十个....
- void Delay(uchar m)
- //C语言定义延时函数主要通过无意义指令(void意为空)的执行来达到延时的目的。
- //delay为延时,void delay为延时子程序。
- //m代表需要延时多少毫秒,uchar范围是0-255
- {
- unsigned char a, b;
- //定义两个个无符号字符型变量a和b
- //for(; m > 0; m--)
- for(b = m; b > 0; b--)
- //本句后面没有分号,所以编译器会默认第二个也就是下一行的for语句是本行延时语句的内部语句。
- for(a = 2; a > 0; a--);
- //程序在执行时,第一个for语句中的b每减1次,第二个for语句便执行2次,因此一共执行m*2次。
- }
- int main()
- //void定义的函数没有返回值,int定义的函数返回整型值,int为有符号整型值,范围是-32768~32767
- {
- uchar i = 0;
- //定义一个无符号字符型整数i为0
- while(1) //while语句的作用是让程序停止在某处,或延时。
- //括号里面的1为表达式,表达式可以为一个常数,一个运算或一个带返回值的函数。
- //此句后没有跟分号,所以会默认后面第一个分号前的语句为它的内部语句。
- {
- if (i == 4) //一轮循环亮起后从头开始。if为选择语句,i==4,两个==写在一起表示测试相等,
- //即判断等号两边的数是否相等。数字4为数码管是4个,对应前面的位码4个
- i = 0; //意思是从第一个数码管开始显示
-
- P3 = address[i]; //通过P3控制要亮的数码管位
- P0 = table[i]; //通过P1控制要显示的数码管的段
- ++i; //故i++1(i自加1),即第二个第三个第四个数码管相继显示
- //Delay(1); //快速动态显示
- Delay(1000); //延时1000ms,可消除鬼影,达到消影
- }
- }
复制代码
|