利用8X8 点阵挨个显示数字0 到9 的数字,到9后从0重新开始,如此循环。
解决方式一:通过中断方式让所有行值始终为低电平(事实上,并不是一次性让所有行值为低电平,而是挨行设置,CPU的中断时间间隔较短,当挨行设置频率较快时,可近似认为所有行值都为低电平),而列值需要根据具体数字的列值来确定,每秒改一次列值的数字。
解决方式二:通过中断方式让所有列值始终为高电平(原理同上),而行值根据具体数字的行值来确定,每秒改变一次行值的数字
以下我采用了方法一来实现。
编译环境:KEIL C51 V3
电路仿真软件:proteus 7.4
单片机类型:AT89C52
LED类型:MATRIX-8X8-RED
单片机上的程序代码:
#include unsigned char code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //unsigned char code table2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char code table2[10][8]={ {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0 {0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1 {0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2 {0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3 {0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4 {0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5 {0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6 {0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7 {0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8 {0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00} //9 }; unsigned int times_of_interrupt; unsigned char i,j; void main() { TMOD=0x01; //定时器/计数器工作方式为16位定时/计数器 //给定时器/计数器T0装入预定初值 TH0=(65535-60000)/256; TL0=(65535-60000)/256; TR0=1; //设置定时器/计数器T0为定时器状态 ET0=1; //打开定时器ET0中断允许标志位 EA=1; //打开CPU中断允许标志位 times_of_interrupt=0; i=0; j=0; while(1) {} } void t0_interrupt_function() interrupt 1 { P2=table1[i]; P1=table2[j][i]; i++; if(i==8) { i=0; } if(times_of_interrupt==40) { times_of_interrupt=1; j++; if(j==10) { j=0; } } else { times_of_interrupt=times_of_interrupt+1; } } 电路图核心部分如下: 显示效果如下:
上一篇:51单片机——8X8点阵显示
下一篇:C51玩8x8LED点阵:PointGame
设计资源 培训 开发板 精华推荐
- MC33074DR2G 高顺从电压灌电流转换器的典型应用
- 电子狗
- 高精度、双极差分至单端转换器驱动 LTC2400 输入轨至轨
- LT6654AHS6-2.5 扩展电源范围电压基准的典型应用
- 基于 MCF5234CVM100 MPU ColdFire MCF5xxx 处理器的 M5235EVB、M523xEVB 评估板
- AKD4359,AK4539 24bit 8CH D/A转换器评估板
- 使用 ROHM Semiconductor 的 BU4330 的参考设计
- 使用 LT6202 将 ±10V 双极性信号转换为 0V 至 5V 输入信号到 LTC2370HMS-16 的典型应用
- 使用 Analog Devices 的 LTC1393 的参考设计
- 使用 NXP Semiconductors 的 TDA8933BT 的参考设计