2电路设计
根据系统整体结构设计的电路的原理图如图1所示。
系统电路原理图
3总体设计
3.1屏体接口模块
屏体接口包括屏体接口头文件、屏幕缓冲区的定义、屏体接口初始化、刷新定时器中断服务程序和SPI中断服务程序几个部分。
屏体接口的头文件screen.h应该使屏幕缓冲区对其他应用可见,并提供屏体初始化函数。具体定义如下:
#ifndef_SCREEN_H_
#define_SCREEN_H_
#include"inc\board.h"
externu8xdataSCR_BUF[16][16];
voidscreen_init(void);
#endif
这样就把屏幕缓冲区的结构暴露给应用,但应用不必关心具体的屏幕刷新操作。
具体屏体接口的实现集中在一个文件screen.c中定义。具体如下:
首先是屏幕缓冲区定义:
u8xdataSCR_BUF[16][16]_at_0x0000;//~0x00ff256Bytes其次是当前显示行和输出列变量定义,属于静态变量,应用程序不可见。
staticu8datarow,col;
然后是屏幕初始化,包括刷新定时器0的初始化、SPI的初始化、锁存bLatch信号的初始化、屏幕缓冲区的初始清零以及定时器和SPI中断的优先权和使能位的初始化代码略。
SPI和定时器0的中断服务程序是屏体接口的关键。
定时器0的中断服务程序首先进行扫描行增量取模运算,并将扫描行输出。然后依据扫描行取出屏幕缓冲区对应行的第一个字节发送到SPI端口。同时列增量。
voiddisplay_ONe_screen(void)interrupt1using3{
row=(++row)&0x0f;
P0=(P0&0xf0)|((~row)&0xf);
col=0;SPDAT=~SCR_BUF[row][col++];
}
这样编写的屏体驱动,应用只要在初始化屏体后,向屏幕缓冲区中写入要显示的数据即可,而不必关心屏幕显示的细节。
3.2UART接口
UART接口负责与上位机的数据收发,尽管发送可以同步进行,但接收必须异步进行。因而UART接口的核心仍然应该是一个中断服务程序。
UART接口的头文件uart.h隐藏了接收缓冲区的信息,用户可调用的函数只有初始化、发送和接收。
#ifndef_UART_H_
#define_UART_H_
voiduart_init(void);
voiduart_put_c(u8ch);
u8uart_get_c(u8*);
#endif
UART的接口实现首先定义一个接收缓冲FIFO,以及对FIFO的读下标uart_rd和写下标uart_wr,他们都是文件内可见的静态变量:
staticu8xdatauart_buf[64];
staticu8uart_rd,uart_wr;
bitfSend
UART的初始化包括进行FIFO的初始化和UART格式、波特率、中断的初始化。代码略。
UART的ISR主要是服务于接收,无条件地将数据装入FIFO,并调整写入指针。
staticvoiduart_isr(void)interrupt4using1{
if(RI){RI=0;
uart_buf[uart_wr++]=SBUF;
uart_wr&=0x0f;
}
}
提供给用户的发送程序首先检测发送结束标记,如果为0,表示上次发送尚未结束,直接返回错误信息1。
否则将要发送的信息发送并清零发送结束标记。这样设计的发送程序,其目的是将发送等待不限制在接口底层,而是给上层一个决定是否等待发送结束的机会。
u8uart_put_c(u8ch){
if(!TI)return1;
TI=0;SBUF=ch;return0;
}
同样,接收程序也给上层一个选择等待的机会。接收函数首先判断接收FIFO是否为空,如果为空或输入指针参数错误,则直接返回错误,否则才从FIFO中读取数据并将数据存储到指针指向的地址,然后返回成功。
u8uart_get_c(u8*ch){
u8i;
if(!ch)return1;
if((i=(uart_rd+1)&0x0f)==uart_wr)return1;
uart_rd=i;*ch=uart_buf[i];return0;
}
价格面议
[查看详情]