#define uchar unsigned char #define uint unsigned int
#define FOSC 11059200ul
#define T0_H (65536-(20*FOSC/(12*100000)))/256 #define T0_L (65536-(20*FOSC/(12*100000)))%256
sbit SDA = P1^0; //数据端 sbit SCP = P1^1; //脉冲
sbit STR = P1^2; //锁存 sbit anjian = P1^3; //按键端
uchar duanma[] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar weima[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar flag = 0; uchar count = 0; uchar j;
void initSys(); void shuchu();
void shuru(uchar ucdata); void anjianxuanze(void);
void main () {
uchar i; initSys();
while(1) {
if(flag == 1) {
flag = 0;
while (j == 0) {
anjianxuanze();
}
if(j!= 0) {
for(i=0;i<=7;i++) {
shuru(duanma[j]); shuru(weima[i]);
shuchu(); //动态扫描20ms进中断视觉效果所以只显示选通端
}
j = 0; } } } }
void initSys() {
TMOD = (TMOD & 0xf0) | 0x01; TH0 = T0_H; TL0 = T0_L; EA = 1; TR0 = 1; ET0 = 1; }
void timer0() interrupt 1 /*中断*/ {
TH0 = T0_H; TL0 = T0_L; count++;
if(count == 10) {
count = 0; flag = 1; } }
void shuru(uchar ucdata) /*串行输入*/ {
uchar i, uctmp; uctmp = ucdata; for(i=0;i<8;i++) {
SCP = 0;
if((uctmp&0x80)==0) SDA = 0; else
SDA = 1;
SCP = 1;
uctmp = uctmp<<1; } }
void shuchu(void) {
STR = 0;
STR = 1; }
void anjianxuanze(void) {
uchar i;
for(i=0;i<=7;i++) {
shuru(0x00);
shuru(weima[i]); shuchu();
if(anjian == 0) {
j = i + 1; break; } else
j = 0; }
}
并行输出*/ /*