📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
///////////////////////////////////////////////////////////////
//行同步中断输入捕捉1管脚.
//场同步中断IRQ
//Yn分别对应PORTMn
///////////////////////////////////////////////////////////////
#define SYNE_SETTING 4
#define REFDV_SEETTING 1 // PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1) busclk=32M
#define delay {_asm nop;}
#define M 81
#define N 61
unsigned char buff[N][M];
byte Tclk_ready;
byte one_sample;
//int cnt=0x00;
//int cnt_HREF=0x1;
void delayms()
{
byte i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++)
delay;delay;delay;
}
void init_CRG(byte para1,byte para2)
{
SYNR=para1;
REFDV=para2;
while(!CRGFLG_LOCK);
CLKSEL_PLLSEL=1;
}
void init_interupt()
{
// HPRIO = (unsigned char)(Virq & 0xff); //将IRQ优先级置为最高
// INTCR |= INTCR_IRQE_MASK;
INTCR_IRQE=1; //下降沿触发
INTCR_IRQEN=1; //场同步中断IRQ中断,初始化开启
TIOS=0x00; //行同步中断,外部输入捕捉0,1通道,初始化不开启
TCTL4=0x01; //通道0上升沿触发,通道1下降沿触发
TSCR2=0X01; //分频
TSCR1=0x80;
TIE=0X00; //初始化定时器关闭
}
void init_port()
{
DDRB=0XFF;
PORTB=0Xff;
DDRT_DDRT7=0; // 行信号
DDRA_BIT7=0; // 黑白信号 黑0 白1
PORTB_BIT0=0;
PORTB_BIT0=1;
PORTB_BIT1=0;
PORTB_BIT0=1;
PORTB_BIT1=0;
PORTB_BIT0=1;
DDRA=0X00;
// PUCR=0x03;
// DDRT=0x00; //shu ru shezhi
DDRH=0XFF; //输出设置
PTH=0x00;
PTH=0xff;
}
void init_sys(byte p1,byte p2)
{
init_CRG(p1,p2);
init_interupt();
init_port();
}
/*-------串口初始化----------------------*/
void SciInit()
{
SCI0BDL = (unsigned char)((80000000UL /* OSC freq */ / 2) / 19200 /* baud rate */ / 16 /*factor*/);
SCI0CR1=0; /*normal,no parity*/
SCI0CR2=0X2C; /*RIE=1,TE=1,RE=1*/
}
/*-------发射端程序-----单字节发送-----------------*/
void SciTx(unsigned char text)
{
unsigned char temp;
temp=SCI0SR1; /*clear flag*/
while (!(SCI0SR1&0x80)); /* wait for output buffer empty */
SCI0DRH=0;
SCI0DRL=text;
}
/*---------接受部分------------------------*/
char SciRx(void){
char temp;
char result;
temp=SCI0SR1; /*clear flag*/
while(!(SCI0SR1&0x20));
result=SCI0DRL;
return result;
}
void TestXianshi(void) {
byte i,j;
SciTx(0);
for(i=1;i<61;i++)
{
for(j=1;j<81;j++)
{
SciTx(j*3);
}
SciTx(0);
}
SciTx(0);
// SciTx(0);
}
void Send_piex(void)
{
byte i,j;
SciTx(0);
for(i=1;i<N;i++) //N=61
{ //传到上位机用GUI显示亮度,55 AA分别表示一个行的开始
// delayms();
// SciTx(0x55);
// delayms();
for(j=1;j<M;j++) //M=71
{
/* if (buff[i][j]<16)
{
buff[i][j]=1;
}
else if (buff[i][j]>100)
{
buff[i][j]= 255;
}
else
{
buff[i][j]=(255/84)*(buff[i][j]-16);
}
*/
if (buff[i][j]==128)
{
buff[i][j]=250;
}
if (buff[i][j]==0)
{
buff[i][j]=10;
}
SciTx(buff[i][j]);
// delayms();
}
SciTx(0);
}
SciTx(0);
}
void main(void)
{
DisableInterrupts;
one_sample=1;
init_sys(SYNE_SETTING,REFDV_SEETTING);
SciInit();
EnableInterrupts;
// unsigned char aa[10]="123456789";
// SciTx('a');
// TestXianshi();
for(;;)
{
if(one_sample==2)
{
Send_piex();
one_sample=3;
}
}
}
void interrupt 8 Port0_interrupt(void)
{
unsigned char i;
static int cnt=0x00;
static byte cnt_HREF=0x1;
// byte test;
TFLG1=0x01; //清除行中断标志
TIE=0X00;
cnt++;
// DDRT=0x00; //
if(cnt>5)
{
cnt=1;
cnt_HREF++; //记录行中断次数,限定60行
}
i=0;
if(cnt==5)
{
while(PTT_PTT0)
{
buff[cnt_HREF][++i]=PORTA;//读全口 速度比读位快
// test=PTT_PTT1;
// i++;
// PTH=0X01;
}
// PTH=0X00;
}
if(cnt_HREF>47)
{
cnt_HREF=0;
TIE=0X00;
one_sample=2;
INTCR_IRQEN=1;
}
else
{
TIE=0X01;
}
}
/***************************场中断处理******************************************/ //场中断
void interrupt 6 IRQ_interrupt(void)
{
static byte m=0;
if (m==0)
{
TIE=0X01; //开行中断 /////
// INTCR_IRQEN=0; //关场中断使能
PORTB^=0XFF;
m=1;
}
else TIE=0X00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -