1、 i 。while (!(OSCXCN & 0x80 /等待外部晶振稳定OSCICN = 0x88。 /选择外部晶振作系统时钟源,允许时钟丢失检测/* 端口初始化 */XBR0XBR1XBR2=0x07 /允许 SMBus、SPI0 和 UART0= 0x00。= 0x44。 /使能交叉开关和弱上拉void PORT_Init (void/* 定时器 T0 初始化 */void Timer0_Init (voidCKCON|=0x8。 /T0 按系统时钟频率计数 TMOD|=0x1 。 /T0 方式 1 Count1ms=10 。TR0 = 0。 / 停止 T0TH0 = (-SYSCLK/1
2、000 。8 /定时 1ms 的时间常数TLO = -SYSCLK/10Q0TR0 = 1。 / 启动 T0IE|= 0x2。 / 开 T0 中断/* 定时器T0中断服务程序 每隔1ms中断1次)*/ void Timer0_ISR (void interrupt 18 /重新装入初值TL0 = -SYSCLK/1000if (Count1ms Count1ms- 。 / 定时时间减 1/* 延时T卩s软件实现)*/ void Delay1us(unsigned char Twhile (T_nop_( 。 _nop_(。-T。/* 延时 Tms定时器 T0 实现)*/ void Delay1
3、ms(unsigned char TCount1ms=T。while (Count1ms 。 /在 T0 中断服务程序中减 1/* 延时Ts碇时器T0实现)*/ void Delay1s(unsigned char TDelay1ms(200。T-。void Send7279Byte(unsigned char chchar i 。SELECT7279 / 置 CS低电平Delay1us(50 / 延时 50 卩for (i=0 。 i / 输出 1 位到 HD7279A 的 DATA端Set7279DAT。else Clr7279DAT。Set7279CLK。ch=chClr7279CLK。
4、Clr7279DAT。 /发送完毕,DATA端置低,返回/* 仿真I2C总线时序接收一字节 */unsigned char Receive7279Byte(voidunsigned char i,ch=0 。 /DATA 端置为高电平 ch+=1。 /接收 1 位数据 /接收完毕,DATA端重新置成低电平(输出状态return ch 。/* 让第 No(0 至U 5位 LED 闪烁 */void FlashLED(unsigned char Nounsigned char i。Send7279Byte(0x88 /发闪烁指令i=0x01 。while (No / 将 1 移到第 No 位i=i
5、 /0 闪烁、 1 不闪烁NOSELECT7279/*HD7279A 左移命令 */void MoveLeft(void Send7279Byte(0xA1 / 发左移指令* 采用不译码方式显示时数字 o到f的段码*unsigned char code BdSeg=ox7e,ox3o,ox6d,ox79, / o 1 2 3 ox33,ox5b,ox5f,ox7o, / 4 5 6 7 ox7f,ox7b,ox77,ox1f, / 8 9 a b ox4e,ox3d,ox4f,ox47, / c d e f oxoo,oxo1。/*显示指针DispBuf所指6个单元数据,点亮第 ShowDot
6、 char i,ch。ShowDot-。ich=DispBufi 。 /取一字符if (ch=a & (ch /用不译码方式显示在第 i位if (ch= /发送不译码方式显示命令的第 2字节Send7279Byte(oxooelse if (ch=-Send7279Byte(oxo1elseif (ShowDot=i / 查表显示,同时点亮小数点 Send7279Byte(0x80|BdSegch&0x0felse Send7279Byte(BdSegch&NOSELECT7279 / 置 CS高电平/* 读取按键值 */ unsigned char GetKeyValue(voidunsig
7、ned char KeyValue。if(CPT1CN&0x40 return -1 。 /if (P17=1 /无键按下Send7279Byte(0x15 / 发读键盘命令 KeyValue=Receive7279Byte(return KeyValue 。/* 等待按键释放,用 C8051F020 的比较器硬件检测 ,也可以用软件延时实现 */ void WaitKeyOff(void(CPT1CN&/* 显示任意长整型数据 */void DispValue(unsigned long xxunsigned char buf6 。 buf0=(xx%1000000/100000 。 / 最
8、高位 buf1=(xx%100000/10000 。buf2=(xx%10000/1000 。 buf3=(xx%1000/100 。buf4=(xx%100/10 。 buf5=(xx%10 / 最低位DispLED(buf,0 / 调用显示函数,所有小数点都不点亮*/*从键盘读取6位数据,用于存储时间,格式是 HHMMSS,所读数据转换成长整型un sig ned long In putNum(voidunsigned long Num=0 。unsigned char i=0, KeyValue。DispLED( -,0/输入提示 FlashLED(0 /第一位闪烁Delay1s(1/在
9、最高位 第5位)LED显示小时的高位/在第4位LED显示小时的低位/在第3位LED显示分钟的高位II在第2位LED显示分钟的低位/在第1位LED显示秒钟的高位II在第0位LED显示秒钟的低位II在最高位 第5位)LED显示小时的高位II在第4位LED显示小时的低位while(1 KeyValue=GetKeyValue(。if (i=6 /6 位数据输入完,返回FlashLED(8。 / 关闪烁return Num 。if(KeyValue=0 & (KeyValue=9 / 只接收十进制的 0 到 9 i+。Send7279Byte(0xC8。 /发送键码值,按方式 1 译码下载显示 Sen
10、d7279Byte(KeyValue。MoveLeft( 。 /显示并左移一位,仍使低位显示并闪烁。Send7279Byte(0x90。Send7279Byte(0x01。WaitKeyOff(。Num*=10 。 /转换成十进制Num+=KeyValue。Delay1ms(500。 void DispTime(voidSend7279Byte(0x85。Send7279Byte(HourH。Send7279Byte(0x84。Send7279Byte(HourL。Send7279Byte(0x83。Send7279Byte(MinuteH 。Send7279Byte(0x82。Send727
11、9Byte(MinuteL 。Send7279Byte(0x81。 Send7279Byte(SecondH。Send7279Byte(0x80。Send7279Byte(SecondL。 void mDispTime(void Send7279Byte(mHourH。Send7279Byte(mHourLSend7279Byte(0x83 /在第3位LED显示分钟的高位Send7279Byte(mMinuteHSend7279Byte(0x82 /在第2位LED显示分钟的低位Send7279Byte(mMinuteLSend7279Byte(0x81 /在第1位LED显示秒钟的高位Send7
12、279Byte(mSecondHSend7279Byte(0x80 /在第0位LED显示秒钟的低位Send7279Byte(mSecondLvoid set_time(unsigned long CurrentTime=0 。do /从键盘输入时间,格式 HHMMSSCurrentTime=InputNum(DispValue(CurrentTimeNowTime0=(unsigned char(CurrentTime/1000004 / 时 CurrentTime=CurrentTime%100000 。NowTime0=NowTime0|(CurrentTime/10000 Current
13、Time=CurrentTime%10000 。NowTime1=(unsigned char(CurrentTime/1000 / 分 CurrentTime=CurrentTime%1000 。NowTime1=NowTime1|(CurrentTime/100 CurrentTime=CurrentTime%100 。NowTime2=(unsigned char(CurrentTime/10 / 秒CurrentTime=CurrentTime%10 。 NowTime2=NowTime2|CurrentTime 。while (NowTime00x24|(NowTime10x59|(
14、NowTime2 HourH=NowTime0/16 。 / 转换成 10 进制HourL=NowTime0%16 。MinuteH=NowTime1/16 。MinuteL=NowTime1%16 。SecondH=NowTime2/16 。SecondL=NowTime2%16。unsigned long set_InputNum(voidint c=0。 / 输入提示FlashLED(0while(1KeyValue=GetKeyValue(if (i=6 /6 位数据输入完,返回FlashLED(8if(KeyValue=0 (KeyValue / 只接收十进制的 0 到 9i+。Se
15、nd7279Byte(0xC8 /发送键码值,按方式 1 译码下载显示Send7279Byte(KeyValueMoveLeft(Send7279Byte(0x90Send7279Byte(0x01WaitKeyOff(if (SecondL9 SecondH+,SecondL=0。 if(SecondH5SecondH=0,MinuteL+。 if (MinuteL MinuteH+,MinuteL=0 。 if(MinuteHMinuteH=0,HourL+ 。 if(HourL HourH+ 。 Hour L=0。 if(HourH2 HourH=0 。if(HourH=2(HourL3
16、HourH=0。HourL=0。c+。 Delay1ms(500if(c%2=0SecondL+。void set_ring(CurrentTime=set_InputNum( / 时CurrentTime=CurrentTime%100000 。 NowTime0=NowTime0|(CurrentTime/10000 / 分CurrentTime=CurrentTime%1000 。NowTime2=NowTime2|CurrentTime 。 setHourH=NowTime0/16 。/ 转换成 10 进制 setHourL=NowTime0%16 。setMinuteH=NowTim
17、e1/16 。 setMinuteL=NowTime1%16 。 setSecondH=NowTime2/16 。 setSecondL=NowTime2%16 。void m(unsigned char control_keyvalue 。int ma=0 。int a=1 。CurrentTime=CurrentTime%10000 。CurrentTime=CurrentTime%100 。 mHourH=NowTime0/16 。/ 转换成 10 进制 mHourL=NowTime0%16 。mMinuteH=NowTime1/16 。 mMinuteL=NowTime1%16 。 m
18、SecondH=NowTime2/16 。 mSecondL=NowTime2%16 。Delay1ms(200 ma+。if(ma%5=0mSecondL+。if (mSecondL mSecondH+,mSecondL=0。 if(mSecondHmSecondH=0,mMinuteL+ 。if (mMinuteL mMinuteH+,mMinuteL=0 。 if(mMinuteHmMinuteH=0,mHourL+ 。if(mHourL mHourH+ 。 mHourL=0 。 if(mHourH mHourH=0 。 if(mHourH=2(mHourL3mHourH=0 。 control_keyvalue=GetKeyValue( if(control_keyvalue=14break 。 if(control_keyvalue=10a=-a 。if(a=-1&ma%5=0mSecondL- 。 mDispTime( if(SecondH HourL=0。 SecondL+。void main(voidi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1