仿真电路
- 元件:
| 英文名 | 中文名 | 属性 |
|---|---|---|
| 7SEG-COM-AN-GRN | 7段共阳极数码管(绿色) | - |
| 74HC273 | 8位锁存器 | - |
| RX8 | 8位电阻排 | 元件值设置为100 |
| BUTTON | 按键 | - |
| RES | 电阻 | 元件值设置为10K |
-
电路图:

-
仿真图:

按键1 数码管1 加1
按键2 数码管2 加1
按键3 重置锁存器
程序设计
main.c:#include <AT89X51.H> #define uchar unsigned char #define uint unsigned int //字形码(0-9) uchar ca[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //延时函数 t为毫秒(不准) void delay(uint t) { uint i; while (t--) { for (i = 1200; i; i--) ; } } //刷新两个数码管 void display(uchar m, uchar n) { P2_0 = 0; P3 = ca[m]; P2_0 = 1;//更新锁存器1 P2_1 = 0; P3 = ca[n]; P2_1 = 1;//更新锁存器2 } //主程入口 void main() { uchar m = 0; //数码管1显示的数字 uchar n = 0; //数码管2显示的数字 P1 = 0xff; //P1所有脚输出高电平 display(); //更新显示 for (;;) //死循环,和while(1)等价 { if ((P1 & 0x07) != 0x07) //判断P1的1,2,3脚是不是高电平 { delay(10); //延时消除抖动 if (!(P1 & 0x01)) //按键1 { if (++m > 9) { m = 0; } display(m, n); } if (!(P1 & 0x02)) //按键2 { if (++n > 9) { n = 0; } display(m, n); } if (!(P1 & 0x04)) //按键3,清除锁存器 { P2_2 = 0; delay(10); P2_2 = 1; } } delay(10); //粗略延时 } }
注解

- 锁存器
- 锁存器顾名思义,可以把输出信号
锁住。一般用于引脚复用,扩充引脚数量。 - 引脚类型: 清除引脚
MR,时钟引脚CLK,数据输入引脚D,数据输出引脚Q
清除引脚MR: 低电平时将锁存器锁住的信号清除,输出Q置为低电平
时钟引脚CLK: 收到上升沿信号时解锁,输入D的信号可以传到输出Q,其余时候输出Q会被锁住,保持当前状态 
- 锁存器顾名思义,可以把输出信号
74HC273真值表
清除引脚MR |
时钟引脚CLK |
数据输入引脚D |
数据输出引脚Q |
|---|---|---|---|
| L | * | * | L |
| H | 上升沿 | H | H |
| H | 上升沿 | L | L |
| H | 非上升沿 | * | Q |
L:低电平,H:高电平