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

📄 display_board2.1.c

📁 一个LED特效显示程序
💻 C
字号:
/*器件:AVR ATMEGA16、373缩存器、62256K扩展RAM
I/O定义:
SPI接口显示键盘:
         PB0:    键盘	  
         PB1:    RCK
		 PB2:    SCK
		 PB3:    DATA
SPI屏幕接口:
         PC7:    DATA
		 PD3:    SCK
		 PD4:    RCK
RAM:	
         PA0~7:  PC0~7   A0~A15地址线
		 PC0~6:  DATA总线复用
		 PD7:    ALE
		 PD6:    WE
		 PD5:    RE
下载:		   
		 PB4~7:  SPI通讯和下载端口
         PD0~1:  UART通讯口
电机:
		 PD2:  外中断,电机脉冲
*/

/********************************************************
    广告屏程序第二次改版----主显示控制模块程序2.0
               
			   1、程序采用模块化构架,提高了可读性
               2、此程序支持第二套广告屏硬件
               3、创建时间:2004年11月23日
			   4、作者:西南科技大学 电子设计大赛第8大组
               注意:需要包括 :<disp_key.h>
							   
********************************************************/



/***************************************************
            头文件申明
****************************************************/

#include<iom16v.h>
#include <macros.h>
#include "disp_key.h"
#include "flash_M16.h"
/************************************************
            宏定义
**************************************************/
//RAM
#define ALE  7                   //定义锁存脚
#define WE   6                   //定义写允许位
#define RE   5                   //定义读允许位


#pragma interrupt_handler exi_int0:2   	//外部中断
#pragma interrupt_handler timer1_vof:9   	//定时器1中断
#pragma  interrupt_handler usart_rcx:12   //USART接受中断
/************************************************
            全局变量申明
**************************************************/
//基本全局变量
int sys_cont =0;
//显示缓冲区
char DispTemp[8];
char Head[3];
//按键处理

//数脉冲
int PDataY =0;
int PDataYMax =154;
int PDataYMin =4;

//UART接收数据
char FileEnd =1;
char HeadLoad =0;
char HeadEN =1;
int  DataIndex =0;
int  FileLength =0;
unsigned int time_out_ms=1; 		 //接收数据时限
unsigned char time_out_s=0; 		 //试图通讯重新时限

//特效处理
char DispModel =0;
int  ModelDelayTime =0;
char ModelContJuge=0;
/************************************************
             函数申明
**************************************************/
//基本初始化
void port_int(void);
void timer_int(void);
void uart_int(void);
void device_int(void);

//按键显示事件处理
void Display_event(void);        //显示事件
void KEY_event(void);            //按键事件处理

//特效处理
void Disp_Model(void);           //屏幕显示特效模式

//外部RAM读写操作
void data_store(char data);
char RAM_Read(int adress);
void RAM_Write(int adress,char data);

//显示屏数据发送
void Screen_send(void);
void SPI_data_send(unsigned char send_data);

//UART收发数据
void uart_TX(unsigned char data);    
void uart_time_out(void);

//中断函数
void exi_int0(void);
void timer1_vof(void);
void usart_rcx(void);
/*************************************************
*             子函数区                           *
*                                                *
*************************************************/

/****************************************
          端口定义
****************************************/
void port_int(void)
{
     DDRA =0XFF;
	 PORTA =0XFF;
	 DDRB =0B00001110;
	 PORTB =0XFF;
	 DDRC =0XFF;
	 PORTC =0XFF;
	 DDRD  = 0xF8;	        //
 	 PORTD = 0XFF;
}

/****************************************
          定时器
****************************************/
void timer_int(void)
{ 
     TCCR1B = 0x00; //stop
 	 TCNT1H = 0xd4; //setup
 	 TCNT1L = 0xce;
 	 TCCR1A = 0x00;
 	 TCCR1B = 0x01; //start Timer
     TIMSK = 0x04;

}

/****************************************
          外中断
****************************************/
void exit_int(void)
{
     GICR  = 0x40; 
  	 MCUCR = 0x02;

}

/****************************************
          串口通讯
****************************************/
void uart_int(void)
{
      UCSRB = 0x00; //disable while setting baud rate
      UCSRA = 0x00;
      UCSRC = 0x00;
      UBRR =5;      //设置波特率115200
      UCSRB = 0x98; //接受中断允许,接受允许,发送允许
      UCSRC = 0xBc; //8BIT, 奇校验,2停止位
}

/****************************************
          器件初始化函数
****************************************/
void device_int(void)
{
     CLI();
   	 port_int();
   	 timer_int();
   	 exit_int();
   	 uart_int();
	 SEI(); 
}

/****************************************
          串口收发数据
****************************************/
void uart_TX(unsigned char data)
{
    UCSRA |=0X40;         //标志清零
	UDR =data;
}
//***************
//传输超时处理,当time_out_ms大于设定值的时候,等待等待20S,并且
//一直发送标志符号,超过20S以后,进行错误处理	 
void uart_time_out(void)
{
	 time_out_ms++;
	 if (HeadEN ==0 && FileEnd ==0 && time_out_ms >=800 )
	 {
		if(sys_cont ==0)		 //秒记时 
		{
		   time_out_s++;
		   if (time_out_s ==20)	 //结束标志
		   {
			  time_out_ms=1;	 //闲置标志
			  HeadEN=1;
			  FileEnd=1;
			  //进行错误处理,并要跳出此结构体
			  {/**********/}
		   }
		}
		uart_TX(0xAA);			 //重复发送标志位
		time_out_ms--;   
	 }
	 if (time_out_ms ==1000)
	 	time_out_ms=1;	   	 //1 表示空闲状态
}
/***************************************************
               向显示屏送数据
***************************************************/

void SPI_data_send(unsigned char send_data)       //向595送数据串
{  
   unsigned char count;
   for(count =0;count<8;count++)
   {
      if(((send_data<<count)&0x80 )==0)
	     PORTC &= 0b01111111;      	   			   //送 data
      else
	     PORTC |= 0b10000000;
	  PORTD |=0b00001000;        				   //送SCK信号
      PORTD &=0b11110111;
   }
}
void Screen_send(void)
{
    char i;
	PORTD &= 0b11101111;       //送RCK信号,底电平                
	for(i =0;i <8;i++)
	{
	    SPI_data_send(0xff);//sys_cont);   //DispTemp[i]);  
    }
	PORTD |= 0b00010000;       //关闭RCK信号,高电平

}
/**************************************************
			 数据接受,外部RAM读写
****************************************************/
//写外部RAM
void RAM_Write(int adress,char data)
{
   PORTD |=0B11100000;           //关ALE  读关闭  写关闭
   DDRA =0XFF;
   PORTA =adress&0xff;
   PORTC =(adress >>8)&0xff;
   PORTD &=0b01111111;                         
   PORTA =data;
   PORTD &=0b10111111;
   //PORTD |=0B01100000;           //关ALE  读关闭  写关闭
}
//读外部RAM
char RAM_Read(int adress)
{
   char temp;
   PORTD |=0B11100000;           //关ALE  读关闭  写关闭
   DDRA =0XFF;
   PORTA =adress&0xff;
   PORTC =(adress >>8)&0xff;
   PORTD &=0b01111111;                         
   PORTD &=0b11011111;
   DDRA =0;
   PORTA =0XFF;
   temp =PINA;
   return temp;
}
//存储数据到外部RAM

void data_store(char data)
{
   if((data ==76) &&(FileEnd ==1))     //数据起始位检测
   {
       HeadEN =1;                           //开启头文件数据传输
	   HeadLoad =0;                         //头文件指针清零
	   DataIndex =0;                        //存储数据指针清零
   }
   if((HeadEN ==0) &&(FileEnd ==0))
   {
	   RAM_Write(DataIndex,data);            //数组送数
	   DataIndex++;
	   if(DataIndex <2)                      //送文件长度数据到变量
	   {
	       //FileLength |=data <<DataIndex;    
	       FileLength =316;
	   }                                     //数据指针
	   if((DataIndex >=FileLength)&& (DataIndex >16))
	   {
		   HeadEN =1;
		   FileEnd =1;
	   }
   }
   if(HeadEN ==1)                            //循环检测文件起始标志
   {
      Head[HeadLoad] =data;
      HeadLoad++;
	  if(HeadLoad ==3)
	  { 
	     if((Head[0] ==76) && (Head[1] ==69) &&(Head[2] ==68))//文件起始表示吻合
		 {
		     HeadEN =0;
			 FileEnd =0;
		 }
      }
   }
}
/**************************************************

			 显示效果处理	 
			 
****************************************************/
void Disp_Model(void)
{   
    unsigned int file_length =0;
	int PFileMax;
	//DispModel =RAM_Read(2) & (RAM_Read(3)<<8); 			 //model控制字节
	//PFileMax =(RAM_Read(0) & RAM_Read(1)<<8)>>3;	     //计算缓冲区域的最大列数
	if(ModelDelayTime ==0)
	{
	     switch(DispModel)
		 {
	        case 0:
		    {                //基本显示
			   PDataYMin =4;
		   	   PDataYMax =154;
			   break;
			}
			case 1:
		    {             	 //滚屏
			   PDataY++;
			   break;
		    }
			case 2:
		    {  	   	 		 //反向滚屏
			   PDataY--;
			   break;
		    }
			case 3:
		    {  
			   break;
		    }
			case 4:
		    {                //覆盖模式
			   if(ModelContJuge =1)
			   {
			       PDataYMax++;
			   	   PDataYMin++;
			   }
			   else
			   {
			       PDataYMax--;
			   	   PDataYMin--;
			   }
			   if(PDataYMax >PFileMax)
			   {   
				  ModelContJuge =0;
			   }
			   if(PDataYMax <PFileMax)
			   {   
				  ModelContJuge =1;
			   }
			   break;
		    }
			case 5:
		    {
			   break;      
	        }
		 }
	//ModelDelayTime =RAM_Read(4) & (RAM_Read(5)<<8);
	ModelDelayTime =400;
	}
}

/**************************************************

			  按键\显示事件处理区	 
			  
****************************************************/
void KEY_event(void)
{ /********* 添加按键处理代码 ***************/
    switch(key_num)
	{
	    case 0:
		{//And your code
		   //RAM_Write(0x0010,0xCF);
		   break;
		}
		case 1:
		{
		   //Disp_Buff[0] =RAM_Read(0x0010)&0xf;
		   //Disp_Buff[1] =RAM_Read(0x0010)>>4;
		   break;
		}
		case 2:
		{  
		   DispModel++;
		   if(DispModel >8)
		      DispModel =0;
		   break;
		}
		case 3:
		{
		   PORTD &=0b10111111;
		   break;
		}
		/*..................*/   
	}
}
// 显示事件添加
void Display_event(void)
{ /************* 添加显示 ***********************/
	 //Disp_Buff[1] =>>4;
	 //Disp_Buff[6] =head[2]&0x0f;
	 Disp_Buff[0] =DataIndex&0x0f;
	 Disp_Buff[1] =(DataIndex>>4)&0x0f;
	 Disp_Buff[2] =DataIndex>>8;
	 Disp_Buff[4] =PDataY&0x0f;
	 Disp_Buff[3] =DispModel;
	 Disp_Buff[6] =HeadEN;
	 Disp_Buff[7] =FileEnd;
	 
}

/******************* 结束 ***********************************/
/**********     主函数区  *****************************/
void main(void)
{
    char temp;
	device_int();
	while(1)
	{
	    ;
	}      
}
         
/************  中断函数区   *************************/

/************************************
             外中断
		   数电机脉冲
*************************************/

void exi_int0(void)   
{    
	char i =0;
	int adress;
	adress =PDataY<<3;
	for(;i <8;i++)              
	{
 	   DispTemp[i] =RAM_Read(adress++);//地址偏移,取数到显示缓冲区
	}
	Screen_send();              //送显示屏幕数据
	PDataY++;
	if(PDataY == PDataYMax)      //数据定位
		PDataY =PDataYMin;	    
}

/*******************************************
              定时器中断
			系统主要时钟基准
********************************************/
void timer1_vof(void)
{   
     SEI();
     TCNT1H = 0xd4; //setup
 	 TCNT1L = 0xce;
	 
	 sys_cont++;             //系统调用时间变量
	 
	 if(sys_cont ==1000)
	     sys_cont =0;

	 if(key_delay >0)        //键盘去抖动延时变量
         key_delay--;
	 
	 if(delay_time_count >0)
         delay_time_count--; //ms延时用变量
	 
	 if(ModelDelayTime >0)   //模式切换时间
	     ModelDelayTime--;
	 
	 Disp_key_group();       //显示刷新,取键值到缓冲区
     Key_num();              //键值后期处理以及去抖函数
	 Disp_Model();           //屏幕显示特效模式
	 KEY_event();            //按键事件处理
	 Display_event();        //显示事件
	 Screen_send();

}

/*************************************
       USART 接受中断   
 ******************************/
void usart_rcx(void)
{
   unsigned char uart_data;
   uart_data =UDR;
   data_store(uart_data);
   uart_TX(0xAA);
   time_out_ms=0;
   time_out_s=0;
}
                        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -