LED模块
void Led(uchar dat)
{
Select_74H138(4);//打开Y4C
P0 = dat;//点亮LED灯
}
数码管模块
uchar code Nixie_Dat[]={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90};
//0-9
uchar code Nixie_Dot[]={0X40, 0X79, 0X24, 0X30, 0X19, 0X12, 0X02, 0X78, 0X00, 0X10};
//0.-9.
uchar w[8];
void DisplayAlone(uchar pos,value)
{
Select_74H138(7);
P0 = 0XFF;//消影
Select_74H138(6);
P0 = _crol_(0X01,pos);//位选
Select_74H138(7);
P0 = Nixie_Dat[value];//段选
Select_74H138(0);
}
void DisplaySMG(ulong num)
{
uchar pos,len;//pos在哪一位显示,len要显示数的位数
ulong temp = 1;
for(len = 0; len < 8; len++)
{
w[len] = num / temp % 10;
temp = temp * 10;;
if(num < temp) break;
}
len++;
for(pos = 0; pos < len; pos++)
DisplayAlone(pos,w[len-1-pos]);
}
矩阵按键模块(KBD)
sbit k1 = P4^4;
sbit k2 = P4^2;
sbit k3 = P3^5;
sbit k4 = P3^4;
void KeyScan()
{
uchar hang;
for(hang = 0; hang < 4; hang++)//P3^0~P3^4轮流给低电平
{
P3 = _cror_(0XF7,hang) & 0XFF;//保证P3^5~P3^7高四位不变
if(k1 == 0)
{
Delay(5);//按键消抖
while(k1 == 0)//检测按键是否松开
{
DisplaySMG(KeyValue);
}
KeyValue = hang + 4 * 0;
}
if(k2 == 0)
{
Delay(5);
while(k2 == 0)
{
DisplaySMG(KeyValue);
}
KeyValue = hang + 4 * 1;
}
if(k3 == 0)
{
Delay(5);
while(k3 == 0)
{
DisplaySMG(KeyValue);
}
KeyValue = hang + 4 * 2;
}
if(k4 == 0)
{
Delay(5);
while(k4 == 0)
{
DisplaySMG(KeyValue);
}
KeyValue = hang + 4 * 3;
}
}
}
矩阵按键只需要用4个按键情况(例如:s4 s5 s8 s9)
sbit R1 = P3^3;
sbit R2 = P3^2;
sbit C1 = P4^4;
sbit C2 = P4^2;
void KeyScan()
{
C1 = 0;
C2 = R1 = R2 = 1;
if(R1 == 0)//s4
{
Delay(5);
while(R1 == 0);
....
}
if(R2 == 0)//s5
{
Delay(5);
while(R2 == 0);
....
}
C2 = 0;
C1 = R1 = R2 = 1;
if(R1 == 0)//s8
{
Delay(5);
while(R1 == 0)
....
}
if(R2 == 0)
{
Delay(5);
while(R2 == 0)
....
}
}