📄 4x5text.c
字号:
/*****************************************************************
File:4x5text.c
Author:xiaorunyi
Edition:V1.0
Email:qq315626168@126.com
www.ednchina.com/blog/xiaorunyi
功能:74ls164数码管显示4x5健值
******************************************************************/
#include<reg52.h> //51芯片管脚定义头文件
#include<intrins.h> //内部包含延时函数 _nop_();
#define uint unsigned int
#define uchar unsigned char
void kbscan(); //4*5按键扫描
void delay(int count);
unsigned char kbp; //存储键值
sbit data_164=P1^7;
sbit clk_164 =P1^5;
sbit ale_164 =P1^6;
sbit bell=P1^4;
uchar code display[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"16
0x38, //"L"17
0x37, //"n"18
0x3E, //"u"19
0x73, //"P"20
0X5C, //"o"21
0x40, //"-"22
0x00, //熄灭23
0x00 //自定义
};
uchar dis1,dis2,dis3,dis4,dis5,dis6,dis7;
/******************************************************************
延时t毫秒
11.0592MHz时钟,延时约1ms
*******************************************************************/
void delayms(uint t)
{
uchar k;
while(t--)
{
for(k=0;k<125;k++)
{;}
}
}
/******************************************************************
写数据子函数
*******************************************************************/
void wr_bits(uchar num)
{
uchar i;
for(i=0;i<8;i++)
{
if(num&0x80) //从数据的高位开始送
data_164 =0;
else
data_164 =1;
num<<=1; //向左移动一位,先送高位
clk_164 =0; //下降沿将数据写入164
_nop_();
clk_164 =1;
}
}
/******************************************************************
数据转换子函数
*******************************************************************/
void conver()
{
dis7=dis6;
dis6=dis5;
dis5=dis4;
dis4=dis3;
dis3=dis2;
dis2=dis1;
dis1=kbp;
}
/*************************************************************
蜂鸣器响一声
*************************************************************/
void delay1(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
void beep()
{
unsigned char i;
for (i=0;i<10;i++)
{
delay(4);
bell=!bell; //BEEP取反
}
bell=1; //关闭蜂鸣器
//delay1(250); //延时
}
main()
{
clk_164 =0;
kbp=0xff;dis2=0;dis3=0;dis4=0;dis5=0;dis6=0;dis1=0;
ale_164 =1;
delayms(1);
ale_164 =0;
//wr_bits(0x00); //关闭数码管显示
delayms(40);
while(1)
{
kbscan();
if(kbp!=0xff)
{beep();
conver();
wr_bits(display[dis7]);
wr_bits(display[dis6]);
wr_bits(display[dis5]);
wr_bits(display[dis4]);
wr_bits(display[dis3]);
wr_bits(display[dis2]);
wr_bits(display[dis1]);
kbp=0xff;
//delayms(1000);
}
}// end while
}//end maim
void kbscan()
{
unsigned char scanrow[]={0xfb,0xf7,0xef,0xdf,0x7f};
unsigned char scancol[]={0xfe,0xfd,0xfb,0xf7};
uint row,col,kbtemp; //计数器定义
kbp=0xff;
for(row=0;row < 5;row++)
{
P3=scanrow[row]; //0值输出
kbtemp=P1&0x0f; //取P1口值
if(kbtemp !=0x0f)
{
delay(7); //延时去斗
if(kbtemp !=(P1&0x0f)); //再次判断是否有健按下
{
for(col=0;col<4;col++)
{
if(kbtemp==(scancol[col]&0x0f))
kbp=row*4+col;
} // for col detect
delay(7); //等待延时
while((P1&0x0f)!=0x0f); //等待按键释放
while((P1&0x0f)!=0x0f); //等待按键释放
} // end if keyin
} // end if keyin
} // for row
} // end kbscan
void delay(uint count)
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<122;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -