宝视来
明基
鸿合
快速搜索:

电路设计

——单片机在LED屏硬件的设计
2014年02月10日 09:07  来源:中国数字视听网  字体【   

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;

}

中国数字视听网微信公众平台:
搜索“数字视听网”或扫描下面的二维码,关注官方微信平台,开启视听行业新闻资讯新旅程!
本文导航
明基
MAXHUB
快捷
产品关注排行
"扫一扫"关注我