sec.c
来自「单片及c语言轻松入门的随书光盘」· C语言 代码 · 共 83 行
C
83 行
/**************************************************
; 平凡单片机工作室
; http://www.mcustudio.com
; (c) Copyright 2003 Pingfan's McuStudio
; All rights Reserved
;sec1.c
;作者:周坚
;秒钟程序,每到1S,显示值加1,有高位0消隐功能
;本例可用dpj.dll实验仿真板验证
;**************************************************/
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define Hidden 0x10; //消隐字符在字形码表中的位置
uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
uchar DispBuf[6]; //6字节的显示缓冲区
bit Sec; //1s到的标记
uchar SecValue; //秒计数值
uchar code TH0Val=63266/256;
uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值
//经过精确调整,在值为63266时,定时时间为1.00043362s
void Timer0() interrupt 1
{ uchar tmp;
static uchar dCount; //计数器,显示程序通过它得知现正显示哪个数码管
static uint Count; //秒计数器
const uint CountNum=400; //预置值
TH0=TH0Val;
TL0=TL0Val;
tmp=BitTab[dCount]; //根据当前的计数值取位值
P2=P2|0xfc; //P2与11111100B相或,将高6位置1
P2=P2&tmp; //P2与取出的位值相与,将某一位清零
tmp=DispBuf[dCount]; //根据当前的计数值取显示缓冲待显示值
tmp=DispTab[tmp]; //取字形码
P0=tmp; //送出字形码
dCount++; //计数值加1
if(dCount==6) //如果计数值等于6,则让其回0
dCount=0;
//以下是秒计数的程序行
Count++; //计数器加1
if(Count>=CountNum) //到达预计数值
{ Count=0; //清零
Sec=1; //置位1s到标志
SecValue++; //秒值加1
if(SecValue>=60)
SecValue=0; //秒从0计到59
}
}
void Init()
{ TMOD=0x01;
TH0=TH0Val;
TL0=TL0Val;
ET0=1; //开T0中断
EA=1; //开总中断
TR0=1; //T0开始运行
}
void main()
{ uchar i;
Init(); //初始化
for(i=0;i<=4;i++)
DispBuf[i]=Hidden; //显示器前四位消隐
DispBuf[4]=SecValue/10;
DispBuf[5]=SecValue%10;
for(;;)
{
if(Sec) //1s时间到
{ DispBuf[4]=SecValue/10;
DispBuf[5]=SecValue%10;
if(DispBuf[4]==0)
DispBuf[4]=Hidden; //高位0消隐
Sec=0; //清除1秒到的标志
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?