📄 main.c
字号:
//-----------------------------------------------------------------
// 名称: 能接收串口信息的带中英文硬字库的80*16点阵显示屏
//-----------------------------------------------------------------
// 说明: 本例运行时,点阵屏将滚动显示一组固定信息
// 当接收到串口发送来的中英文/全角/半角字符时,点屏将开始
// 滚动显示所接收到的信息.
//
//-----------------------------------------------------------------
#include <pic18.h>
#include <string.h>
#include <stdio.h>
#define INT8 signed char
#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long
#define _XTAL_FREQ 8000000UL
//74595及74154相关引脚定义
#define DS RE0
#define SH_CP RE1
#define ST_CP RE2
//74154译码器使能与禁止
#define EN_74HC154() RB5 = 0
#define DI_74HC154() RB5 = 1
//SPI相关函数
extern void SPI_MasterInit();
extern void Read_Bytes_from_SPI_MEM(INT32U addr, INT8U *p, INT16U len);
//最多可接收的汉字个数
#define MAX_WORD_COUNT 50
//开始时待显示的中英文字符串
//及从串口接收的中英文数字等字符信息都将覆盖保存到bMsg中
struct MSG
{
INT8U Buffer[MAX_WORD_COUNT*2 + 2];
INT8U Len;
} bMsg;
//缓冲可保存汉字点阵数据的最大汉字个数(如果为半角字符则*2)
#define MAX_DOT_WORD_COUNT 20
//待显示汉字点阵数据缓冲
INT8U WORD_Dots_Buffer[MAX_DOT_WORD_COUNT * 32];
//接收结束标志
INT8U Rec_END_Flag = 0;
//-----------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------
void Serial_port_init()
{
SYNC = 0; //选择异步通信模式
BRGH = 1; //选择高速波特率发生模式
TXEN = 1; //允许发送数据
SPBRG = _XTAL_FREQ/16/9600 - 1; //设置波特率为9600
SPEN = 1; //串行通信端口打开
CREN = 1; //使能连续接收串行数据
}
//-----------------------------------------------------------------
// 串行输入子程序
//-----------------------------------------------------------------
void Serial_Input_595(INT8U dat)
{
}
//-----------------------------------------------------------------
// 并行输出子程序
//-----------------------------------------------------------------
void Parallel_Output_595()
{
}
//-----------------------------------------------------------------
// 根据bMsg.Buffer,从硬字库读取全角或半角字符点阵数据并完成必要转换
//-----------------------------------------------------------------
void Read_SPI_Dot_Matrix_AND_Convert()
{
INT16U i,j = 0,k;
INT32U Offset; //汉字在点阵库中的偏移位置
INT8U SectionCode, PlaceCode; //汉字区码与位码
INT8U Temp_Buf[32]; //转换用临时缓冲
for (i = 0; i <MAX_DOT_WORD_COUNT * 32; i++) //清空点阵缓冲
WORD_Dots_Buffer[i] = 0x00;
i = 0;
while ( i < bMsg.Len )
{
if ( bMsg.Buffer[i] >= 0xA0 ) //处理汉字编码
{
}
else //处理半角字符编码
{
}
}
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
INT8U i,j,z,d = 0;
ADCON1 = 0x06; //RA,RE设为数字端口
TRISB = PORTB = 0x00; //配置端口
TRISE = 0x00;
//在显示缓冲中先预设初始时待显示的字符串("★LED点阵演示V1.0★")
//因PICC不支持在字符串中使用中文字符,故改用内码表示
strcpy((char*)bMsg.Buffer,
"\xA1\xEF\x4C\x45\x44\xB5\xE3\xD5\xF3\xD1\xDD\xCA\xBE\x56\x31\x2E\x30\xA1\xEF");
bMsg.Len = strlen((char*)bMsg.Buffer);
SPI_MasterInit(); //SPI主机初始化
Serial_port_init(); //初始化串口
RCIE = 1; //使能接收中断
GIE = 1; //开放全局中断
PEIE = 1; //使能外部中断
//根据bMsg.Buffer从SPI存贮器读取全角或半角字符点阵数据并完成必要的转换
Read_SPI_Dot_Matrix_AND_Convert();
while(1)
{
for (z = 0; z <= bMsg.Len - 10; z++)
{
}
//如果接收结束则从SPI接口存储器读取中英文字符串的点阵数据并转换为液晶格式
if (Rec_END_Flag == 1)
{
}
}
}
//------------------------------------------------------------------
// 串口接收中断程序
//------------------------------------------------------------------
void interrupt Serial_Port_Recv_ISR()
{
static INT8U i = 0; INT8U c = 0;
if(RCIE && RCIF)
{
Rec_END_Flag = 0;
c = RCREG; //读取接收到字符
//接收到'\r'时忽略
if ( c == '\r' ) return;
//如果接收到'\n'表示本次接收完毕
if ( c == '\n' )
{
Rec_END_Flag = 1; return;
}
//缓存新接收的字符
if ( bMsg.Len < MAX_WORD_COUNT*2) bMsg.Buffer[bMsg.Len++] = c;
//任何时候接收到"##"时清空缓冲
if ( bMsg.Len >= 2 && bMsg.Buffer[bMsg.Len-1] == '#'
&& bMsg.Buffer[bMsg.Len-2] == '#')
{ bMsg.Len = 0; }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -