找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2191|回复: 4
收起左侧

功能电子表单片机程序(不用时钟芯片)

[复制链接]
ID:596979 发表于 2019-8-7 16:26 | 显示全部楼层 |阅读模式
#include "reg52.h"
#include "matrix_key.h"        
#define keynumber P1
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
extern unsigned char key_backvalue;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit led1=P2^0;
sbit led7=P2^6;
sbit out_break=P3^3;
unsigned char sec=45,min=59,hour=23;
unsigned char qq,ww;
char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
bit set=0,set_hour=0,set_min=0,hour_unit=0,min_unit=0,limit=0,min_flag1=0,min_flag2=0,hour_flag1=0,hour_flag2=0;
/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
extern void delay(u16 i)
{
        while(i--);        
}


void backspace()                        //退格
{
if(min_flag1&&min_flag2)
{
min_unit=1;set_min=0;min_flag2=0;
}
if(min_flag1&&min_flag2==0)
{
min_unit=0;set_min=1;
}
//
if(hour_flag1&&hour_flag2)
{
hour_unit=1;set_hour=0;hour_flag2=0;
}
if(hour_flag1&&hour_flag2==0)
{
hour_unit=0;set_hour=1;
}
}

        
void Timer0Init()
{
        TMOD|=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
                 TH1=0XFC;        //给定时器赋初值,定时1ms
        TL1=0X18;        
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器        
        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0X18;        
        ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器                        
}
void datapros()         
{
        DisplayData[0] = smgduan[hour/10];                                //时
        DisplayData[1] = smgduan[hour%10];                                 
        DisplayData[2] = 0x40;
        DisplayData[3] = smgduan[min/10];                                //分
        DisplayData[4] = smgduan[min%10];        
        DisplayData[5] = 0x40;
        DisplayData[6] = smgduan[sec/10];                                //秒
        DisplayData[7] = smgduan[sec%10];
}


void main()
{
Timer0Init();
PT0=1;
PX1=0;
while(1)
{
scan();
if(key_backvalue==31)
{
qq=hour;
ww=min;
set=1;
TR1=0;
}
if(set)                         //设置
{
scan();
switch(key_backvalue)
{
case(11):led1=0;key_backvalue=0x00; set_hour=1;min_unit=0;break;
case(14):led1=0;key_backvalue=0x00; set_min=1;hour_unit=0; break;
case(23):TR1=1;led1=1;min_flag1=0;min_flag2=0;hour_unit=0;min_unit=0;set_hour=0;set_min=0;break;
case(17):        hour=qq;min=ww;TR1=1;led1=1;min_flag1=1;min_flag2=0;hour_unit=0;min_unit=0;set_hour=0;set_min=0;break;
}
if(set_hour)                   //设置时
{
scan();
switch(key_backvalue)
{
case(1): key_backvalue=0x00;hour=(10+hour%10);hour_unit=1;set_hour=0;limit=1;hour_flag1=1;break;
case(2): key_backvalue=0x00;hour=(20+hour%10);hour_unit=1;set_hour=0;hour_flag1=1;break;
case(22):key_backvalue=0x00;hour=hour%10;     hour_unit=1;set_hour=0;limit=1;hour_flag1=1;break;
}
}
if(hour_unit&&(limit==0))
{
scan();
switch(key_backvalue)
{
case(22):key_backvalue=0x00;   hour=hour/10*10;hour_flag2=1;break;
case(1):key_backvalue=0x00;    hour=(hour/10*10+1);hour_flag2=1;break;
case(2):key_backvalue=0x00;        hour=(hour/10*10+2);hour_flag2=1;break;
case(3):key_backvalue=0x00;        hour=(hour/10*10+3);hour_flag2=1;break;
case(4):key_backvalue=0x00;        hour=(hour/10*10+4);hour_flag2=1;break;
}
scan();
if(key_backvalue==21)
{
backspace();
}
}
if(hour_unit&&limit)
{
scan();
switch(key_backvalue)
{
  case(22):key_backvalue=0x00;   hour=hour/10*10;hour_unit=0;limit=0;hour_flag2=1;break;
case(1):key_backvalue=0x00;    hour=(hour/10*10+1);limit=0;hour_flag2=1;break;
case(2):key_backvalue=0x00;        hour=(hour/10*10+2);limit=0;hour_flag2=1;break;
case(3):key_backvalue=0x00;        hour=(hour/10*10+3);limit=0;hour_flag2=1;break;
case(4):key_backvalue=0x00;        hour=(hour/10*10+4);limit=0;hour_flag2=1;break;
case(5):key_backvalue=0x00;        hour=(hour/10*10+5);limit=0;hour_flag2=1;break;
case(6):key_backvalue=0x00;        hour=(hour/10*10+6);limit=0;hour_flag2=1;break;
case(7):key_backvalue=0x00;        hour=(hour/10*10+7);limit=0;hour_flag2=1;break;
case(8):key_backvalue=0x00;        hour=(hour/10*10+8);limit=0;hour_flag2=1;break;
case(9):key_backvalue=0x00;        hour=(hour/10*10+9);limit=0;hour_flag2=1;break;
}
scan();
if(key_backvalue==21)
{
backspace();
}
}
if(set_min==1)                        //设置分
{
scan();
switch(key_backvalue)
{
case(22):key_backvalue=0x00;min=min%10;min_unit=1;set_min=0;break;
case(1):key_backvalue=0x00; min=(min%10+10);min_unit=1;set_min=0;min_flag1=1;break;
case(2):key_backvalue=0x00; min=(min%10+20);min_unit=1;set_min=0;min_flag1=1;break;
case(3):key_backvalue=0x00; min=(min%10+30);min_unit=1;set_min=0;min_flag1=1;break;
case(4):key_backvalue=0x00; min=(min%10+40);min_unit=1;set_min=0;min_flag1=1;break;
case(5):key_backvalue=0x00; min=(min%10+50);min_unit=1;set_min=0;min_flag1=1;break;
}
scan();
if(key_backvalue==21)
{
backspace();
}
}
if(min_unit)
{
scan();
switch(key_backvalue)
{
case(22):key_backvalue=0x00; min=min/10*10;min_flag2=1;break;
case(1):key_backvalue=0x00;  min=(min/10*10+1);min_flag2=1;break;
case(2):key_backvalue=0x00;         min=(min/10*10+2);min_flag2=1;break;
case(3):key_backvalue=0x00;         min=(min/10*10+3);min_flag2=1;break;
case(4):key_backvalue=0x00;         min=(min/10*10+4);min_flag2=1;break;
case(5):key_backvalue=0x00;         min=(min/10*10+5);min_flag2=1;break;
case(6):key_backvalue=0x00;         min=(min/10*10+6);min_flag2=1;break;
case(7):key_backvalue=0x00;         min=(min/10*10+7);min_flag2=1;break;
case(8):key_backvalue=0x00;         min=(min/10*10+8);min_flag2=1;break;
case(9):key_backvalue=0x00;         min=(min/10*10+9);min_flag2=1;break;
}
}
scan();
if(key_backvalue==21)
{
backspace();
}
}
}
}


void Timer0() interrupt 3
{
        static u16 i;
        unsigned char o=0;
        TH1=0XFC;        //给定时器赋初值,定时1ms
        TL1=0X18;
        i++;
        if(i==1000)
        {
        i=0;
        sec++;
        if(sec>59)
        {
        sec=0;min++;
        if(min>59)
        {
        min=0;hour++;
         if(hour>23)
         {
         hour=0;
         }
        }
        }               
        }
        }        


void DigDisplay()interrupt 1
{
     u8 i;
         static u16 o;
        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0X18;
        o++;
        if(o==15)
        {
        datapros();
        for(i=0;i<8;i++)
        {
        if(set_hour&&i==7)continue;
        if(hour_unit&&i==6)continue;
        if(set_min&&i==4)continue;
        if(min_unit&&i==3)continue;
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位        
                }
               
                P0=DisplayData[7-i];//发送数据
                delay(100); //间隔一段时间扫描        
                P0=0x00;//消隐
        }
        }
         if(o==30)
         {
         o=0;
                for(i=0;i<8;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位        
                }
               
                P0=DisplayData[7-i];//发送数据
                delay(100); //间隔一段时间扫描        
                P0=0x00;//消隐
        }
        }               
}



#include"matrix_key.h"
unsigned char key_backvalue;


        void scan()
{
    unsigned int k=0;
        keynumber=0x0f;
        if(keynumber!=0x0f)
        {
        delay(1000);
        keynumber=0x0f;
        switch(keynumber)
        {
        case(0x07):key_backvalue=1;break;
        case(0x0b):key_backvalue=2;break;
        case(0x0d):key_backvalue=3;break;
        case(0x0e):key_backvalue=11;break;
        }
        keynumber=0xf0;
        switch(keynumber)
        {
        case(0x70):key_backvalue=key_backvalue;break;
        case(0xb0):key_backvalue=key_backvalue+3;break;
        case(0xd0):key_backvalue=key_backvalue+6;break;
        case(0xe0):key_backvalue=key_backvalue+20;break;
        }
        }
  while((k<50)&&(keynumber!=0xf0))
  {
   delay(200);
   k++;
  }
}




#ifndef __matrix_key_H_
#define __matrix_key_H_

#include<reg52.h>
#define keynumber P1
void delay(unsigned int i);
extern void scan();
#endif


纯手打,实现电子表的一般功能

回复

使用道具 举报

ID:596979 发表于 2019-8-7 17:42 | 显示全部楼层
用的普中的51开发板,按键左上角九个键是123456789,右边从上到下的功能依次是调整时,调整分,取消调整(恢复调整前的时间),开始设置。最后一行的功能分别是确认调整,数字0,无意义。制作不易,,
回复

使用道具 举报

ID:61950 发表于 2019-9-1 08:26 | 显示全部楼层
没有matrix_key.h头文件
回复

使用道具 举报

ID:298008 发表于 2022-5-7 08:07 | 显示全部楼层
有意思,看看先
回复

使用道具 举报

ID:472504 发表于 2022-5-16 09:11 | 显示全部楼层
这种没有流程图,没有函数,变量功能注释的代码看着累死。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表