很简单的时钟程序(单片机)
/****************************
名称:6位数码管显示
功能:显示从0到9
作者:
日期:2010-4-13
**************************************/
#include<reg51.h>
#include<ABSACC.H>
#include<delay.h>
#define LEDLen 6 //6个数码管
#define OUTBIT XBYTE[0Xe101]//定义位选地址 8
#define CLK164 XBYTE[0Xe102]//定义74HC164时钟线
#define DAT164 XBYTE[0Xe102]//定义74HC164数据线
unsigned char LEDBuf[LEDLen];//定义缓冲区
code unsigned char LEDMAP[]=
{ //11 111100
0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0,1,2,3,4,5,6,7
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71//8,9,A,B,C,D,E,F
};
unsigned char second=0,NunBer=0,min=0,hou=0;
/****************************
名称:6位数码管显示
功能:每把8位段码送给74HC164,然后再点位码,从左到右依次扫描。
作者:
日期:2010-4-13
**************************************/
void DisplayLED()
{
unsigned char i,j;
unsigned char Pos;
unsigned char LED;
Pos=0x20;// 位选变量,从左到右//0010 0000
for(i=0;i<LEDLen;i++)//6个数据管,动态扫描6次,从左到右。
{
OUTBIT=0; //先关位选 001
LED=LEDBuf[i]; //把段码存到0x3f 0=0011 1111 1=0111 1110 0x3f= 1111 1100
for(j=0;j<8;j++) //送8次,因为有8段//送数进74hc164 0x80= 1000 0000 // 1000 0000
{ //1000 0000 //=== 1000 0000
if(LED&0X80)DAT164=1;else DAT164=0; //每次取LED的最高位,送到数据线上。
CLK164=CLK164|0X02;//每送完一位,就对应的给一个脉冲
CLK164=CLK164&0XFD;
LED<<=1;
}
OUTBIT=Pos;//送完段码后,就开始从左到右点亮0001 0000
Delay_Led(1);
Pos>>=1;//位选右移
}
OUTBIT=0; //每显示完一次,就关掉,因为要下面重新得到的数
}
/****************************
名称:主函数
功能:
作者:
日期:2010-4-13
**************************************/
void Init()
{
TMOD=0X01; //定时器0工作方式1
TH0=0X9E;//50ms
TL0=0X58;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
unsigned char t;
Init();
while(1)
{
/*如何把秒,分显示出来?*/
LEDBuf[0]=LEDMAP[second%10];//LEDMAP[t]是把要显示的数找到对应的段码
LEDBuf[1]=LEDMAP[second/10];
LEDBuf[2]=LEDMAP[min%10];
LEDBuf[3]=LEDMAP[min/10];
LEDBuf[4]=LEDMAP[hou%10];
LEDBuf[5]=LEDMAP[hou/10];
for(t=0;t<10;t++)
DisplayLED();//把数据显示出来
}
}
void T0_time() interrupt 1 //50ms
{
TH0=0X9E; //50ms
TL0=0X58;
NunBer++;
/*如何得到秒,分?倒计时应该怎么写?*/
if(NunBer>=20)//50*20=1s
{
second++;
if(second>59)
{
second=0;
NunBer=0;
min++;
if(min>59)
{
min=0;
hou++;
if(hou>23)hou=0;
}
}
}
}
如何用12864中文液晶显示字体左右移动呢??AT89s51实现……且用C程序编写 需整个程序 可用的 简单的