基于单片机的LED显示屏硬件设计方案
3 总体设计
3.1 屏体接口模块
屏体接口包括屏体接口头文件、屏幕缓冲区的定义、屏体接口初始化、刷新定时器中断服务程序和SPI中断服务程序几个部分。
屏体接口的头文件screen.h 应该使屏幕缓冲区对其他应用可见, 并提供屏体初始化函数。具体定义如下:
#ifndef _SCREEN_H_
#define _SCREEN_H_
#include incboard.h
extern u8 xdata SCR_BUF[16][16];
void screen_init(void);
#endif
这样就把屏幕缓冲区的结构暴露给应用, 但应用不必关心具体的屏幕刷新操作。
具体屏体接口的实现集中在一个文件screen.c 中定义。具体如下:
首先是屏幕缓冲区定义:
u8 xdata SCR_BUF[16][16]_at_0x0000;//~0x00ff 256Bytes其次是当前显示行和输出列变量定义, 属于静态变量, 应用程序不可见。
static u8 data row,col;
然后是屏幕初始化, 包括刷新定时器0 的初始化、SPI 的初始化、锁存bLatch 信号的初始化、屏幕缓冲区的初始清零以及定时器和SPI 中断的优先权和使能位的初始化代码略。
SPI 和定时器0 的中断服务程序是屏体接口的关键。
定时器0 的中断服务程序首先进行扫描行增量取模运算,并将扫描行输出。然后依据扫描行取出屏幕缓冲区对应行的第一个字节发送到SPI 端口。同时列增量。
void display_ONe_screen(void)interrupt 1 using 3{
row = (++row)0x0f;
P0 = (P0 0xf0)|((~row) 0xf);
col = 0;SPDAT = ~SCR_BUF[row][col++];
}
这样编写的屏体驱动, 应用只要在初始化屏体后,向屏幕缓冲区中写入要显示的数据即可, 而不必关心屏幕显示的细节。
3.2 UART 接口
UART 接口负责与上位机的数据收发, 尽管发送可以同步进行, 但接收必须异步进行。因而UART 接口的核心仍然应该是一个中断服务程序。
UART 接口的头文件uart.h 隐藏了接收缓冲区的信息, 用户可调用的函数只有初始化、发送和接收。
#ifndef _UART_H_
#define _UART_H_
void uart_init(void);
void uart_put_c(u8 ch);
u8 uart_get_c(u8 *);
#endif
UART 的接口实现首先定义一个接收缓冲FIFO, 以及对FIFO 的读下标uart_rd 和写下标uart_wr, 他们都是文件内可见的静态变量:
static u8 xdata uart_buf[64];
static u8 uart_rd,uart_wr;
bit fSend
UART 的初始化包括进行FIFO 的初始化和UART格式、波特率、中断的初始化。代码略。
UART 的ISR 主要是服务于接收, 无条件地将数据装入FIFO, 并调整写入指针。
static void uart_isr(void)interrupt 4 using 1{
if(RI){RI = 0;
uart_buf[uart_wr++] = SBUF;
uart_wr = 0x0f;
}
}
提供给用户的发送程序首先检测发送结束标记, 如果为0, 表示上次发送尚未结束, 直接返回错误信息1。
评论