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

📄 main.c

📁 在网站上找到的一个比较不错的字符叠加程序
💻 C
字号:
/*--------------------
  控制程序
---------------------*/
#include "avr/io.h"
#include "avr/interrupt.h"
#include "avr/signal.h"
#include "inttypes.h"
#include "avr/pgmspace.h"
#include "stdlib.h"
#include "string.h"
#include "ascii.h"

#define VS 0b00001000
#define CS PD2
#define OD_EV 0b00010000
#define DV PB4
#define HT 0b00001000
#define I2CRW PC2

static void avr_init(void);
void vstr_out(int index);
void write_screen(char *str);
void write_icon(uint8_t index);
void vicon_out(int index);


uint16_t linecount;//,cols,rows;


uint8_t  screen[20];
uint8_t	 vram_buf[2][20]={"Hello,World!~!@$^=","%(World)%"};

uint8_t screenbuf[20][16];

void SPI_MasterInit(void)
{
/* 设置MOSI 和SCK 为输出,其他为输入 */
//DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
	DDRB = (1<<PB5)|(1<<PB7);
/* 使能SPI 主机模式,设置时钟速率为fck/16 */
SPCR = (1<<SPE)|(1<<MSTR);
SPSR = (1<<SPI2X);
}
//void SPI_MasterTransmit(char cData)
//{
/* 启动数据传输 */
//SPDR = cData;
/* 等待传输结束 */
//while(!(SPSR & (1<<SPIF)))
//;
//}
	
INTERRUPT(SIG_INTERRUPT0)
{ 
  if((PIND&VS)!=VS)    //vs is low
//    if((PIND&OD_EV)==OD_EV)
//		linecount=1;	//odd field linecount counter from 1
//	else
		linecount=0;	//even field linecount counter from 0
  else
	linecount+=1;

    //generate display data
   if((linecount>=100) && (linecount<116))
	{
		TCCR0=0x01;		//none pre divide-frequence and start timer0
		TIMSK=(1<<TOIE0);	//enable timer0's interrupt
		vstr_out((linecount-100)/1);
		
	}
	
/*	if((linecount>=120) && (linecount<152))
	{	
		vicon_out((linecount-120)>>1);
		TCCR0=0x01;		//none pre divide-frequence and start timer0
		TIMSK=(1<<TOIE0);	//enable timer0's interrupt
	}
*/	

}

INTERRUPT(SIG_OVERFLOW0)
{
   //uint8_t i;
 //  uint8_t code;
   TCCR0=0x00;  //disable timer0
   TCNT0=0x4D;    //delay 11.5us 11.2us=0x4D
 
   //display on screen
   asm("push r18"::);
  // for(i=0;i<20;i++)
   {
		SPDR = screen[0];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");
	//	asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[1];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");
	//	asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[2];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");
	//	asm("nop");
		asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[3];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[4];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");
	//	asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[5];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");
	//	asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[6];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");
	//	asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[7];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");
	//	asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[8];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");
	//	asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[9];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[10];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop"); 
		//while(!(SPSR & (1<<SPIF)));
		SPDR = screen[11];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop"); 
	//	while(!(SPSR & (1<<SPIF)));
	/*	SPDR = screen[12];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");*/
	//	while(!(SPSR & (1<<SPIF)));
	//	SPDR = screen[13];
	/*	asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");*/
	//	while(!(SPSR & (1<<SPIF)));
	/*	SPDR = screen[14];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	while(!(SPSR & (1<<SPIF)));
		SPDR = screen[15];
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	//	asm("nop");*/
	//	while(!(SPSR & (1<<SPIF)));

		
	}
//	PORTB|=(1<<PB4);
	asm("pop r18"::);
}

int main(void)
{
   uint16_t i=0,t=0; 
   avr_init();   

   while(1)
   {
   	  if(linecount==0)
	  //	write_icon(t);
   	  i++;
	  if(i>65530) 
	  { 
	  	i=0;
		t+=2;
		if(t>=10) t=0;}
	
   };//PORTB=~PORTB;     
}
void write_icon(uint8_t index)
{
	int k,i;
	for(k=0;k<20;k++)
		for(i=0;i<16;i++)
			screenbuf[k][i]=0x00;
	for(i=0;i<16;i++)
	{
		screenbuf[0][i]=~pgm_read_byte(&nBatteryDot[index*16+i]);
		screenbuf[1][i]=~pgm_read_byte(&nBatteryDot[(index+1)*16+i]);
	}
}
void vicon_out(int index)
{
	screen[0]=screenbuf[2][index];
	screen[1]=screenbuf[3][index];
}
void write_screen(char *str)
{
	int k,i;
//	for(k=0;k<20;k++)
//		for(i=0;i<16;i++)
//			screenbuf[k][i]=0xFF;
	for(k=0;k<12;k++)//str[k]!='\0';k++)
		for(i=0;i<16;i++)
			//screenbuf[k][i]=~pgm_read_byte(&nAsciiDot[(str[k]-0x20)*16+i]);
			screenbuf[k][i]=~pgm_read_byte(&nBatteryDot[(k+10)*16+i]);
}
//video string output
void vstr_out(int index)
{
   int k;
   for(k=0;k<12;k++)
		//screen[k]=~pgm_read_byte(&nAsciiDot[(str[k]-0x20)*16+index]);
		screen[k]=screenbuf[k][index];

}
static void avr_init(void)
{
    // Initialize device
   DDRA=0x00;   //data port
   PORTA=0x00;
   DDRB=0xF0;   //低四位做键盘上拉,第四位用于输出显示数据
   PORTB=0x1F;
   DDRC=0xF0;	//高四位做访问地址输出,第三位用于输入是否有目标,低三位为I2C接口
   PORTC=0x00;
   DDRD=0xE0;	/*高三位用于电子快门控制输出,
    接下来的三位用于行场同步及奇偶指示输入,
    低两位做串口*/
   PORTD=0x00;
   
   //load timer0 value
   TCNT0=0x4D;    //delay 11.5us 11.2us=0x4D
   TCCR0=0x00;    //timer0 stop

   GICR=(1<<INT0);  //enable external interrupt0
   MCUCR=((1<<ISC01)|(0<<ISC00)); //fall edge
   sei();  		  //enable global interrupt
   write_screen(vram_buf[1]); 
   SPI_MasterInit();
   return;
}


⌨️ 快捷键说明

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