testboard_rec.c
来自「PIC MCU开发用的一个小工具,用于对某些外设芯片子程序的调试,有2个按键2x」· C语言 代码 · 共 684 行 · 第 1/2 页
C
684 行
cnt---->数据个数(不大于20,超出部分不显示)
row---->选择上下行(0上行显示,1下行显示)
出口:无
******************************************/
void disp_one_row(unsigned char *datapt,unsigned char cnt,unsigned char row)
{
unsigned char count;
if(row==0)
{writ_com(0x80);} //第一行显示地址设置
else
{writ_com(0xc0);} //第二行显示地址设置
//防止数据溢出
if(cnt>=20)
{cnt=20;count=0;}
else
{count=20-cnt;}
for(;cnt>0;cnt--)
{
writ_data(*datapt);
datapt++;
}
for(;count>0;count--)
{writ_data(' ');}
writ_com(0x0c); //开显示
}
/******************************************
显示刷新函数disp_welcome
作用:显示起画面
入口:无
出口:无
******************************************/
void disp_loge(const unsigned char *pt,unsigned char cnt,unsigned char par)
{
if(par==0)
{writ_com(0x80);}
else
{writ_com(0xc0);}
for(;cnt>0;cnt--)
{writ_data(*pt);pt++;}
writ_com(0x0c);
}
/******************************************
向指定位置写数据
作用:想指定位置写数
入口:写入数据data,写入位置addr(0~39)
出口:无
******************************************/
void disp_onedata(unsigned char data,unsigned char addr)
{
if(addr>19)
{addr-=20;addr+=0xc0;}
else
{;addr+=0x80;}
writ_com(addr);
writ_data(data);
}
/************************************************************
总线空闲等待函数waitfree()
作用:等待总线空闲
入口:无
出口:无
************************************************************/
void waitfree(void)
{
TMR1ON=0;
TMR1IF=0;
TMR1L=0x65;
TMR1H=0xf0;
TMR1ON=1; //运行T1
while(!TMR1IF)
{
if(RA1)
{
TMR1L=0x65;
TMR1H=0xf0;
TMR1ON=1; //运行T1
}
}
}
/************************************************************
延时函数d1mS()
作用:延时1mS
************************************************************/
void d1mS(void)
{
unsigned char cnt;
for(cnt=123;cnt>0;cnt--);
asm("nop");asm("nop");
}
/************************************************************
延时函数d7uS()
作用:延时7uS
************************************************************/
void d7uS(void)
{
asm("nop");
asm("nop");
}
/************************************************************
延时函数d17uS()
作用:延时17uS
************************************************************/
void d17uS(void)
{
asm("goto $+1");asm("goto $+1");
asm("goto $+1");asm("goto $+1");
asm("goto $+1");asm("goto $+1");
}
/************************************************************
延时函数d100uS()
作用:延时100uS
************************************************************/
void d100uS(void)
{
unsigned char cnt;
for(cnt=11;cnt>0;cnt--);
}
/******************************************
主循环程序main()
入口:无
出口:无
*******************************************/
main()
{
// unsigned char count;
sfr_setup();
/* buzz=1;
lcd_init();
disp_loge(welcome_words,20,0);
disp_loge(type_words,20,1);
d10mS();
buzz=0;
for(count=255;count>0;count--)
{d10mS();}
writ_com(0x01);
d4mS();
disp_loge(playpar,12,0);
disp_loge(playstate,13,1);
*/
TRISC5=1;
waitfree();
asm("movf _PORTA,w");RAIF=0;RAIE=1;IOCA1=1;
GIE=1;
while(1)
{
d4mS();
/* if(softpsw&0x02)
{
disp_onedata(data_tab(nowdisc),3);
disp_onedata(data_tab(nowminH),9);
writ_data(data_tab(nowminL));
disp_onedata(data_tab(nowsecH),12);
writ_data(data_tab(nowsecL));
disp_onedata(data_tab(nowtrackH),17);
writ_data(data_tab(nowtrackL));
if(playpsw&0x01)
{disp_onedata('S',36);writ_data('c');writ_data('a');writ_data('n');}
else
{disp_onedata(' ',36);writ_data(' ');writ_data(' ');writ_data(' ');}
if(playpsw&0x08)
{disp_onedata('R',36);writ_data('e');writ_data('p');
writ_data('A');}
else if(playpsw&0x04)
{disp_onedata('R',36);writ_data('e');writ_data('p');
writ_data('1');}
softpsw&=0xfd;
}
*/
}
}
/*********************************************************************************
双机通讯管理
*********************************************************************************/
/************************************************************
数据发送函数data_send()
作用:发送1字节数据
入口:待发送的数据
出口:无
************************************************************/
void data_send(unsigned char data)
{
unsigned char cnt;
GIE=0; //关闭总中断
SCB=0;
SCB_T=0; //获得总线控制权
d100uS(); //起始信号(低电平1mS)
for(cnt=8;cnt>0;cnt--)
{
SCB=1; //同步头信号
d7uS();
if(data&0x80)
SCB=1; //输出数据1
else
SCB=0; //输出数据0
d17uS();data<<=1;
SCB=0; //位结束信号
d7uS();
}
SCB=1;
SCB_T=1; //放弃总线控制权
INTF=0;
GIE=1; //开总中断
}
/************************************************************
数据接收函数data_rec()
作用:接收1字节数据
入口:待发送的数据
出口:接收到的一字节数据
************************************************************/
unsigned char data_rec(void)
{
unsigned char cnt,temp;
temp=0;
SCB_T=1;
for(cnt=8;cnt>0;cnt--)
{
while(SCB); //等待低电平
while(!SCB); //等待同步信号头
temp<<=1;
d17uS(); //延时到数据区
if(SCB) //读取数据
temp|=0x01;
else
temp&=0xfe;
}
return(temp);
}
//CDC状态数据移位
void shiftdata(void)
{
unsigned char temp;
temp=STATUS;
#asm
bcf _STATUS,6
bsf _STATUS,5
rlf _discpsw0,f
rlf _discpsw1,f
rlf _discpsw2,f
rlf _discpsw3,f
rlf _discpsw4,f
rlf _discpsw5,f
rlf _discpsw6,f
rlf _discpsw7,f
#endasm
STATUS=temp;
}
//数据清除
void dataclear(void)
{
discpsw0=0;discpsw1=0;discpsw2=0;
discpsw3=0;discpsw4=0;discpsw5=0;
discpsw6=0;discpsw7=0;
}
/******************************************
中断处理函数inthandle()
作用:
入口:无;
出口:无;
*******************************************/
void interrupt inthandle(void)
{
if(INTE&&INTF)
{
unsigned char temp;
temp=data_rec();
switch(temp)
{
case 0xf0: //数位1
data_send(nowdisc);break;
case 0xf1: //数位2
data_send(nowtrackH);break;
case 0xf2: //数位3
data_send(nowtrackL);break;
case 0xf3: //数位4
data_send(nowminH);break;
case 0xf4: //数位5
data_send(nowminL);break;
case 0xf5: //数位6
data_send(nowsecH);break;
case 0xf6: //数位7
data_send(nowsecL);INTE=0;break;
default: ;
}
//************复位INT中断
INTF=0;ready=0;
}
if(RAIE&&RAIF)
{
if(RA1)
{
TMR1IE=0;TMR1ON=0;TMR1IF=0; //停止1
TMR1L=0;TMR1H=0; //T1初值
TMR1ON=1; //运行T1
}
else
{
TMR1ON=0;
shiftdata(); //调整数据队列
if(TMR1H<0x04)
{discpsw0&=0xfe;}
else
{discpsw0|=0x01;}
TMR1IF=0;TMR1L=0x65;TMR1H=0xf0; //T1初值
TMR1ON=1;TMR1IE=1; //运行T1
}
asm("movf _PORTA,w");RAIF=0;
}
if(TMR1IE&&TMR1IF)
{
TMR1IE=0;TMR1ON=0;TMR1IF=0; //停止1
softpsw&=0xFE; //关数据读取标志
if(discpsw7==0x99)
{
nowtrackH=discpsw6&0x0f;
nowtrackL=discpsw5>>4; //Track
nowminH=discpsw4&0x0f;
nowminL=discpsw3>>4; //Min
nowsecH=discpsw3&0x0f;
nowsecL=discpsw2>>4; //sec
playpsw&=0xf3;
playpsw|=discpsw2&0x0c; //REP状态
if(discpsw1&0x80) //SCAN状态
{playpsw|=0x01;}
else
{playpsw&=0xfe;}
ready=1;INTE=1;
}
else if(discpsw5==0x9b)
{nowdisc=discpsw4&0x0f;ready=1;INTE=1;}
dataclear();//waitfree();
asm("movf _PORTA,w");RAIF=0;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?