📄 testboard.c
字号:
#include <pic.h>
#include <pic16630.h>
/**************端口定义**************
************************************/
#define cdc_clk RA0 //用户IO端口0
#define cdc_clk_T TRISA0
#define port1 RA1 //用户IO端口1
#define cdc_dat RA2 //用户IO端口2
#define cdc_dat_T TRISA2
#define port3 RA3 //用户输入端口
#define incsel RA4 //按键DEC
#define decent RA5 //按键INC
#define dis_clk RC0 //显示数据输出时钟
#define dis_data RC1 //显示数据输出端口
#define dis_rs RC2 //显示命令/数据选择
#define dis_en RC3 //显示使能控制
#define txd RC4 //URAT发送端
#define rxd RC5 //URAT接收端
#define buzz RC5 //蜂鸣器
/********特殊寄存器初始化参数********
************************************/
#define TRISA_CODE 0X3f
/* TRISA
5 4 3 2 1 0
I I I I I I
| | | | | |->用户端口0
| | | | |----->用户端口1
| | | |--------->用户端口2
| | |------------->用户输入端口2
| |----------------->按键输入1
|--------------------->按键输入2
*/
#define IOCA_CODE 0X00
#define TRISC_CODE 0X00
/* TRISC
5 4 3 2 1 0
O O 0 0 0 0
| | | | | |->显示时钟输出
| | | | |----->显示数据输出
| | | |--------->命令/数字选择
| | |------------->LCD EN使能
| |----------------->TXD
|--------------------->BUZZ(RXD)
*/
#define WPUA_CODE 0X35 //A口弱上拉
#define ANSEL_CODE 0X00 //A/D模拟/数字端口选择
/* ANSEL
7 6 5 4 3 2 1 0
| | | | | | | |->RA0
| | | | | | |----->RA1
| | | | | |--------->RA2
| | | | |------------->RA4
| | | |----------------->RC0
| | |--------------------->RC1
| |------------------------->RC2
|----------------------------->RC3
*/
#define OPTION_CODE 0X07
/* OPTION
7 6 5 4 3 2 1 0
| | | | | | | |->\
| | | | | | |------->T0前分频选择
| | | | | |--------->/
| | | | |------------->预分频使用选择(为0时T0使用)
| | | |----------------->T0记数边沿选择(0为上边沿触发)
| | |--------------------->T0计数来源选择(为1RA2输入)
| |------------------------->INT中断边沿选择(0为下降沿触发)
|----------------------------->A口弱上拉控制(为0打开)
*/
#define PIE1_CODE 0x00
/* PIE1
7 6 5 4 3 2 1 0
| | | | | | | |->TMR1IE定时器1中断控制
| | | | | | |----->
| | | | | |--------->
| | | | |------------->CMIE比较器中断控制
| | | |----------------->
| | |--------------------->
| |------------------------->ADIE模数变换中断控制
|----------------------------->EEIE内部EEROM中断控制
*/
#define ADCON1_CODE 0x00
//AD变换工作时钟选择,选择标准以转换时间>1.6uS为准,基准时钟是主振荡频率
#define VRCON_CODE 0x00
//比较器控制
#define PORTA_CODE 0X00
#define PORTC_CODE 0X00
#define INTCON_CODE 0X40
/* INTCON
7 6 5 4 3 2 1 0
| | | | | | | |->A口中断标志
| | | | | | |----->INT中断标志
| | | | | |--------->T0中断标志
| | | | |------------->A口变化中断允许
| | | |----------------->INT中断允许
| | |--------------------->T0中断允许
| |------------------------->外部中断总控制
|----------------------------->中断总控制
*/
#define T1CON_CODE 0X00
/* T1CON
7 6 5 4 3 2 1 0
| | | | | | | |->
| | | | | | |----->T1外部计数门控位(0开计数,1外部控制为0时计数)
| | | | | |--------->\
| | | | |--------------->前分频选择
| | | |----------------->LP外部时钟选择(1使能外部时钟)
| | |--------------------->外部时钟同步选择(0同步输入)
| |------------------------->时钟来源选择(0为内部时钟,1为RA5输入)
|----------------------------->计数控制位(1开始计数)
*/
#define ADCON0_CODE 0x00
/* ADCON0
7 6 5 4 3 2 1 0
| | | | | | | |->数据格式选择(为0数据靠高端)
| | | | | | |----->基准电压选择(为1由RA1提供)
| | | | | |--------->
| | | | |------------->\
| | | |------------------->通道选择
| | |--------------------->/
| |------------------------->AD变换启动位(为1启动,硬件清零)
|----------------------------->AD模块电源控制(为1开启)
*/
#define CMCON_CODE 0X07
//关闭比较器功能
/***************变量定义*************
************************************/
static volatile unsigned char discpsw0; //碟机状态
static volatile unsigned char discpsw1;
static volatile unsigned char discpsw2;
static volatile unsigned char discpsw3;
static volatile unsigned char discpsw4;
static volatile unsigned char discpsw5;
static volatile unsigned char discpsw6;
static volatile unsigned char discpsw7;
static volatile unsigned char softpsw;
/* softpsw
7 6 5 4 3 2 1 0
| | | | | | | |->数据读取标志(为1正在读取)
| | | | | | |----->数据准备好标志(为1准备好)
| | | | | |--------->显示标志
| | | | |------------->
| | | |----------------->
| | |--------------------->
| |------------------------->
|----------------------------->
*/
static volatile unsigned char nowdisc;
static volatile unsigned char nowtrackH;
static volatile unsigned char nowtrackL;
static volatile unsigned char nowminH;
static volatile unsigned char nowminL;
static volatile unsigned char nowsecH;
static volatile unsigned char nowsecL;
/******************************************
特殊寄存器设置函数;sfr_setup
作用:初始化内部特殊寄存器;
入口:无;
出口:无;
*******************************************/
void sfr_setup(void)
{
//BANK1
TRISA=TRISA_CODE;
TRISC=TRISC_CODE;
OPTION=OPTION_CODE;
PIE1=PIE1_CODE;
ANSEL=ANSEL_CODE;
ADCON1=ADCON1_CODE;
IOCA=IOCA_CODE;
WPUA=WPUA_CODE;
//BANK0
PORTA=PORTA_CODE;
PORTC=PORTC_CODE;
INTCON=INTCON_CODE;
T1CON=T1CON_CODE;
ADCON0=ADCON0_CODE;
CMCON=CMCON_CODE;
}
/************************************************************
总线空闲等待函数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
}
}
}
/************************************************************
延时函数D7uS()
作用:延时7uS
************************************************************/
void D7uS(void)
{
asm("nop");
asm("nop");
}
/************************************************************
总线空闲等待函数send_cdcdata()
作用:等待总线空闲
入口:无
出口:无
************************************************************/
void send_cdcdata(void)
{
unsigned char buffer[4];
unsigned char cnt1,cnt2,temp;
if(softpsw&0x02)
{
buffer[0]=(nowtrackH<<4)|nowtrackL;
buffer[1]=(nowminH<<4)|nowminL;
buffer[2]=(nowsecH<<4)|nowsecL;
buffer[3]=nowdisc;
//发送数据
cdc_dat=0;
cdc_dat_T=0; //发送握手信号
while(cdc_clk);
GIE=0;
while(!cdc_clk);
cdc_clk=1;
cdc_clk_T=0; //时钟为高
for(cnt1=0;cnt1<4;cnt1++)
{
temp=buffer[cnt1];
for(cnt2=8;cnt2>0;cnt2--)
{
D7uS();D7uS();D7uS();
if(temp&0x80)
{cdc_dat=1;}
else
{cdc_dat=0;}
cdc_clk=0;
D7uS();
temp<<=1;
cdc_clk=1;
}
}
cdc_dat_T=1;cdc_clk_T=1;softpsw&=0xFD;
waitfree();asm("movf _PORTA,w");RAIF=0;
GIE=1;
}
}
/******************************************
主循环程序main()
入口:无
出口:无
*******************************************/
main()
{
unsigned char count;
sfr_setup();
waitfree();
asm("movf _PORTA,w");RAIF=0;RAIE=1;IOCA1=1;
GIE=1;
while(1)
{
send_cdcdata();
}
}
/************************************************************
延时函数d7uS()
作用:延时7uS
************************************************************/
void d7uS(void)
{
asm("nop");
asm("nop");
}
//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(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
softpsw|=0x02;
}
else if(discpsw5==0x9b)
{nowdisc=discpsw4&0x0f;softpsw|=0x02;}
dataclear();
asm("movf _PORTA,w");RAIF=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -