?? 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 + -