⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hex_bcd.c

📁 这是一称的项目原文件,包括T9汉字输入,打印机,24C512,已经引用到产品上
💻 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 + -