⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 单片机c语言程序设计100例--基于PIC+PROTEUS
💻 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 + -