本帖最后由 miegui 于 2014-11-7 20:30 编辑
本人用的是stc12c5a60s2单片机,,P0口接锁存器是74hc573 p1口接uln2803 P2口为锁存器573的锁存端
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar xx,yy,zz,layer,icnt,rxcnt;
uchar display[8][8];
void init()
{
TMOD=0x22;//定时器1 方式2 用于产生波特率;定时器0 方式2 用于刷新显示
TH1=0XFD; //PROTEUS中晶振设置33.1776MHz(3倍于11.0592MHz)在波特率加倍的情况下初值0xFD对应波特率为57600
TL1=0XFD;
TH0=0xff;
TL0=0xff;
TR1=1; //开定时器1
TR0=1;
SCON=0X50;//串口工作于方式1 可接收REN=1
PCON|=0x80;//波特率加倍
EA=1; //开全局中断
ES=1; //开串口中断
ET0=1; //开定时器0中断
PS=1; //配置串口中断优先
}
void main()
{
rxcnt=0;
init();
while(1);
}
void rxd() interrupt 4 //串口中断服务程序
{
uchar temp=0;
RI=0;
++rxcnt;
if(rxcnt>=2)
{
temp=SBUF; //读出接收到的数据
display[xx][yy]=temp; //按顺序存入显示数组中
xx++;
if(xx>=8)
{
xx=0;
yy++;
if(yy>=8)
yy=0;
}
}
if(rxcnt>=65)
rxcnt=0;
}
/***********************************************
刷新显示的工作全部放到定时器0中断函数中来了
P0口是每个573芯片的输入端
P1口之前是ULN2803的输入端,经过修改删除了ULN2803
修改后P1直接作为八个面分别的公共端。
P2口是8个573芯片的锁存控制引脚。
*********************************************/
void timer0_isr(void) interrupt 1
{
uchar i=0;
for (i=0;i<7;i++)
{
P2|=(0x01<<i); //锁存端
P0=display[layer];//573输入端
P2&=~(0x01<<i);
}
P1=~(0x01<<layer); //面选择端(八个面分别的公共端)
if(layer<7)
layer++;
else
layer=0;
}
|