按下一个按键,用数码管显示一个数或者取消显示
SMG.H
void setNumber(int);
void setNthDigit(int);
SMG.c
#ifndef __BASELIB__
#define __BASELIB__
#include <REGX52.H>
#include <INTRINS.H>
#endif
void setNumber(int n) {
switch (n) {
case -1:
P0 = 0x00;
break;
case 0:
P0 = 0x3f;
break;
case 1:
P0 = 0x06;
break;
case 2:
P0 = 0x5b;
break;
case 3:
P0 = 0x4f;
break;
case 4:
P0 = 0x66;
break;
case 5:
P0 = 0x6d;
break;
case 6:
P0 = 0x7d;
break;
case 7:
P0 = 0x07;
break;
case 8:
P0 = 0x7f;
break;
case 9:
P0 = 0x6f;
break;
}
}
void setNthDigit(int n) {
switch (n) {
case 0:
P2_4 = 0; P2_3 = 0; P2_2 = 0;
break;
case 1:
P2_4 = 0; P2_3 = 0; P2_2 = 1;
break;
case 2:
P2_4 = 0; P2_3 = 1; P2_2 = 0;
break;
case 3:
P2_4 = 0; P2_3 = 1; P2_2 = 1;
break;
case 4:
P2_4 = 1; P2_3 = 0; P2_2 = 0;
break;
case 5:
P2_4 = 1; P2_3 = 0; P2_2 = 1;
break;
case 6:
P2_4 = 1; P2_3 = 1; P2_2 = 0;
break;
case 7:
P2_4 = 1; P2_3 = 1; P2_2 = 1;
break;
}
}
Delay.h
void DelayXms(int);
Delay .c
#ifndef __API__
#define __API__
#include <INTRINS.H>
#endif
void DelayXms(int x) //@11.0592MHz
{
while (x--) {
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;a
j = 190;
do
{
while (--j);
} while (--i);
}
}
main.c
#include <REGX52.H>
#include <INTRINS.H>
#include "SMG.H"
#include "Delay.h"
int main() {
int opt = 0;
while (1) {
if (P3_1 == 0) {
DelayXms(20);
while (P3_1 == 0);
DelayXms(20);
++opt;
}
if (opt & 1) {
setNthDigit(7); //在最高位上
setNumber(6); //显示6
DelayXms(1); //延迟一毫秒,我的理解是为了让电流充分流过,保证亮度
setNumber(-1); //清空亮光,防止把6的残影带到下一位数字上
setNthDigit(6); //在次高位上
setNumber(5); //显示5
DelayXms(1); //延迟一毫秒,保证亮度和最高位上的亮度相当
//setNumber(-1);//这里可以不用清空亮光了,因为显示65,5的亮光不删除并不影响6的显示。
}
else setNumber(-1);
}
return 0;
}