📄 disp.c
字号:
///////////////////////////////////////////////////////////////////////
//文件名:disp.c
//功能描述:定时器0中断处理函数、显示任务等
////////////////////////////////////////////////////////////////////////
#include "reg52.h"
#include "disp.h"
#include "dianji.h"
#include "INTRINS.H"
#define uchar unsigned char
#define uint unsigned int
TIME time; //记录系统时间的全局变量
//共阴极数码管显示数据0~9
uchar code led_data[32]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //0~7
0x7f,0x6f,0x077,0x7c,0x39,0x5e,0x79,0x71, //8,9,A,b,C,d,E,F
0x76,0x0e,0x38,0x37,0x73,0x67,0x31,0x3e, //H,J,L,n,P,q,r,U,
0x6e,0x00}; //y,全灭
data uchar led[4]; //数码管显示缓冲区
//leds_1和leds_2的低两位为10个LED发光二极管显示缓冲区,
//leds_2的高五位记录LED_1~~LED_5五个发光二极管闪烁属性,
//若为1则响应的二极管闪烁
bdata uchar leds_1,leds_2;
sbit LED_DC=leds_1^0; //P2.0
sbit LED_HZ=leds_1^1; //P2.1
sbit LED_ZZ=leds_1^2;
sbit LED_SHOUDONG=leds_1^3;
sbit LED_ZIDONG=leds_1^4;
sbit LED_ZOUSHUZI=leds_1^5;
sbit LED_RECORD=leds_1^6;
sbit LED_FEN=leds_1^7; //P2.7
sbit LED_YZ=leds_2^0; //P0.0
sbit LED_QZ=leds_2^1; //P0.1
sbit LED_YZZZ=P0^0; //有两个LED复用P0口
sbit LED_QZZZ=P0^1;
sbit SSLED_SHOUDONG=leds_2^3;
sbit SSLED_ZIDONG=leds_2^4;
sbit SSLED_ZOUSHUZI=leds_2^5;
sbit SSLED_RECORD=leds_2^6;
sbit SSLED_FEN=leds_2^7;
sbit clk273=P0^2; //数码管段码锁存器锁存控制端
sbit clk164=P0^1; //数码管位选通移位寄存器移位控制端
sbit aaa=P0^0; //数码管位选通移位寄存器数据输入端
sbit led_sel=P1^2; //LED发光二极管选通端
sbit SPEAK=P0^3; //蜂鸣器控制端 0:开 1:关
data uchar disp_mode;
data uchar n_beep;//蜂鸣器响的声数
void beep2(void);
/*************************************************************
该函数负责数码管显示,LED发光二极管显示
由定时器0中断处理函数调用
***************************************************************/
void led_disp(void)
{
static uchar count; //记录正在显示的是第几个数码管
static uchar n;
static bit flag_ss; //处理闪烁属性
data uchar temp;
data uint li_cheng; //暂存里程值
led_sel=1; //熄灭LED发光二极管
if(!--n)
{
n=125;
flag_ss=!flag_ss;
}
count++;
count&=0x03;
switch(disp_mode)
{
case MODE_TIME: //数码管显示时间模式
switch(count)
{
case 0:
led[0]=(time.t_min/10)%10;
break;
case 1:
led[1]=time.t_min%10;
led[1]|=LED_DP;
break;
case 2:
led[2]=(time.t_sec/10)%6;
break;
case 3:
led[3]=time.t_sec%10;
break;
default:
break;
}
break;
case MODE_LICHENG: //数码管显示里程模式
li_cheng=getlichenglimi();
switch(count)
{
case 0:
led[0]=(li_cheng/1000)%10;
break;
case 1:
led[1]=(li_cheng/100)%10;
break;
case 2:
led[2]=(li_cheng/10)%10;
break;
case 3:
led[3]=li_cheng%10;
break;
default:
break;
}
break;
case MODE_USER:
break;
}
temp=led_data[led[count]&0x1f]; //得到本次将显示的数码管的段码数据
temp|=(led[count]&LED_DP); //小数点属性
if(!count)aaa=0;
else aaa=1;
clk164=0;
P2=0; //消除重影
led_sel=1;
clk273=0;
clk273=1;
clk164=1; //选通下一个数码管
if(!((led[count]&LED_SHANSHUO)&&flag_ss))
{
clk273=0;
P2=temp; //锁存段码
clk273=1;
}
//显示LED发光二极管,包括闪烁的处理
if(flag_ss)
{
P2=(~leds_1)|(leds_1&(leds_2|0x07));
LED_QZZZ=1;
LED_YZZZ=1;
led_sel=0;
}
else
{
P2=~leds_1;
LED_QZZZ=!LED_QZ;
LED_YZZZ=!LED_YZ;
led_sel=0;
}
}
/*************************************************************
定时器0中断处理函数
产生时钟节拍
负责维护一个系统时间变量和任务调度
***********************************************************/
void timer0(void) interrupt 1
{
TH0=(65536-TIME_OVERLOAD)/256;
TL0=(65536-TIME_OVERLOAD)%256;
time.t_ms+=4;
if(time.t_ms>99)
{
time.t_ms=0;
if(++time.t_100ms>9)
{
time.t_100ms=0;
if(++time.t_sec>59)
{
time.t_sec=0;
time.t_min++;
}
}
}
if((n_beep)&&(!(time.t_ms%52)))beep2();
led_disp();
if(!(time.t_ms&0x0f))dianji(); //调用电机驱动程序
if(!(time.t_ms&0x1f))licheng();
if(!(time.t_ms&0x0f))gw_dianji(); //每16ms调用一次前轮转向电机驱动函数
}
/*************************************************************
定时器0初始化函数
*************************************************************/
void init_timer0(void)
{
TMOD=0x01;
TH0=(65536-TIME_OVERLOAD)/256;
TL0=(65536-TIME_OVERLOAD)%256;
ET0=1;
EA=1;
TR0=1;
}
//////////////////////////////////////////////////////////////////
//系统时间复位
void resettime(void)
{
EA=0;
time.t_ms=0;
time.t_100ms=0;
time.t_sec=0;
time.t_min=0;
EA=1;
}
///////////////////////////////////////////////////////////////////
//取系统时间,返回毫秒数
unsigned long gettime(void)
{
data unsigned long temp;
EA=0;
temp=time.t_min*60000+time.t_sec*1000+time.t_100ms*100+time.t_ms;
EA=1;
return temp;
}
//////////////////////////////////////////////////////////////////////
//延时函数
void delay_ms(uint n)
{
data uchar i;
for(;n>0;n--)
{
for(i=200;i>0;i--)
{
_nop_(); //内联函数,对应一条汇编指令NOP
_nop_();
_nop_();
}
}
}
///////////////////////////////////////////////////////////////////////
//设置蜂鸣器响n声
void beep(uchar n)
{
n_beep=n;
}
//////////////////////////////////////////////////////////////////////
//缝鸣器发声任务
void beep2(void)
{
static bit flag_beep=1;
if(flag_beep)
{
SPEAK=0;
}
else
{
SPEAK=1;
n_beep--;
}
flag_beep=!flag_beep;
}
/************************************************************
设置数码管显示模式
mode=MODE_TIME 显示时间 格式:分.秒
mode=MODE_LICHENG 显示里程 格式:XXX.X 单位:米
mode=MODE_USER 显示内容由用户指定
*************************************************************/
void setdispmode(uchar mode)
{
disp_mode=mode;
}
///////////////////////////////////////////////////////////////
//取得显示模式
uchar getdispmode(void)
{
return disp_mode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -