仿真电路
- 元件:
英文名|中文名|属性
:-|:-|:-|:-
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:高电平
本文链接:https://blog.chrxw.com/archives/2020/03/03/1126.html
转载请保留本文链接,谢谢