📄 pic16f73.c
字号:
/***********************************************/
/* A11H 手控板程序 */
/***********************************************/
#include <pic16f7x.h>
#define UCHAR unsigned char
UCHAR KeySwapTask,nCurKeyValue,nPreKeyValue;
UCHAR temp1,temp2;
bit Sound_flag,KeyOff_flag,KeySendflag; //定义标志位;
void Delay_ms(UCHAR nTimeValue); //延时子程序;
char keyscan(); //扫描子程序;
char keyserve(); //按键识别服务子程序;
void Initial_USART(); //USART异步发送、接收初始化;
void tmint(); //定时器初始化;
/***********************************************/
/* 中断程序 */
/***********************************************/
void interrupt low_isr()
{
if(RCIF==1)
{
RCIF=0;
}
}
/***************************************************/
/* 主程序 */
/***************************************************/
main()
{
ADCON1=0x06; //PORTA端口设置为数字I/O;
TRISA=TRISA&0xc0; //RA5设置为输出状态;
TRISB=0xff;
RA5=0;
OPTION=0x8d; //INT下降沿中断,分频为1:32 分配给WDT;
asm("clrwdt");
POR=1;
BOR=1; //上电复位后置1,在掉电锁定复位后软件置1;
Initial_USART(); //USART异步发送、接收初始化;
tmint();
INTCON=0x00;
PIE1=0;
PIE2=0;
PIR1=0; //清中断标志;
PIR2=0; //清中断标志;
TMR1ON=1; //开启定时器1;
while(1)
{
asm("clrwdt");
if(TMR1IF==1)
{
TMR1IF=0;
TMR1H=0xB1;
TMR1L=0xE0; //定时时间为20ms ,晶振为4.000M;
switch(KeySwapTask)
{
case 0:
keyscan(); //扫描按键;
if(nCurKeyValue!=0) //检测按键是否按下;
KeySwapTask=1;
break;
case 1: //去抖延时20ms;
keyscan(); //重新扫描按键;
if(nCurKeyValue!=0) //检测按键是否按下;
{
KeySwapTask=2;
nPreKeyValue=nCurKeyValue;
KeyOff_flag=0; //有键按下标志;
KeySendflag=1; //发送键值标志位置1;
}
else KeySwapTask=0; //否则为干扰;
break;
case 2: //检测按键是否松开;
keyscan(); //重新扫描按键;
if(nCurKeyValue==0) //检测按键是否松开;
KeySwapTask=3;
break;
case 3: //松开延时20ms去抖动;
keyscan(); //重新扫描按键;
if(nCurKeyValue==0) //检测按键是否松开;
{
KeySwapTask=4;
Sound_flag=1;
KeyOff_flag=1; //建立发声与按键松开标志位;
if(Sound_flag)
RA5=1;
}
break;
case 4: //发声延时20ms;
KeySwapTask=0;
Sound_flag=0;
RA5=0; //停止发声;
break;
default: KeySwapTask=0;
break;
}
if(KeySendflag)
{
KeySendflag=0;
TXREG=nCurKeyValue; //发出一个字符;
TXEN=1; //启动发送允许;
while(1)
{
asm("clrwdt");
if(TXIF==1) break;
} //等待写入完成;
TXEN=0;
} //发送完成,准备送LCD显示键值功能;
}
}
}
char keyscan()
{
TRISB=0xff;
TRISC=TRISC&0xf0; //设置C端口低四位为输出;
PORTC=PORTC&0xf0; //低四位清0;
asm("nop");
asm("nop");
temp1=PORTB; //读B口;
if(temp1!=0xff) //判断B口是否有低电平出现,有则表示有键按下;
keyserve();
else nCurKeyValue=0;
return(nCurKeyValue);
}
char keyserve()
{
int i,j;
switch(temp1) //读出列码;
{
case 0xfe: j=1;
break;
case 0xfd: j=2;
break;
case 0xfb: j=3;
break;
case 0xf7: j=4;
break;
case 0xef: j=5;
break;
case 0xdf: j=6;
break;
case 0xbf: j=7;
break;
case 0x7f: j=8;
break;
}
TRISB=TRISB&0x00; //读出行码;
TRISC=TRISC|0x0f;
PORTB=temp1;
asm("nop");
asm("nop");
temp2=PORTC;
temp2=temp2&0x0f; //屏蔽掉高四位;
switch(temp2)
{
case 0x0e: i=0;
break;
case 0x0d: i=1;
break;
case 0x0b: i=2;
break;
case 0x07: i=3;
break;
}
nCurKeyValue=8*i+j; //赋予键码;
return(nCurKeyValue);
}
void Initial_USART() //USART异步发送,接收初始化;
{
TXSTA=0x04; //选择异步高速方式传输8位数据;
RCSTA=0x80; //允许串行口工作使能;
TRISC=TRISC|0x80; //PIC16F73:将RC7(RX)设置为输入方式;
TRISC=TRISC&0xbf; //RC6(TX)设置为输出;
SPBRG=25; //4M晶振,波特率9600;
TXIE=0; //禁止发送中断使能;
RCIE=0; //RCIE=0,接收不使能;
}
//延时--以1ms为单位--晶体振荡(4.0MHz)
void Delay_ms(UCHAR nTimeValue)
{
UCHAR i;
while(nTimeValue--)
{
for(i=0;i<50;i++)
{
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");
}
}
}
void tmint()
{
T1CON=0x00; //关闭TMR1定时器,预分频比1:1;
TMR1H=0xB1;
TMR1L=0xE0; //定时时间为20ms ,晶振为4.000M;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -