|
and
*/
//-----------------------------------------------------------------
// 名稱: 能接收串口信息的帶中英文硬字庫的80*16點陣顯示屏
//-----------------------------------------------------------------
// 說明: 本例運行時,點陣屏將滾動顯示一組固定信息
// 當接收到串口發送來的中英文/全角/半角字符時,點屏將開始
// 滾動顯示所接收到的信息.
//----------串口發送待顯示中英文字符的操作說明----------
//A. 在串口助手中輸入 ## 加回鍵后發送時點陣顯示屏將被清空
//B. 輸入一串漢字或英文字符后一定要在后面按下回車鍵,然后再點擊發送按鈕
//C. ##可以單獨出現,也可以在一串文字開頭或中間某位置出現,##前的內容將被清除
//D. 注意在虛擬串口軟件VSPD中設置COM3,COM4對連,且注意參數一致
//E. 本例運行需要安裝并配置VSPD
//F. 512K字節EEPROM中存放有:
//1. 16*16點陣中文字庫
//2. 8*16點陣英文字庫
//
//-----------------------------------------------------------------
#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#define INT8 signed char
#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long
//74595及74154相關引腳定義
#define DS PA0 //
#define SH_CP PA1
#define ST_CP PA2
#define E1_74HC154 PC7
//74595及74154相關引腳操作
#define DS_1() PORTA|= _BV(DS)
#define DS_0() PORTA&=~_BV(DS)
#define SH_CP_1() PORTA|=~_BV(SH_CP)
#define SH_CP_0() PORTA&=~_BV(SH_CP)
#define ST_CP_1() PORTA|=~_BV(ST_CP)
#define ST_CP_0() PORTA&=~_BV(ST_CP)
//74154譯碼器使能與禁止
#define EN_74HC154() PORTC&=~_BV(E1_74HC154)
#define EN_74HC154() PORTC|= _BV(E1_74HC154)
//SPI相關函數
extern void SPI_MasterInit
extern void Read_SPI_Some_Bytes_FROM_AT25F4096(INT32U addr,INT8U*p,INT16U len);
//最多可接收的漢字個數
#define MAX_WORD_COUNT 50
//開始時待顯示的中英文字符串
//及從串口接收的中英文數字等字符信息都將覆蓋保存到bMsg中
struct MSG
{
INT8U Buffer[MAX_WORD_COUNT*2 + 2];
INT16U Len;
} bMsg;
//緩沖可保存漢字點陣數據的最大漢字個數(如果為半角字符則*2)
#define MAX_DOT_WORD_COUNT 20
//待顯示漢字點陣數據緩沖
INT8U WORD_Dots_Buffer[MAX_DOT_WORD_COUNT * 32];
//------------------------------------------------------------------
// USART初始化
//------------------------------------------------------------------
void Init_USART()
{
UCSRB=_BV(RXEN)|_BV(RXCIE);
UCSRC=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);
UBRRL=(F_CPU/9600/16-1)%256;
UBRRH=(F_CPU/9600/16-1)%256;
}
//-----------------------------------------------------------------
// 串行輸入子程序
//-----------------------------------------------------------------
void Serial_Input_595(INT8U dat)
{
INT8U i;
for (i=0x80;i!=0x00;i>>=1)
{
if(dat&i)DS_1();else DS_0();
SH_CP_0();_delay_us(2);
SH_CP_1();_delay_us(2);
}
}
//-----------------------------------------------------------------
// 并行輸出子程序
//-----------------------------------------------------------------
void Parallel_Output_595()
{
ST_CP_0();_delay_us(1);
ST_CP_1();_delay_us(1);
}
//-----------------------------------------------------------------
// 根據bMsg.Buffer,從硬字庫讀取全角或半角字符點陣數據并完成必要轉換
//-----------------------------------------------------------------
void Read_SPI_Word_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=0x00;
i=0;
while(i<bMsg.Len)
{
if (bMsg.Buffer>0xA0)
{
//
SectionCode=bMsg.Buffer - 0xA0;
PlaceCode=bMsg.Buffer[i+1] - 0xA0;
//
Offset=(94L*(SectionCode -1)+(PlaceCode -1))*32L;
//
Read_Some_Bytes_FROM_AT25F4096(Offset,Temp_Buf,32);
//
//
for (k=0;k<16;k++)
{
WORD_Dots_Buffer[j+k] =Temp_Buf[2*k];
WORD_Dots_Buffer[j+k+16]=Temp_Buf[2*k+1];
}
//
//
//
j+=32;i+=2
}
else
{
//
//
offset=267616L+bMsg.Buffer*16;
Read_Some_Bytes_FROM_AT25F4096(Offset,WORD_Dots_Buffer+j,16);
//
//
//
j+=16;i++;
}
}
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
INT8U i,j,z,d=0;
DDRA=0xFF;PORTA=0xFF;
DDRC=0xFF;PORTC=0xFF;
DDRD=0x02;PORTD=0xFF;
//
strcpy((char*)bMsg.Buffer,"點陣演示v1.0...")
bMsg.Len=strlen((char*)bMsg.Buffer);
SPI_MasterInit();
Init_USART()
sei()
//
while()
{
for(z=0;z<=bMsg.Len-10;z++)
{
for(d=0;d<10;d++)
{
for(i=0;i<16;i++)
{
//
for(j=0;j<5;j++)
{
Serial_Input_595(WORD_Dots_Buffer[z*16+j*32+i+16]);
Serial_Input_595(WORD_Dots_Buffer[z*16+j*32+i]);
}
DI_74HC154();
Parallel_Output_595();
PORTC=(PORTC&0xF)|i;
EN_74HC154();
_delay_ms(2);
}
}
}
}
}
//-----------------------------------------------------------------
// 串口接收中斷函數
//-----------------------------------------------------------------
ISR (USART_RXC_vect)
{
//
INT8U c=UDR;
//
if(c=='\r')return;
//
if (c=='\n')
{
//
Read_SPI_Word_Dot_Matrix_AND_Convert();
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;
}
}
編譯器提示有2項錯誤,一處警告:
錯誤:Error 1 expected ';' before 'for' I:\資料\能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏\能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏\AT25F4096.c 100 4 能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏
Error 3 expected ';' before 'SPI_Transmit' I:\資料\能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏\能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏\AT25F4096.c 118 2 能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏
警告:Warning 2 unused variable 'i' [-Wunused-variable] I:\資料\能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏\能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏\AT25F4096.c 96 11 能接收串口信息的帶中英文硬字庫的80×16點陣顯示屏
大神們班我看一下有什么問題,可以嗎
|
|