📄 testboard1.c
字号:
/******************************************
字符LCD命令写入函数writ_com
作用:向LCD写入命令字节;
入口:待传送的8位数据;
出口:无;
说明:一个字节的命令
*******************************************
void writ_com(unsigned char command)
{
dis_rs=0;
ttl74164(command);
dis_en=1;
dis_en=0;
d256uS();
}
/******************************************
字符LCD命令写入函数writ_com
作用:向LCD写入命令字节;
入口:待传送的8位数据;
出口:无;
说明:一个字节的命令
*******************************************
void writ_data(unsigned char data)
{
dis_rs=1;
ttl74164(data);
dis_en=1;
dis_en=0;
d256uS();
}
/******************************************
字符LCD初始化函数lcd_init
作用:软件上电初始化
入口:无
出口:无
******************************************
void lcd_init(void)
{
d10mS();d10mS();d10mS();d10mS();
writ_com(0x30);
d4mS();
dis_en=1;dis_en=0;d256uS();
dis_en=1;dis_en=0;d256uS();
writ_com(0x38);writ_com(0x01);
d4mS();
writ_com(0x06); writ_com(0x0c);
}
/******************************************
存储数据转换为显示数据disp_prodata()
作用:将十六进制转成ASCII码
入口:被转换数据
出口:转换后的数据
******************************************
unsigned char data_tab(unsigned char data)
{
unsigned char temp;
data&=0x0f;
switch(data)
{
case 0: temp='0';break;
case 1: temp='1';break;
case 2: temp='2';break;
case 3: temp='3';break;
case 4: temp='4';break;
case 5: temp='5';break;
case 6: temp='6';break;
case 7: temp='7';break;
case 8: temp='8';break;
case 9: temp='9';break;
case 10: temp='A';break;
case 11: temp='B';break;
case 12: temp='C';break;
case 13: temp='D';break;
case 14: temp='E';break;
case 15: temp='F';break;
}
return(temp);
}
/******************************************
显示刷新函数disp_one_row
作用:将数据送入到LCD中
入口:datapt->数据缓冲区首地址
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(RA2)
{
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");
}
/******************************************
主循环程序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);
waitfree();
asm("movf _PORTA,w");RAIF=0;RAIE=0;IOCA1=1;
GIE=1;INTE=1;
while(1)
{
;
/*
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;
}
*/
}
}
//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)
{
RA0=0;
//************t1控制
TMR1IE=0;TMR1ON=0;TMR1IF=0; //停止1
TMR1L=0x65;TMR1H=0xf0; //T1初值
softpsw|=0x01; //树数据读取标志
//************读取数据
d1mS(); //延时准备读数
shiftdata(); //调整数据队列
if(RA2)
{discpsw0|=0x01;}
else
{discpsw0&=0xfe;}
//************准备下一位
while(RA2);
TMR1ON=1; //运行T1
TMR1IE=1;
//************复位INT中断
INTF=0;
}
if(RAIE&&RAIF)
{
unsigned char temp;
if(RA0)
{
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);softpsw&=0xfd;RA0=0;break;
default: ;
}
}
/* if(RA2)
{
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;RAIE=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;}
}
else if(discpsw5==0x9b)
{nowdisc=discpsw4&0x0f;}
dataclear();RA0=1;
asm("movf _PORTA,w");RAIF=0;RAIE=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -