仿真电路
- 元件:
英文名|中文名|属性
:-|:-|:-|:-
7SEG-MPX1-CA|共阳极数码管|-
7SEG-MPX1-CC|共阴极数码管|-
BUTTON|按键|-
RES|电阻|元件值设置为10K
-
电路图:
-
仿真图:
按键1 数字减1(0123456789.)
按键2 数字加1
按键3 切换字形码
程序设计
main.c
:#include <AT89X51.H> #define uchar unsigned char #define uint unsigned int uchar ca[11] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x7f}; //CA(共阳极)数码管字形码 uchar cc[11] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80}; //CC(共阴极)数码管字形码 //延时函数 t为毫秒(不准) void delay(uint t) { uint i; while (t--) { for (i = 120; i; i--) ; } } //主程入口 void main() { uchar *p = ca; //指针,用于切换字形码 char n = 0; //当前显示的数字 P1 = 0xff; //P1所有脚输出高电平 for (;;) //死循环,和while(1)等价 { if ((P1 & 0x07) != 0x07) //判断P2的1,2脚是不是高电平 { delay(10); //延时消除抖动 if (!(P1 & 0x01)) //P1.0相连的按键被按下 { if (--n < 0) { n = 10; } } if (!(P1 & 0x02)) //P1.1相连的按键被按下 { if (++n > 10) { n = 0; } } if (!(P1 & 0x04)) //P1.2相连的按键被按下 { if (*p == 0xc0) //指针p指向ca { p = cc; } else { p = ca; } } } P2 = *(p + n); //控制P1输出 delay(200); //粗略延时 } }
注解
- 数码管
数码管由8个LED组成,8个LED有一脚连在一起,称为公共极
如果公共极是正极,称作共阳极(CA)数码管,反之称作共阴极(CC)数码管。
数码管的引脚从左到右对应LED的顺序如图所示
字形码表
字形码表:
字符 | 共阳极 | 共阴极 |
---|---|---|
0 | 0xC0 | 0x3F |
1 | 0xF9 | 0x06 |
2 | 0xA4 | 0x5B |
3 | 0xB0 | 0x4F |
4 | 0x99 | 0x66 |
5 | 0x92 | 0x6D |
6 | 0x82 | 0x7D |
7 | 0xF8 | 0x07 |
8 | 0x80 | 0x7F |
9 | 0x90 | 0x6F |
A | 0x88 | 0x77 |
B | 0x83 | 0x7C |
C | 0xC6 | 0x39 |
D | 0xA1 | 0x5E |
E | 0x86 | 0x79 |
F | 0x8E | 0x71 |
H | 0x89 | 0x76 |
L | 0xC7 | 0x38 |
P | 0x8C | 0x73 |
R | 0xCE | 0x31 |
U | 0xC1 | 0x3E |
Y | 0x91 | 0x6E |
- | 0xBF | 0x40 |
. | 0x7F | 0x80 |
无 | 0xFF | 0x00 |
- 指针的使用
p = ca;
等价于p = *ca[0]
,指向数组的第一个元素
指针p
指向ca
或cc
两个数组
使用*(p+n)
访问数组中的元素,n
称为偏移
使用指针的时候小心超过数组的上下限
本文链接:https://blog.chrxw.com/archives/2020/03/03/1086.html
转载请保留本文链接,谢谢