附上实验结果的截图,完整电路图和程序在压缩包内
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*8x8LED显示从0到9数据 */
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //74HC595 行选
- sbit LOCK = P2^3; //禁止输出
- sbit SCLK = P2^4; //时钟引脚
- sbit DATA = P2^5; //数据
- //74HC138 列选
- sbit hc138_A = P2^0;
- sbit hc138_B = P2^1;
- sbit hc138_C = P2^2;
- //数字字模,10个数字0~9,每个数字8个字节(纵向,正序)
- uchar code shuzi[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
- };
- //数字字模指针
- uchar col=0;
- //第几个字符
- uchar count=0;
- //定时器定时次数
- uchar time = 0;
- //595串行输入的行数据
- uchar d=0;
- //8位数据从74HC595的串行输入,并行输出
- void dat74595(unsigned char d)
- {
- unsigned char i;
- for (i=0;i<8;i++) //8位数据串行输入
- {
- SCLK = 0;
- DATA = (bit)(d&0x80);
- SCLK = 1;
- d=d<<1;
- }
- DATA = 1;
- LOCK=0;LOCK=1; //8位数据并行输出
- }
- void main(void)
- {
- TMOD=0x01; //定时器0方式1
- TH0=(65536-5000)/256; //设置定时计数初值,5ms
- TL0=(65536-5000)%256;
- TR0=1;
- ET0=1; //打开定时器0中断
- EA=1;
- while(1);
- }
- /*定时器0中断服务程序,5ms中断一次,扫描一列*/
- void Timer0Int(void) interrupt 1
- {
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
-
- switch(col) //列选通
- {
- case 0: hc138_C =0; hc138_B=0; hc138_A=0; // 选择第0列显示
- break;
- case 1: hc138_C =0; hc138_B=0; hc138_A=1; // 选择第1列显示
- break;
- case 2: hc138_C =0; hc138_B=1; hc138_A=0; // 选择第2列显示
- break;
- case 3: hc138_C =0; hc138_B=1; hc138_A=1; // 选择第3列显示
- break;
- case 4: hc138_C =1; hc138_B=0; hc138_A=0; // 选择第4列显示
- break;
- case 5: hc138_C =1; hc138_B=0; hc138_A=1; // 选择第5列显示
- break;
- case 6: hc138_C =1; hc138_B=1; hc138_A=0; // 选择第6列显示
- break;
- case 7: hc138_C =1; hc138_B=1; hc138_A=1; // 选择第7列显示
- default: break;
- }
- d=shuzi[count][col]; //行,送数字字模
- dat74595(d); //把数一位一位的传给74HC595
- col++;
- if(col==8)
- {
- col=0;
- }
-
- time++;
- if (time >= 200) //定时200次,1s,每个数字显示1s
- {
- time = 0;
- count++; //准备显示下一个数字
- if (count >= 10)
- {
- count = 0;
- }
- }
- }
复制代码
所有资料51hei提供下载:
点阵.zip
(61.44 KB, 下载次数: 108)
|