附录 B 主要C程序清单
8
以下是16x16的点阵LED电子图文显示屏的源程序采用C语言编写,C程序KeiluVision2 V2.30环境下调试通过。
以下为用汇编语言编写的字符显示控制程序:
; *************************************** ; * * ; * 单个16x16的点阵电子屏字符显示器 * ; * ATA89C52 12MHz晶振 * ; * 2004.2.11 LRM * ; *************************************** ;显示字用查表法,不占用内存,字符用16x16共阳LED点阵, ;效果:向上滚动显示4个字,再重复循环。 #include
unsigned char idata dispram[(BLKN/2)*32]={0}; unsigned char code Bmp[4][32]={ {
0xEF,0xFF,0xEF,0x03,0x81,0xBB,0xDD,0xBB,0xDD,0xD7,0xEB,0xEF,0xF3,0xD7,0xCD,0xB9,
0x3E,0xFF,0xC0,0x07,0xFE,0xF7,0xFD,0xF7,0xFD,0xF7,0xFB,0xF7,0xF7,0xD7,0xEF,0xEF}, {
0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x80,0x03,0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,
0xFE,0xFB,0xFD,0xFB,0xFD,0xFB,0xFB,0xFB,0xFB,0xFB,0xF7,0xFB,0xEF,0xD7,0xDF,0xEF}, {
0xFE,0xF7,0xEF,0x73,0xF3,0x37,0xF7,0x6F,0x80,0x01,0xBF,0xFB,0x70,0x17,0xFF,0xBF,
0xFF,0x7F,0x80,0x01,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFD,0x7F,0xFE,0xFF}, {
0xFF,0xFF,0xC0,0x03,0xFF,0xFB,0xF7,0xFB,0xFB,0xFB,0xFC,0xFB,0xFE,0xEB,0xFF,0x9B,
0xFE,0x7B,0xF9,0xFB,0xC7,0xFB,0xEF,0xFB,0xFF,0xFB,0xFF,0xDB,0xFF,0xEA,0xFF,0xF6}, };
void delay(unsigned int dt) {
9
register unsigned char bt; for (; dt; dt--)
for (bt=0; bt<255; bt++); }
void style1() {
register unsigned char w,i,q; delay(1000);
for (w=0;w for (i=0;i<32;i++) { for(q=0;q if(key2==0)delay(20);if(key2==0)while(1){if(key2==1)break;} ; if (i%2) delay(120); } delay(1000);} } void style2() { register unsigned char i,j,k,l,q; delay(1000); for (i=0; i for (j=2; j>0; j--) { for (k=0; k<8; k++) { for (l=0; l<16; l++) { for(q=0;q if(q==0) dispram[l*2+q*32] = dispram[l*2+q*32]>>1 Bmp[i][l*2+j-1]<<(7-k); else dispram[l*2+q*32] = dispram[l*2+q*32]>>1 dispram[l*2+1+(q-1)*32]<<7; if(key2==0)delay(20);if(key2==0)while(1){if(key2==1)break;}} } delay(100); } } } delay(1000) ; } void main(void) 10 | | | { SCON = 0x00; TMOD = 0x01; TR0 = 1; CONIO = 0x2f; IE = 0x82; while(1){ key1=1; if(key1==0)delay(20);if(key1==0) while(1) {style1();if(key1==1)break;} if(key1==1)delay(20);if(key1==1) while(1) {style2();if(key1==0)break;} } } void leddisplay(void) interrupt 1 using 1 { register unsigned char m,z=BLKN; TH0 = 0xFc; TL0 = 0x18; m=~m; m = CONIO; m = ++m & 0x0f; do { z--; SBUF = dispram[m*2+(z/2)*30 + z]; while (!TI); TI = 0; }while (z); G = 1; CONIO &= 0xf0; CLK=1; CONIO |= m; CLK=0; G = 0; } 11

