|
题目
平台验证【3】:采用74HC573实现数
码管显示实验
用573锁存器控制输出段码,用单片机PIN引
脚直接进行位选,实现数码管显示
连接方法:P0与J12用8PIN排线连接,J16与P2用
8PIN排线连接,P1.0接到J21中柱
将8个数码管分为两组,同时显示同一个数,该数
从00.00到99.99,每次显示完成后加0.01
0-9的段码:
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f
- #include "at89x51.h"
- #include <intrins.h>
- #define USE_573_LE
- #ifdef USE_573_LE
- sbit LE = P1^0; //定义输出使能控制脚在P1.0上
- #endif
- //此表为 LED 的字模, 共阴数码管 0-9
- unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- //此表为8个数码管位选控制, 共阴数码管 1-8个
- unsigned char code dispbit[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
- unsigned int LedOut[8]; //变量定义
- void delay(unsigned int i);
- void setValue(unsigned int v)
- {
- LedOut[0] = Disp_Tab[(v % 10000) / 1000];
- LedOut[1] = Disp_Tab[(v % 1000) /100] | 0x80;
- LedOut[2] = Disp_Tab[(v % 100) / 10];
- LedOut[3] = Disp_Tab[v % 10];
-
- LedOut[4] = LedOut[0]; //千位
- LedOut[5] = LedOut[1]; //百位带小数点
- LedOut[6] = LedOut[2]; //十位
- LedOut[7] = LedOut[3]; //个位
- }
- void dispBit(unsigned char i)
- {
- P0 = LedOut[i];
- #ifdef USE_573_LE
- LE = 1; //输出使能,锁存器将P0的8位数据全部接收
- LE = 0; //锁存数据, P0不再影响锁存器的输出
- #endif
- P2 = dispbit[i]; //使用查表法进行位选
- }
- void main()
- {
- unsigned int DelayCNT, i, LedNumVal = 0; //变量定义
-
- DelayCNT = 0;
- setValue(LedNumVal);
- #ifdef USE_573_LE
- LE = 0;
- #else
- P1_0 = 1;
- #endif
- while(1)
- {
- if(++DelayCNT >= 20) //控制数字变化速度
- {
- DelayCNT = 0; //20个扫描周期清零一次
- ++LedNumVal; //每隔20个扫描周期加一次
- if(LedNumVal >= 10000)
- {
- LedNumVal = 0;
- }
- setValue(LedNumVal);
- }
- for(i = 0; i < 8; i++)
- {
- dispBit(i);
- delay(6); //扫描间隔时间太长,数码管会有闪烁感. 注意晶振频率。
- }
- }
- }
- void delay(unsigned int i)
- {
- unsigned char j;
- for(i; i > 0; i--)
- for(j = 200; j > 0; j--);
- }
复制代码 |
|