//-------------------------------------------------------------------------------//
// LIXUE 电子工作室 //
// http://lixuediy.taobao.com //
// 版权所有 //
// EMAIL:[email protected] //
// Mobile:13109884800 //
// MCU: dsPIC33FJ128MC710 //
// Compiler: MAPLAB IDE V8.87 C30 V3.30 //
// File: LX-100PIN-UART.c //
// DATE: 2013-04-30 Version: 2.2 //
//-------------------------------------------------------------------------------//
//
//实验描述:使用串口助手发送数据,单片机接收并保存数据到 RxBuffer中,同时发出数据;
// LED、LCD 循环显示缓冲区内容
//
//波 特 率:9600 N 8 1
//
//注意事项:RS232 采用交叉线
#include "p33Fxxxx.h"
_FOSCSEL(FNOSC_FRC); //内部晶振 7.37MHZ
_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT);
_FWDT(FWDTEN_OFF); // Close Watch DOG
_FICD(ICS_PGD3); //使用调试端口3
#define SysLED _LATB5 //CPU LED
#define SPEKAK _LATD8 //蜂呜器
#define RELAY _LATD8 //继电器
#define Smg_a 0xFE //定义段码
#define Smg_b 0xFD
#define Smg_c 0xFB
#define Smg_d 0xF7
#define Smg_e 0xEF
#define Smg_f 0xDF
#define Smg_g 0xBF
#define Smg_dp 0x7F
#define Bmp0Map Smg_a & Smg_b & Smg_c & Smg_d & Smg_e & Smg_f
#define Bmp1Map Smg_b & Smg_c
#define Bmp2Map Smg_a & Smg_b & Smg_d & Smg_e & Smg_g
#define Bmp3Map Smg_a & Smg_b & Smg_c & Smg_d & Smg_g
#define Bmp4Map Smg_b & Smg_c & Smg_f & Smg_g
#define Bmp5Map Smg_a & Smg_c & Smg_d & Smg_f & Smg_g
#define Bmp6Map Smg_a & Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
#define Bmp7Map Smg_a & Smg_b & Smg_c
#define Bmp8Map Smg_a & Smg_b & Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
#define Bmp9Map Smg_a & Smg_b & Smg_c & Smg_d & Smg_f & Smg_g
#define BmpAMap Smg_a & Smg_b & Smg_c & Smg_e & Smg_f & Smg_g
#define BmpBMap Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
#define BmpCMap Smg_a & Smg_d & Smg_e & Smg_f
#define BmpDMap Smg_b & Smg_c & Smg_d & Smg_e & Smg_g
#define BmpEMap Smg_a & Smg_d & Smg_e & Smg_f & Smg_g
#define BmpFMap Smg_a & Smg_e & Smg_f & Smg_g
const unsigned char SegCode[] =
{
Bmp0Map,Bmp1Map,Bmp2Map,Bmp3Map,Bmp4Map,Bmp5Map,Bmp6Map,Bmp7Map,
Bmp8Map,Bmp9Map,BmpAMap,BmpBMap,BmpCMap,BmpDMap,BmpEMap,BmpFMap
};
unsigned char DpyNum[6] = {Smg_g,Smg_g,Smg_g,Smg_g,Smg_g,Smg_g}; //显示缓冲区
unsigned char RxBuffer[16] = {0,0,0,0}; //串口接收缓冲区
unsigned char RxCount = 0; //接收计数
void Delay_xmS(unsigned int i) //延时程序
{
unsigned int j;
for(;i>0;i--)
{
Nop();
for(j=0;j<255;j++)
{
Nop();
ClrWdt();
}
}
}
void UART1_Init(void)
{
U1MODEbits.STSEL = 0; // 1个停止位
U1MODEbits.PDSEL = 0; // N , 8, 1
U1MODEbits.ABAUD = 0; // 自动波特率禁止
U1MODEbits.RTSMD = 1; // 引脚处于单工模式
U1BRG = 23; // 内部FRC N 8 1 19200波特率 = 11, 9600波特率 = 23;
U1STAbits.UTXISEL1 = 1; // 发送一个字符后中断
U1STAbits.UTXISEL0 = 0;
U1STAbits.URXISEL1 = 0; // 接收一个字符后中断
U1STAbits.URXISEL0 = 0;
IEC0bits.U1RXIE = 1; // 允许接收中断
IEC0bits.U1TXIE = 1; // 允许发送中断
U1MODEbits.UARTEN = 1; // 允许发送
U1STAbits.UTXEN = 1; // 使能串口1
}
void __attribute__((__interrupt__,no_auto_psv))_U1RXInterrupt(void)
{
RxBuffer[RxCount] = U1RXREG; // 循环储存数据
U1TXREG = RxBuffer[RxCount]; // 发送 -> 接收到的数据
RxCount = (RxCount + 1)&0x0F; // 计数加 1
IFS0bits.U1RXIF = 0;
}
void __attribute__((__interrupt__,no_auto_psv))_U1TXInterrupt(void)
{
IFS0bits.U1TXIF = 0;
}
//---------------------------------------------------------------------------------
// TMR1初始化
//---------------------------------------------------------------------------------
void Init_Timer1(void)
{
T1CON = 0; //TMR1 复位
IFS0bits.T1IF = 0; //TMR1 清除标志位
IPC0bits.T1IP = 6; //TMR1 中断优先级6
IEC0bits.T1IE = 1; //TMR1 中断允许
TMR1= 0x0000; //TMR1 给定初值
PR1 = 0x0FFF; //TMR1 周期寄存器
T1CONbits.TON = 1; //TMR1 启动计数
}
//---------------------------------------------------------------------------------
// 数码管驱动
//---------------------------------------------------------------------------------
void SegDisplay(void)
{
static unsigned char step = 0; //片选扫描
LATB = LATB|0x3F00; //关闭片选
LATD = (LATD&0xFF00)|DpyNum[step]; //显示缓冲
switch(step) //使能片选
{
case 0: _LATB8 = 0;step = 1;break;
case 1: _LATB9 = 0;step = 2;break;
case 2: _LATB10 = 0;step = 3;break;
case 3: _LATB11 = 0;step = 4;break;
case 4: _LATB12 = 0;step = 5;break;
case 5: _LATB13 = 0;step = 0;break;
default:break;
}
}
//---------------------------------------------------------------------------------
// TMR1 中断函数
//---------------------------------------------------------------------------------
void __attribute__((interrupt,no_auto_psv)) _T1Interrupt( void )
{
IFS0bits.T1IF = 0; //清除标志
TMR1 = 0; //TMR1清零
SegDisplay(); //数码管扫描
}
int main(void)
{
unsigned char temp = 0; //临时变量
AD1PCFGL = 0xFFFF; //所有引脚为数字I/O
AD2PCFGL = 0xFFFF; //所有引脚为数字I/O
TRISB = 0xC0DF; //RB5 RB8-RB13输出
TRISG = 0xFFFF; //G端口输出
TRISE = 0x0000; //E端口输出
TRISD = 0xFE00; //RD0-RD7 RD8 输出
Init_Timer1(); //TMR1初始化
LATE = 0x00FF; //点亮 D0 - D7
Delay_xmS(800);
LATE = 0x0000; //关闭 D0 - D7
Delay_xmS(800);
LATE = 0x00FF; //点亮 D0 - D7
Delay_xmS(800);
LATE = 0x0000; //关闭 D0 - D7
Delay_xmS(800);
TRISFbits.TRISF3 = 0;
TRISFbits.TRISF2 = 1;
UART1_Init();
while(1)
{
//----------------------LCD显示-------------------------
DpyNum[0] = SegCode[temp/10]; //LCD 分段
DpyNum[1] = SegCode[temp%10];
DpyNum[2] = Smg_g;
DpyNum[3] = Smg_g;
DpyNum[4] = SegCode[RxBuffer[temp]>>4]; //显示接收数据高4位
DpyNum[5] = SegCode[RxBuffer[temp]&0x0F]; //显示接收数据低4位
LATE = RxBuffer[temp]; //LED显示当前数据
temp = (temp + 1)&0x0F; //循环显示
Delay_xmS(1600); //延时
//------------------------------------------------------
}
}