如何制作一个程序,让前2个数码管显示显示,后两个数码管显示分钟?怎么才可以做到呢,求指点
数码管段码:
segCode[0]~segCode[9]为0~9的段码(不带小数点);
segCode[10]~segCode[19]为0~9的段码(带小数点);
segCode[20]为数码管全灭的代码。
uchar segCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //0~9的段码(不带小数点)
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff}; //0.~9.的段码(带小数点) 以及0xff全灭
数码管显示数组:
uchar segVal[] = {1,2,3,4,11,12,13,14}; //数码管初始化显示1 2 3 4 1. 2. 3. 4.
直接更改数组里面的值便可以控制数码管显示,例如
让数码管的第0位显示数字8:
segVal[0]= 8;
让数码管的第1位显示数字8(带小数点):
segVal[1] = 18;
总代码如下:
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sfr AUXR = 0x8e;
uchar segCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //0~9的段码(不带小数点)
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff}; //0.~9.的段码(带小数点) 以及0xff全灭
uchar segVal[]={1,2,3,4,11,12,13,14}; //数码管初始化显示1 2 3 4 1. 2. 3. 4.
void SelectHC573(uchar val)
{
switch(val)
{
case 4 : P2 = (P2 & 0x1f) | 0x80; break;
case 5 : P2 = (P2 & 0x1f) | 0xa0; break;
case 6 : P2 = (P2 & 0x1f) | 0xc0; break;
case 7 : P2 = (P2 & 0x1f) | 0xe0; break;
default: P2 = (P2 & 0x1f); break;
}
}
void InitSystem()//系统初始化关闭蜂鸣器、继电器、LED
{
SelectHC573(5);
P0 = 0xbf; //由于不同板子的引脚接法不同,此时的初始值也不同
SelectHC573(4);
P0 = 0xff; //LED全灭
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
uchar segFlag = 0;
void ServiceTimer0() interrupt 1
{
uchar pushp0,pushp2;
pushp0 = P0;
pushp2 = P2;//入栈
SelectHC573(6);
P0 = (0x01<<segFlag);
SelectHC573(7);
P0 = segCode[segVal[segFlag]];
segFlag++;
if(segFlag == 8) segFlag = 0;
P2 = pushp2;//出栈
P0 = pushp0;
}
void main()
{
InitSystem();
Timer0Init();
while(1)
{
;
}
}