📄 hex_bcd.c
字号:
#include <hex_bcd.h>
#include <reg51.h>
unsigned char bcdData[3];
unsigned int ihexs;
unsigned char disp_buffer[5];
void hextobcd(unsigned int hexs,unsigned char j);
void main(void){
ihexs = 59999;
hextobcd(ihexs,5);
while(1);
}
void hextobcd(unsigned int hexs,unsigned char j)
{
unsigned int va;
unsigned char i;
va = 10000; //最大数级万位
for(i=j-1;i;i--) {
disp_buffer[i] = 0; //目标数组清零
while ((hexs>=va)&&(va>9)) {
hexs -= va; //减除数
disp_buffer[i]++; //商位加1
}
va /= 10; //除数除10,指向低一位
}
disp_buffer[0]=hexs; //最后个位数
}
//////////////////////////////////////////////////
#include <AT892051.H>
#define BYTE unsigned char
#define WORD unsigned int
BYTE hour,min,sec; //定义时分秒变量
BYTE hour_2,hour_1,min_2,min_1,sec_2,sec_1;//定义显示缓冲变量
BYTE code dis[11]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xff}; //LED段码
BYTE coun1;//1秒走时=50ms*coun1
BYTE coun2;//闪动一次=50ms*coun2
bit adjust; //时间调整标志位,0表示调整分,1表示调整时。
bit display_sw=1;//显示开关标志位,0表示关闭显示,1表示开显示。
bit flash_sw;//调时间时闪动标志位,0表示灭,1表示亮
//---------延时子函数----------------------------
delay() //
{
BYTE d2;
for(d2=0;d2<0xff;d2++);
}
//显示子函数----------------------------------
display()
{
if(display_sw==1) {
P1=dis[sec_1];//显示秒
P3=0xfe;
delay();
P1=dis[sec_2];
P3=0xfd;
delay();
P1=dis[min_1];//显示分
P3=0xfb;
delay();
P1=dis[min_2];
P3=0xf7;
delay();
P1=dis[hour_1];//显示时
P3=0xef;
delay();
P1=dis[hour_2];
P3=0xdf;
delay();
P3=0xff;
}
}
//----按键长按、短按检测延时子函数----------------
bit testkeytime()
{
BYTE d1;
bit keytime=0;
if(display_sw==0) //如果关闭了显示,则不进行时间调整
{keytime=1; //使函数返回1,表示短按,开显示
goto en;
}
for(d1=0;d1<0xa0;d1++)//延时
{display(); //延时期间进行显示,避免按键期间影响显示
if(P3_7==1) //如果延时还没完就发现松开了按键,则使返回1,表示短按。
{
keytime=1; break;
}
}
en:while(P3_7==0); //如果按键未松开,等待按键松开。
display(); //调用显示
return(keytime);//返回值为1表示短按,返回值为0则表示长按
}
//--走时加1子函数-------------------------------------
add1()
{
if(sec==59) //如果秒已经59秒,则:
{sec=00; //秒清零,同时分钟加1
min=min+1; //
if(min==60) //如果分钟加1后等于60分,则
{min=00; // 分钟清零,同时小时加1。
hour=hour+1; //
if(hour==24) //如果小时加1等于24时,则
{hour=00;} //小时也清零。
}
} else {sec++;} //如果秒钟不等于59秒,则秒加1
}
//----计时中断(1秒计时)---------------------------
BYTE hex_bcd(BYTE a); //函数说明
timer0() interrupt 1
{TR0=0;
TH0=0x46;
TL0=0x30;
if (coun1==20)//
{coun1=0; //
add1(); //
sec_1=hex_bcd(sec)&0x0f;//
sec_2=hex_bcd(sec)>>4;
min_1=hex_bcd(min)&0x0f;
min_2=hex_bcd(min)>>4;
hour_1=hex_bcd(hour)&0x0f;
hour_2=hex_bcd(hour)>>4;
} else {coun1++;}//
TR0=1;
}
//---调时闪动中断---------------------------------
flash() interrupt 3
{TR1=0; //先关中断
TH1=0x3c; //赋定时初值
TL1=0xb0;
if(coun2==5)//50ms*5=250ms
{
coun2=0;
flash_sw=~flash_sw;//闪动标志为取反
if(flash_sw==0)
{if(adjust==0)
{min_1=0x0a;
min_2=0x0a;
} else {
hour_1=0x0a;
hour_2=0x0a;
}
} else {
min_1=hex_bcd(min)&0x0f;
min_2=hex_bcd(min)>>4;
hour_1=hex_bcd(hour)&0x0f;
hour_2=hex_bcd(hour)>>4;
}
} else {coun2++;}
TR1=1;
}
//-----十六进制数转BCD码子函数---------------------
//-----十进制不需要转换,转换为BCD码即是转换为十进制,例如B --- 11
BYTE hex_bcd(BYTE a)//
{ BYTE b; //定义一个2个字节的B变量
b=a/10; //
b=b<<4; //
a=a%10; //
b=b+a; //
return(b); //
}
//--------设置分钟子函数---------------------------
setmin()
{bit flag1;
adjust=0;
while(1) {
display();
if(P3_7==0)
{flag1=testkeytime();
if(flag1==1)
{min++; if(min==60) {min=00;}
} else {break;}
}
}
}
//--------设置小时子函数---------------------------
sethour()
{bit flag2;
adjust=1;
while(1) {
display();
if(P3_7==0) {
flag2=testkeytime();
if(flag2==1) {
hour++;
if(hour==24) {
hour=00;
}
} else {break;}
}
}
}
//--------时间设置子函数----------------------------
settime()
{TR0=0;
TR1=1;
setmin();
sethour();
TR1=0;
TR0=1;
}
//-----按键检测子函数--------------------------------
scankey()
{bit d_sw;
d_sw=testkeytime();
if(d_sw==1) //如果d_sw=1则表示短按
{
display_sw=~display_sw;
} else {settime();}
}
//----------主程序函数-------------------------------
void main(void)
{
hour=0x00; //小时清零
min=0x00; //分钟清零
sec=0x00; //秒钟清零
coun1=0x00; //coun1用于计时:1秒=50ms*coun1
SP=0X50; //设置堆栈
TMOD=0X11; //设定时器工作在1模式
TH0=0x3c; //定时器0初值设置
TL0=0xb0; //
TH1=0x3c; //定时器1初值设置
TL1=0xb0; //
EA=1; //开总中断
ET0=1; //开定时0中断
ET1=1; //开定时1中断
TR0=1; //启动计时器0
while(1) //无限循环
{
display(); //调用显示函数
if(P3_7==0) //如果按键按下则进行按键检测。
{
scankey();}//按键检测子函数
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -