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