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