📄 5_4_3.c
字号:
//6.4.3 程序清单
/************************************************************************
程序说明:
该程序配置UART1端口,并传送数据。每按一次按键,所传送的数值会在LCD上显示出来。
************************************************************************/
#define __dsPIC30F6014__
#include <uart.h>
#include <p30F6014.h>
#include "LCD_display.h"
// 配置位
_FOSC(CSW_FSCM_OFF & XT_PLL4); //XT 为4xPLL 振荡器, 失效保险时钟关闭
_FWDT(WDT_OFF); //禁止看门狗定时器
_FBORPOR(PBOR_OFF & MCLR_EN); //禁止掉电复位,使能MCLR复位
_FGS(CODE_PROT_OFF); //禁止代码保护
#define BAUDRATE 9600 //所需的波特率
#define FCY 7372800 // XTAL = 7.3728Mhz; 4 x PLL
#define SW1 !PORTAbits.RA12
#define SW2 !PORTAbits.RA13
#define LF 0x0A
#define CR 0x0D
#define NULL 0x00
#define WRITE_CHAR 0xA8
#define HOME_CLEAR 0x82
#define CURSOR_ON 0x8C
unsigned char RxValue;
void InitUART1(void);
void LCD_Display_Setup(void);
void LCD_Display_ClrCol(unsigned char x);
void LCD_Display_Pixel(unsigned char x,unsigned char y);
void LCD_Display_Byte(unsigned char value);
void LCD_Display_array(int *array_ptr[]);
//UART1 TX中断服务程序
void __attribute__((__interrupt__)) _U1TXInterrupt(void)
{
IFS0bits.U1TXIF = 0; //清中断标志位
}
//UART1 RX中断服务程序
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
IFS0bits.U1RXIF = 0; //清中断标志位
RxValue = (char)U1RXREG; //从接收寄存器读值
LCD_Display_Byte(WRITE_CHAR); //在LCD上显示字符
LCD_Display_Byte(RxValue); //在LCD上显示接收到的值
}
//主程序
int main(void)
{
//要显示的字符为“UART1 TEST”
char Txdata[] = {'U','A','R','T','1',' ','T','E','S','T',CR,LF,NULL};
unsigned char TxIndex;
InitUART1(); //初始化UART1
LCD_Display_Setup(); //初始化LCD显示
LCD_Display_Byte(HOME_CLEAR); //清LCD并把光标放到起始处
LCD_Display_Byte(CURSOR_ON); //启动光标
TRISA = 0xFFFF; //SW1-SW4为输入引脚
while(1) //永远循环
{
TxIndex = 0; //指向字符串的首字符
while (!SW1); //按下SW1开始传送
while (Txdata[TxIndex]) //一直传输直到NULL字符出现
{
WriteUART1((int)Txdata[TxIndex++]); //开始传送字符
while(BusyUART1()); //如果传送忙,则等待
}
while (SW1); //等待按键SW1释放
}
}
//初始化UART1
void InitUART1(void)
{
unsigned int baudvalue;
unsigned int U1MODEvalue;
unsigned int U1STAvalue;
CloseUART1();
ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 &
UART_TX_INT_DIS & UART_TX_INT_PR2);
U1MODEvalue = UART_EN & UART_IDLE_CON &
UART_DIS_WAKE & UART_EN_LOOPBACK &
UART_EN_ABAUD & UART_NO_PAR_8BIT &
UART_1STOPBIT;
U1STAvalue = UART_INT_TX_BUF_EMPTY &
UART_TX_PIN_NORMAL &
UART_TX_ENABLE & UART_INT_RX_CHAR &
UART_ADR_DETECT_DIS &
UART_RX_OVERRUN_CLEAR;
baudvalue = ((FCY/16)/BAUDRATE) - 1; //初始化波特率的值
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
}
//初始化SPI口,与LCD显示器通讯
void LCD_Display_Setup(void){
LATGbits.LATG9 = 1; //设SPI从引脚为高
TRISGbits.TRISG9 = 0; //设SPI引脚为输出
SPI2CON = 0x003c; //主模式, Clk = Fosc/64, 输入采样数据在输出时间中
//部,上升沿触发,时钟空闲为低
SPI2STAT = 0x8000; //使能SPI端口
}
//LCD清像素
void LCD_Display_ClrCol(unsigned char x){
unsigned char counter;
counter = 32; // 清像素点32次
while(counter > 0){
LCD_Display_Byte(0xd9); //清像素,发送命令
LCD_Display_Byte(x); //确定像素X位置,发送命令
LCD_Display_Byte(counter--); //上一个像位置,发送命令
}
}
//LCD显示像素
void LCD_Display_Pixel(unsigned char x,unsigned char y){
LCD_Display_Byte(0xd8); //设像素,发送命令
LCD_Display_Byte(x); // 确定像素X位置,发送命令
LCD_Display_Byte(y); // 确定像素Y位置,发送命令
}
//显示字节
void LCD_Display_Byte(unsigned char value){
unsigned int junk;
LATGbits.LATG9 = 1; // 设从选择为高
LATGbits.LATG9 = 0; // 设从选择为低
junk = SPI2BUF; // 读缓冲避免溢出
SPI2BUF = value; // 写数据到输出缓冲
while(!SPI2STATbits.SPIRBF); // 检查传送是否完毕
}
//LCD显示阵列
void LCD_Display_array(int *array_ptr[]){
unsigned char j,k;
for (k=0; k<122; k++)
{
j = (unsigned char)array_ptr[k]/8;
LCD_Display_ClrCol(k); // 清除下一整列
LCD_Display_Pixel(k,j); // 设置像素位置
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -