⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 好东西 关于单片机的一些重要的代码本程序是操作系统中比较典型的线程同步算法中的哲学家进餐问题,为防止死锁,采取了两个条件(筷子空闲)同时满足时再允许进餐的办法来解决。期望与大家一起学习交流!
💻 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 + -