?? main.c
字號(hào):
//-----------------------------------------------------------------
// 名稱: 能接收串口信息的帶中英文硬字庫(kù)的80*16點(diǎn)陣顯示屏
//-----------------------------------------------------------------
// 說明: 本例運(yùn)行時(shí),點(diǎn)陣屏將滾動(dòng)顯示一組固定信息
// 當(dāng)接收到串口發(fā)送來的中英文/全角/半角字符時(shí),點(diǎn)屏將開始
// 滾動(dòng)顯示所接收到的信息.
//
//-----------------------------------------------------------------
#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相關(guān)引腳定義
#define DS RE0
#define SH_CP RE1
#define ST_CP RE2
//74154譯碼器使能與禁止
#define EN_74HC154() RB5 = 0
#define DI_74HC154() RB5 = 1
//SPI相關(guān)函數(shù)
extern void SPI_MasterInit();
extern void Read_Bytes_from_SPI_MEM(INT32U addr, INT8U *p, INT16U len);
//最多可接收的漢字個(gè)數(shù)
#define MAX_WORD_COUNT 50
//開始時(shí)待顯示的中英文字符串
//及從串口接收的中英文數(shù)字等字符信息都將覆蓋保存到bMsg中
struct MSG
{
INT8U Buffer[MAX_WORD_COUNT*2 + 2];
INT8U Len;
} bMsg;
//緩沖可保存漢字點(diǎn)陣數(shù)據(jù)的最大漢字個(gè)數(shù)(如果為半角字符則*2)
#define MAX_DOT_WORD_COUNT 20
//待顯示漢字點(diǎn)陣數(shù)據(jù)緩沖
INT8U WORD_Dots_Buffer[MAX_DOT_WORD_COUNT * 32];
//接收結(jié)束標(biāo)志
INT8U Rec_END_Flag = 0;
//-----------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------
void Serial_port_init()
{
SYNC = 0; //選擇異步通信模式
BRGH = 1; //選擇高速波特率發(fā)生模式
TXEN = 1; //允許發(fā)送數(shù)據(jù)
SPBRG = _XTAL_FREQ/16/9600 - 1; //設(shè)置波特率為9600
SPEN = 1; //串行通信端口打開
CREN = 1; //使能連續(xù)接收串行數(shù)據(jù)
}
//-----------------------------------------------------------------
// 串行輸入子程序
//-----------------------------------------------------------------
void Serial_Input_595(INT8U dat)
{
}
//-----------------------------------------------------------------
// 并行輸出子程序
//-----------------------------------------------------------------
void Parallel_Output_595()
{
}
//-----------------------------------------------------------------
// 根據(jù)bMsg.Buffer,從硬字庫(kù)讀取全角或半角字符點(diǎn)陣數(shù)據(jù)并完成必要轉(zhuǎn)換
//-----------------------------------------------------------------
void Read_SPI_Dot_Matrix_AND_Convert()
{
INT16U i,j = 0,k;
INT32U Offset; //漢字在點(diǎn)陣庫(kù)中的偏移位置
INT8U SectionCode, PlaceCode; //漢字區(qū)碼與位碼
INT8U Temp_Buf[32]; //轉(zhuǎn)換用臨時(shí)緩沖
for (i = 0; i <MAX_DOT_WORD_COUNT * 32; i++) //清空點(diǎn)陣緩沖
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設(shè)為數(shù)字端口
TRISB = PORTB = 0x00; //配置端口
TRISE = 0x00;
//在顯示緩沖中先預(yù)設(shè)初始時(shí)待顯示的字符串("★L(fēng)ED點(diǎn)陣演示V1.0★")
//因PICC不支持在字符串中使用中文字符,故改用內(nèi)碼表示
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主機(jī)初始化
Serial_port_init(); //初始化串口
RCIE = 1; //使能接收中斷
GIE = 1; //開放全局中斷
PEIE = 1; //使能外部中斷
//根據(jù)bMsg.Buffer從SPI存貯器讀取全角或半角字符點(diǎn)陣數(shù)據(jù)并完成必要的轉(zhuǎn)換
Read_SPI_Dot_Matrix_AND_Convert();
while(1)
{
for (z = 0; z <= bMsg.Len - 10; z++)
{
}
//如果接收結(jié)束則從SPI接口存儲(chǔ)器讀取中英文字符串的點(diǎn)陣數(shù)據(jù)并轉(zhuǎn)換為液晶格式
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'時(shí)忽略
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;
//任何時(shí)候接收到"##"時(shí)清空緩沖
if ( bMsg.Len >= 2 && bMsg.Buffer[bMsg.Len-1] == '#'
&& bMsg.Buffer[bMsg.Len-2] == '#')
{ bMsg.Len = 0; }
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -