📄 复件 testboard.c
字号:
#include <pic.h>
#include <pic16630.h>
/**************端口定义**************
************************************/
#define port0 RA0 //用户IO端口0
#define port1 RA1 //用户IO端口1
#define port2 RA2 //用户IO端口2
#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 0X38
/* TRISA
5 4 3 2 1 0
I I I O O O
| | | | | |->用户端口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 0X30 //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 0X00
/* 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
//关闭比较器功能
/***************常数定义*************
************************************/
const unsigned char welcome_words[]="PICMCU software test";
const unsigned char type_words[]=" Ver 1.0 051210";
/******************************************
特殊寄存器设置函数;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;
}
/******************************************
LCD操作延时函数d256us();
作用:延时256uS;
入口:无;
出口:无;
说明:用于LCD的操作延时
*******************************************/
void d256uS(void)
{
unsigned char i;
for(i=83;i>0;i--);
}
/******************************************
延时函数d4ms();
作用:延时4ms
入口:无
出口:无
说明:用于LCD初始化
******************************************/
void d4mS(void)
{
unsigned int i;
for(i=443;i>0;i--);
}
/******************************************
延时函数d10ms();
作用:延时10ms
入口:无
出口:无
******************************************/
void d10mS(void)
{
unsigned int i;
for(i=909;i>0;i--);
}
/******************************************
串行移位寄存器操作函数ttl14164()
作用:传送8BIT数据到74hc164中
入口:待传送的8位数据;
出口:无;
说明:字节传送顺序为MSB->LSB
*******************************************/
void ttl74164(unsigned char data)
{
unsigned char temp,cnt;
temp=data;
for(cnt=8;cnt>0;cnt--)
{
if(temp&0x80)
dis_data=1;
else
dis_data=0;
temp=temp<<1;
dis_clk=0;
dis_clk=1;
}
dis_data=0;
}
/******************************************
字符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_welcome(void)
{
const unsigned char *pt;
unsigned char cnt;
writ_com(0x80);
pt=welcome_words;
for(cnt=20;cnt>0;cnt--)
{writ_data(*pt);pt++;}
writ_com(0xc0);
pt=type_words;
for(cnt=20;cnt>0;cnt--)
{writ_data(*pt);pt++;}
writ_com(0x0c); //开显示
}
/******************************************
主循环程序main()
入口:无
出口:无
*******************************************/
main()
{
unsigned char count;
sfr_setup();
buzz=1;
lcd_init();
disp_welcome();
d10mS();
buzz=0;
for(count=255;count>0;count--)
{d10mS();}
writ_com(0x01);
while(1)
{
}
}
/******************************************
中断处理函数inthandle()
作用:
入口:无;
出口:无;
*******************************************/
void interrupt inthandle(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -