|
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点阵显示屏
大神们班我看一下有什么问题,可以吗
|
|