?? display.c
字號:
/****************************************Copyright (c)**************************************************/
/**
;** 西南科技大學計算機學院
;**
;** http://cs.swust.edu.cn
;**
;** 日期: 2004.10.15
;** 功能: 8段數碼管顯示程序,利用6個數碼管來同時顯示數據,提示信息,顯示原理:
;** 采用輪循掃描的方式,過高的掃描頻率會浪費CPU資源,過低的頻率會使人肉眼
;** 感到閃爍,一般頻率應設置為50HZ為佳。
;** 擴展: 采用掃描頻率來調節顯示亮度。利用定時器設置頻率
;** 本程序作用:交通燈指示,利用8段數碼管顯示時間,指示交通燈
;** 數碼管段碼:0------F 對應 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
;** 0x77,0x7c,0x39,0x5e,0x79,0x71 ,可采用查表實現
;** 硬件連接,連接數碼管顯示模塊中的兩組跳線,一組為8位數據線,一組為6位位選線,
;** 默認連接,數據:p00----p07,位選:P10----P15 ,數碼管共陰級,交通燈模塊中
;** 連接交通燈跳線和特種車輛開關跳線,
;**
;**
;**-------------.c文件
;**------------------------------------------------------------------------------------------------------*/
/**------------------------------------------------------------------------------------------------------*/
#include <AT89X52.H>
const char Discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
char displaycolum=0xfe;
unsigned char dislaycount=0;
unsigned char hour=0;
char minite=0;
char second=0;
char DIS[6];
void PrintSecond(void);
void PrintMinite(void);
void PrintHour(void);
void timer0_init(void);
void Display(void);
void Print(long int disdata);
void PortInit(void);
void TimeCount1(void);
unsigned char timecount=0;
void trafic(void);
char mainroad=1;
char switcher=1;
/***********************************************************************************
定時器0中斷服務函數
作 用: 添加服務函數,由定時器中斷統一調用
入口參數: 無
中斷向量: 1
***********************************************************************************/
void int_t0(void) interrupt 1
{
timecount++;
if(timecount==0xff)
{
TimeCount1();
}
Display();
TH0=0Xd8;
}
/***********************************************************************************
主函數
作 用: 程序入口
入口參數: 無
***********************************************************************************/
void main(void)
{
PortInit();
timer0_init();
Print(0x120000);
P3=0XFF;
while(1);
}
/***********************************************************************************
端口初始化函數
作 用: 設置上電后端口某些特殊狀態。
入口參數: 無
***********************************************************************************/
void PortInit(void)
{
P3=0x00;
}
/***********************************************************************************
定時器初始化函數
作 用: 初始化定時器,設置定時器中斷,定時長度,定時器工作方式
入口參數: 無
***********************************************************************************/
void timer0_init(void)
{
IE|=0X82;
TL0=0X00;
TH0=0X00;
TMOD=01;
TCON|=0X10;
}
/***********************************************************************************
顯示掃描函數
作 用: 掃描顯示的數碼管,通過位選進行選擇,調用它的頻率表征的顯示掃描的頻率
入口參數: 無
***********************************************************************************/
void Display(void)
{
P1=displaycolum;
P0=DIS[dislaycount];
dislaycount++;
displaycolum=(displaycolum<<1)|0x01;
if(dislaycount==6)
{
displaycolum=0xfe;
dislaycount=0;
}
}
/***********************************************************************************
數據顯示函數
作 用: 設置顯示的數據
入口參數: 顯示的具體數據,如Print(0x123456);
***********************************************************************************/
void Print(long int disdata)
{
char count;
for(count=0;count<6;count++)
{
DIS[5-count]=Discode[disdata&0x0f];
disdata=disdata>>4;
}
}
/***********************************************************************************
秒顯示函數
作 用: 將秒數顯示在數碼管相應位置
入口參數: 無,采用全局變量傳遞參數
***********************************************************************************/
void PrintSecond(void)
{
DIS[5]=Discode[second%10];
DIS[4]=Discode[second/10];
}
/***********************************************************************************
分顯示函數
作 用: 將分鐘數顯示在數碼管相應位置
入口參數: 無,采用全局變量傳遞參數
***********************************************************************************/
void PrintMinite(void)
{
DIS[3]=Discode[minite%10];
DIS[2]=Discode[minite/10];
}
/***********************************************************************************
小時顯示函數
作 用: 將小時數顯示在數碼管相應位置
入口參數: 無,采用全局變量傳遞參數
***********************************************************************************/
void PrintHour(void)
{
DIS[1]=Discode[hour%10];
DIS[0]=Discode[hour/10];
}
/***********************************************************************************
時間計算函數
作 用: 采用60進制計算時間,小時采用24進制計算
入口參數: 無
***********************************************************************************/
void TimeCount1(void)
{
P3&=0XBF;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
PrintHour();
}
PrintMinite();
}
PrintSecond();
trafic();
P3|=0X40;
}
/***********************************************************************************
交通燈控制函數
作 用: 以時間為參考依據,控制交通燈的亮滅
入口參數: 無
***********************************************************************************/
void trafic(void)
{
if((P2&0X40)==0)
{
P2|=0X19;
P2&=0XDB;//MAIN
P2^=0X02;//FLASH
}
else if((P2&0X80)==0)
{
P2|=0X24;
P2&=0XF6;//NO MAIN
P2^=0X10;
}
else
{//關閉黃
P2|=0X12;
if((second%10)<2)
{
P2|=0X3F;
if(switcher==0)
{
P2&=0XED;
switcher=1;
mainroad=1-mainroad;
}
else if(mainroad==1)
{
P2&=0XDB;//MAIN
switcher=0;
}
else if(mainroad==0)
{
P2&=0XF6;//NO MAIN
switcher=0;
}
}
}
}
/*********************************************************************************************************
Copyright for swust --- cs
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -