本帖最后由 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;
}
|