📄 164.c
字号:
/*****************************************************
** 文件:164.c
** 功能:用74164驱动数码管显示
** 作者:韦坚
** 修改:韦坚
** 开始日期:2008-1-2
** 完成日期:2008-1-2
/***************************************************/
/*--------------------数码管显示代码----------------------*/
code char led[17]={0x11,0xD7,0x32,0x92,
0xD4,0x98,0x18,0xD3,
0x10,0x90,0x50,0x1C,
0x39,0x16,0x38,0x78,0xFF};
/*****************************************************************************
** 函 数 名: void shift(uchar function,int b)
** 功 能: 将要显示的一个数送入74164
** 入口参数: uchar function
0:不显示小数点
1:显示小数点
X:显示特殊字符
** int b(要显示的数据)
** 返 回 值: 无
** 日 期: 2007-11-17
*****************************************************************************/
void
shift(uchar function,int b)
{
int i;
switch (function)
{
case 0: b = led[b]; break;
case 1: b = led[b]&0xEF; break;
default: break;
}
for(i=0;i<8;i++)
{
scl=0;
if((b<<i)&0x80)
sda=1;
else
sda=0;
scl=1;
}
}
/*************************************************
** 函 数 名: void clear_164(void)
** 功 能: 清屏
** 入口参数: NULL
** 返 回 值: NULL
** 日 期: 2007-11-17
**************************************************/
void
clear_164(void)
{
uint i;
for(i=0;i<6;i++)
shift(0,10);
}
/*************************************************
** 函 数 名: void dis_time(void)
** 功 能: 用六个数码管显示 小时-分-秒
** 入口参数: 无
** 返 回 值: 无
** 日 期: 2007-11-17
**************************************************/
void
dis_time(void)
{
shift(0,sec&0x0F); //显示秒
shift(0,(sec&0xF0)>>4);
shift(2,0xFE); //显示横杆
shift(0,min&0x0F); //显示分
shift(0,(min&0xF0)>>4);
shift(2,0xFE); //显示横杆
shift(0,hou&0x0F); //显示小时
shift(0,(hou&0xF0)>>4);
}
/*************************************************
** 函 数 名: void dis_data(bit flag)
** 功 能: 用六个数码管显示 小时-分-秒
** 入口参数: 无
** 返 回 值: 无
** 日 期: 2007-11-17
**************************************************/
void
dis_data(bit years)
{
while (1)
{
read_8563();
if(years)
{
shift(0,0x10);
shift(0,0x10);
shift(0,0x10);
shift(0,0x10);
shift(0,year&0x0F); //显示年
shift(0,(year&0xF0)>>4);
if (mon&0x80) {shift(0,9);shift(0,1);} //显示2000年前
else {shift(0,0);shift(0,2);} //显示2000年后
}
else
{
shift(0,week&0x0F); //显示星期
shift(0,0x10);
shift(0,0x10);
shift(0,day&0x0F); //显示日
shift(0,(day&0xF0)>>4);
shift(0,0x10);
shift(0,mon&0x0F); //显示月
shift(0,(mon&0xF0)>>4);
}
delay(500); if(0==KEY3) break; //先放延时语句,以免人反应不过来
delay(500); if(0==KEY3) break; //先放延时语句,以免人反应不过来
delay(500); if(0==KEY3) break; //先放延时语句,以免人反应不过来
}
}
/*************************************************
** 函 数 名: dis_temperature(void)
** 功 能: 用六个数码管显示 温度
** 入口参数: NULL
** 返 回 值: NULL
** 日 期: 2007-11-17
**************************************************/
void
dis_temperature(void)
{
while(1)
{
temperature = read_temperature();
temp = temperature*0.0625*10000; //不要直接乘625,否则数据可能溢出
shift(0,16);
shift(0,16);
shift(0,temp%10);
if(temp>=10)shift(0,temp/10%10);
if(temp>=100)shift(0,temp/100%10);
if(temp>=1000)shift(0,temp/1000%10);
if(temp>=10000)shift(1,temp/10000%10);
if(temp>=100000)shift(0,temp/100000%10);
if(temp>=1000000)shift(0,temp/1000000%10);
if(temp>=10000000)shift(0,temp/10000000%10);
delay(2000); if(0==KEY3) break; //先放延时语句,以免人反应不过来
delay(2000); if(0==KEY3) break; //先放延时语句,以免人反应不过来
delay(2000); if(0==KEY3) break; //先放延时语句,以免人反应不过来
delay(2000); if(0==KEY3) break; //先放延时语句,以免人反应不过来
delay(2000); if(0==KEY3) break; //先放延时语句,以免人反应不过来
delay(2000); if(0==KEY3) break; //先放延时语句,以免人反应不过来
}
}
/*************************************************
** 函 数 名: dis_uart_receive(ulint b)
** 功 能: 用六个数码管显示 串口接收到的数据
** 入口参数: NULL
** 返 回 值: NULL
** 日 期: 2007-11-17
**************************************************/
void
dis_uart_receive(ulint b)
{
ulint i=9000;
clear_164();
shift(0,b%10);
if(b>=10)shift(0,b/10%10);
else shift(0,0);
shift(0,16);
shift(0,16);
shift(0,16);
shift(0,16);
shift(0,16);
shift(2,led[b]);
while(i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -