如何在电脑桌面上显示个时钟。

如何在电脑桌面上显示个时钟。,第1张

如何在电脑桌面上显示个时钟可以这样解决:

1、点击开始,选择控制面板。

2、在控制面板,查看方式选择小图标,找到桌面小工具。

3、在桌面小工具界面你可以看到很多不同的小工具,选中需要的小工具,然后右键添加,就可以将工具添加到桌面上。

4、上面是系统自带的功能,我们也可以自己从网上下载桌面工具软件,直接从百度搜索,然后下载安装。

5、打开软件后可以看到更多更齐全的小工具。

6、然后需要什么工具,直接打开这个工具就会出现在桌面上。

7、当然我们添加后肯定也想删除,直接将鼠标放在桌面工具上,右侧会出现小叉叉,直接点击就可以了,非常方便。

这就是如何在电脑桌面上显示个时钟的解决步骤。

顶层文件 万年历C #include<reg51h> #include "LCD1602h" #include "DS1302h" #define uchar unsigned char #define uint unsigned int sbit speaker=P2^4; bit key_flag1=0,key_flag2=0; SYSTEMTIME adjusted; uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0; uchar data_alarm[7]={0}; /键盘控制/ int key_scan() //扫描是否有键按下 { int i=0; uint temp; P1=0xf0; temp=P1; if(temp!=0xf0) i=1; else i=0; return i; } uchar key_value() //确定按键的值 { uint m=0,n=0,temp; uchar value; uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'} ; P1=0xfe; temp=P1; if(temp!=0xfe)m=0; P1=0xfd;temp=P1 ;if(temp!=0xfd)m=1; P1=0xfb;temp=P1 ;if(temp!=0xfb)m=2; P1=0xf7;temp=P1 ;if(temp!=0xf7)m=3; P1=0xef;temp=P1 ;if(temp!=0xef)n=0; P1=0xdf;temp=P1 ;if(temp!=0xdf)n=1; P1=0xbf;temp=P1 ;if(temp!=0xbf)n=2; value=v[m][n]; return value; } /设置闹铃函数/ void naoling(void) { uchar i=0,l=0,j; init1602(); while(key_flag2&&i<12) if(key_scan()){j=key_value();write_data(j);if(i%2==0)data_alarm[l]=(j-'0')10;else {data_alarm[l]+=(j-'0');l++;}i++;delay(600);} write_com(0x01); } uchar according(void) { uchar k; if(data_alarm[0]==adjustedYear&&data_alarm[1]==adjustedMonth&&data_alarm[2]==adjustedDay&&data_alarm[3]==adjustedHour&&data_alarm[4]==adjustedMinute&&data_alarm[5]==adjustedSecond) k=1; else k=0; return k; } void speak(void) {uint i=50; while(i) {speaker=0; delay(1); speaker=1; delay(1); i--; } } void alarm(void) {uint i=10; while(i) { speak(); delay(10); i--; } } /修改时间 *** 作/ void reset(void) { sec_add=0; min_add=0; hou_add=0; day_add=0; mon_add=0; yea_add=0 ; } void adjust(void) { if(key_scan()&&key_flag1) switch(key_value()) {case '0':sec_add++;break; case '1':min_add++;break; case '2':hou_add++;break; case '3':day_add++;break; case '4':mon_add++;break; case '5':yea_add++;break; case 'b':reset();break; default: break; } adjustedSecond+=sec_add; adjustedMinute+=min_add; adjustedHour+=hou_add; adjustedDay+=day_add; adjustedMonth+=mon_add; adjustedYear+=yea_add; if(adjustedSecond>59) adjustedSecond=adjustedSecond%60; if(adjustedMinute>59) adjustedMinute=adjustedMinute%60; if(adjustedHour>23) adjustedHour=adjustedHour%24; if(adjustedDay>31) adjustedDay=adjustedDay%31; if(adjustedMonth>12) adjustedMonth=adjustedMonth%12; if(adjustedYear>100) adjustedYear=adjustedYear%100; } /中断处理函数/ void changing(void) interrupt 0 using 0 //需要修改时间和日期,或者停止修改 { if(key_flag1)key_flag1=0; else key_flag1=1; } void alarming(void) interrupt 3 using 0 //需要设置闹铃或者停止设置 { if(key_flag2)key_flag2=0; else key_flag2=1; } /主函数/ main() {uint i; uchar l; uchar p1[]="D:",p2[]="T:"; SYSTEMTIME T; EA=1; EX0=1; IT0=1; EA=1; EX1=1; IT1=1; init1602(); Initial_DS1302() ; while(1) { write_com(0x80); write_string(p1,2); write_com(0xc0); write_string(p2,2); DS1302_GetTime(&T) ; adjustedSecond=TSecond; adjustedMinute=TMinute; adjustedHour=THour; adjustedWeek=TWeek; adjustedDay=TDay; adjustedMonth=TMonth; adjustedYear=TYear; for(i=0;i<9;i++) { adjustedDateString[i]=TDateString[i]; adjustedTimeString[i]=TTimeString[i]; } adjust(); if(key_flag2)naoling(); if(according())alarm(); DateToStr(&adjusted); TimeToStr(&adjusted); write_com(0x82); write_string(adjustedDateString,8); write_com(0xc2); write_string(adjustedTimeString,8); delay(10); } (二)头文件1 显示模块 LCD1602H #ifndef LCD_CHAR_1602_2009_5_9 #define LCD_CHAR_1602_2009_5_9 #define uchar unsigned char #define uint unsigned int sbit lcdrs = P2^0; sbit lcdrw = P2^1; sbit lcden = P2^2; void delay(uint z) // 延时 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) // 写入指令数据到 lcd { lcdrw=0; lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) // 写入字符显示数据到 lcd { lcdrw=0; lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void init1602() // 初始化设定 { lcdrw=0; lcden=0; write_com(0x3C); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); } void write_string(uchar pp,uint n) { int i; for(i=0;i<n;i++) write_data(pp[i]); } #endif (三)头文件2 时钟模块 DS1302H #ifndef _REAL_TIMER_DS1302_2009_5_20_ #define _REAL_TIMER_DS1302_2003_5_20_ sbit DS1302_CLK = P2^6; //实时时钟时钟线引脚 sbit DS1302_IO = P2^7; //实时时钟数据线引脚 sbit DS1302_RST = P2^5; //实时时钟复位线引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; typedef struct SYSTEM_TIME { unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[9]; //用这两个字符串来放置读取的时间 unsigned char TimeString[9]; }SYSTEMTIME; //定义的时间类型 #define AM(X) X #define PM(X) (X+12) // 转成24小时制 #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_RAM(X) (0xC0+(X)2) //用于计算 DS1302_RAM 地址的宏 /内部指令/ void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) { unsigned char i; ACC = d; for(i=8; i>0; i--) { DS1302_IO = ACC0; DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0; } } unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) { unsigned char i; for(i=8; i>0; i--) { ACC = ACC >>1; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; } return(ACC); } // void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据 { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; } unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据 { unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); } void DS1302_SetProtect(bit flag) //是否写保护 { if(flag) Write1302(0x8E,0x10); else Write1302(0x8E,0x00); } void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数 { DS1302_SetProtect(0); Write1302(Address, ((Value/10)<<4 | (Value%10))); //将十进制数转换为BCD码 } //在DS1302中的与日历、时钟相关的寄存器存放的数据必须为BCD码形式 void DS1302_GetTime(SYSTEMTIME Time) { unsigned char ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); //将BCD码转换为十进制数 ReadValue = Read1302(DS1302_MINUTE); Time->Minute = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_HOUR); Time->Hour = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_DAY); Time->Day = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_WEEK); Time->Week = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MONTH); Time->Month = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time->Year = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); } unsigned char DataToBCD(SYSTEMTIME Time) { unsigned char D[8]; D[0]=Time->Second/10<<4+Time->Second%10; D[1]=Time->Minute/10<<4+Time->Minute%10; D[2]=Time->Hour/10<<4+Time->Hour%10; D[3]=Time->Day/10<<4+Time->Day%10; D[4]=Time->Month/10<<4+Time->Month%10; D[5]=Time->Week/10<<4+Time->Week%10; D[6]=Time->Year/10<<4+Time->Year%10; return D; } void DateToStr(SYSTEMTIME Time) { //将十进制数转换为液晶显示的ASCII值 Time->DateString[0] = Time->Year/10 + '0'; Time->DateString[1] = Time->Year%10 + '0'; Time->DateString[2] = '-'; Time->DateString[3] = Time->Month/10 + '0'; Time->DateString[4] = Time->Month%10 + '0'; Time->DateString[5] = '-'; Time->DateString[6] = Time->Day/10 + '0'; Time->DateString[7] = Time->Day%10 + '0'; Time->DateString[8] = '\0'; } void TimeToStr(SYSTEMTIME Time) { //将十进制数转换为液晶显示的ASCII值 Time->TimeString[0] = Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour%10 + '0'; Time->TimeString[2] = ':'; Time->TimeString[3] = Time->Minute/10 + '0'; Time->TimeString[4] = Time->Minute%10 + '0'; Time->TimeString[5] = ':'; Time->TimeString[6] = Time->Second/10 + '0'; Time->TimeString[7] = Time->Second%10 + '0'; Time->DateString[8] = '\0'; } void Initial_DS1302(void) { unsigned char Second; Second=Read1302(DS1302_SECOND); if(Second&0x80) //初始化时间 DS1302_SetTime(DS1302_SECOND,0); } void DS1302_TimeStop(bit flag) // 是否将时钟停止 { unsigned char Data; Data=Read1302(DS1302_SECOND); DS1302_SetProtect(0); if(flag) Write1302(DS1302_SECOND, Data|0x80); else Write1302(DS1302_SECOND, Data&0x7F); } #endifzftzbpujjj1134358763,jaiezwwysu6517560870,2012-2-15 11:08:28

基于c8051f020单片机最小系统的实时时钟显示程序

c8051f020 FYD12864-0402B LCD显示,按键电子时钟//

#include <c8051f020h>

#include<lcdh>

#include <intrinsh>

#define uchar unsigned char

void lcd_ini();

void DISPInitial();

void ascii_change(void);

void delay();

void wri_add(uchar com);

void wri_dat(uchar com1);

void shan(void);

void disp();

void tkey(void);

void PORT_Init (void);

sbit cs=P1^7;

sbit sid=P1^6;

sbit sclk=P1^5;

bit flag=1;

uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态

uchar data clock[3]={24,00,00};

uchar code clockname[10]={"北京时间:"};

uchar data num[6];

/主程序/

void main()

{

lcd_ini();

count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒

TMOD=0x01;

TL0=0XB0;

TH0=0X3C;

EA=1;

ET0=1;

IT0=1;

EX0=1;

TR0=1;

while(1)

{

back:ascii_change();

disp();

delay();

if(flag==1)

goto back;

tkey();

shan();

delay();

}

}

/lcd初始化/

/void lcd_ini()

{

wri_add(0x30);

delay();

wri_add(0x0c);

delay();

wri_add(0x01);

delay();

wri_add(0x06);

delay();

}/

void PORT_Init (void)

{

XBR0 = 0x00; //不让他连上IO口

XBR1 = 0x14; //允许外部中断连在端口上

XBR2 = 0x40; // Enable crossbar and weak pull-ups

P0MDOUT |= 0x00; // enable TX0 as a push-pull output

// P1MDOUT |= 0x07; // enable P16 (LED) as push-pull output

P2MDOUT=0xfe; //为了驱动步进电机的控制线

//P3MDOUT = 0xFF;

P74OUT=0x00; //配置成漏极方式可以让LCD显示成功 ,我试了配置成推挽方式不能正常显示

}

/定时程序/

void timer1() interrupt 1 using 2

{

TL0=0XB0;

TH0=0X3C;

count--;

if(count==0)

{

count=10;

clock[2]++;//秒//

}

else

goto out;

if(clock[2]==60)

{

clock[2]=0;

clock[1]++;//分//

}

if(clock[1]==60)

{

clock[1]=0;

clock[0]++;

}

if(clock[0]==24)//时//

clock[0]=0;

out:_nop_();

}

/十位个位转换成ASCII码/

void ascii_change(void)

{

num[5]=clock[2]-(clock[2]/10)10+0x30;

num[4]=clock[2]/10+0x30;

num[3]=clock[1]-(clock[1]/10)10+0x30;

num[2]=clock[1]/10+0x30;

num[1]=clock[0]-(clock[0]/10)10+0x30;

num[0]=clock[0]/10+0x30;

}

/廷时程序/

void delay()

{

uchar i,j;

for (i=250;i>0;i--)

for (j=250;j>0;j--);

}

/Write address/

void wri_add(uchar com)

{

uchar i,j,k;

cs=0;

cs=1;

dat=0xf8;

for(i=1;i<=8;i++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat<<1;

}

dat=com;

dat=dat&0xf0;

for(j=1;j<=8;j++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat<<1;

}

dat=com;

dat=_cror_(dat,4);// 此为高低四位交换

dat=dat&0xf0;

for(k=1;k<=8;k++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat<<1;

}

}

/Write data/

void wri_dat(uchar com1)

{

uchar i,j,k;

cs=0;

cs=1;

dat=0xfa;

for(i=1;i<=8;i++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat<<1;

}

dat=com1;

dat=dat&0xf0;

for(j=1;j<=8;j++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat<<1;

}

dat=com1;

dat=_cror_(dat,4);// 此为高低四位交换

dat=dat&0xf0;

for(k=1;k<=8;k++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat<<1;

}

}

/display program/ //显示时间

void disp()

{

uchar i,k=0;

wri_add(0x80);

for (i=1;i<=9;i++)

wri_dat(clockname[i-1]);

wri_add(0x90);

for (i=1;i<=6;i++)

{

k++;

if(k==3||k==5)

wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);

}

}

/闪烁程序/

void shan(void)

{

uchar i,k=0;

wri_add(0x90);

if(f==1)

{

num[0]=' ';

num[1]=' ';

}

else

goto next;

for (i=1;i<=6;i++)

{

k++;

if(k==3||k==5)

wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);

}

goto return1;

next: if(f==2)

{

num[2]=' ';

num[3]=' ';

}

else

goto next1;

for (i=1;i<=6;i++)

{

k++;

if(k==3||k==5)

wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);

}

goto return1;

next1: if(f==3)

{

num[4]=' ';

num[5]=' ';

}

else

goto return1;

for (i=1;i<=6;i++)

{

k++;

if(k==3||k==5)

wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);

}

return1:_nop_();

}

/外部中断/

void intr0() interrupt 0 using 2

{

flag=~flag;//判断是否闪烁位//

TR0=~TR0; //闪关定时否则开定时

f=1;

}

/按键程序/

void tkey(void)

{

uchar judcekey;

judcekey=P1&0x0f;

if(judcekey==0x0f)

goto return2;

/移位键/

if (judcekey==0x0e)

f++;

if (f==4)

f=1;

/加一键/

if(judcekey==0x0d)

{clock[f-1]++;}

if (f==1)

{ if (clock[f-1]==24){

clock[f-1]=0;}

}

else{ if (clock[f-1]==60)

clock[f-1]=0;

}

/减一键/

if(judcekey==0x0b)

{clock[f-1]--;}

if (f==1)

{ if (clock[f-1]==0xff){

clock[f-1]=23;}

}

else

{ if (clock[f-1]==0xff)

clock[f-1]=59;

}

return2:_nop_();

}

//本程序已经调试成功并能够正确执行

一下是一个C语言编写的调动的时钟,

主要是一个清屏函数清除上一秒钟的遗留时间。

根据这个思路你再用C++编写个吧~!

#include <stdioh>

#include <stdlibh>

#include <timeh>

#include <dosh>

int main(void)

{

time_t t;

while(1)

{

time(&t);

printf("Today's date and time:\n%s\n", ctime(&t));

sleep(1);

system("cls");

}

return 0;

}

c++版:

#include <iostreamh>

#include <timeh>

#include <windowsh>

int main(void)

{

time_t t;

while(1)

{

time(&t);

cout<<"Today's date and time:"<<endl<<ctime(&t)<<endl;

Sleep(1000);

system("cls");

}

return 0;

}

#include <stdioh>

struct clock {

int hour;

int minute;

int second;

};

typedef struct clock CLOCK;

/

函数功能:时、分、秒时间的更新

函数参数:无

函数返回值:无

/

void Update(CLOCK myclock) {

myclock->second++;

if (myclock->second == 60) { /若second值为60,表示已过1分钟,则 minute值加1/

myclock->second = 0;

myclock->minute++;

}

if (myclock->minute == 60){ /若minute值为60,表示已过1小时,则 hour值加1/

myclock->minute = 0;

myclock->hour++;

}

if (myclock->hour == 24) { /若hour值为24,则hour的值从0开始计时/

myclock->hour = 0;

}

}

/

函数功能:时、分、秒时间的显示

函数参数:无

函数返回值:无

/

void Display(CLOCK myclock) { /用回车符'\r'控制时、分、秒显示的位置/

printf("%2d:%2d:%2d\r", myclock->hour, myclock->minute, myclock->second);

}

/

函数功能:模拟延迟1秒的时间

函数参数:无

函数返回值:无

/

void Delay(void) {

long t;

for (t = 0; t < 290000000; t++) {

/循环体为空语句的循环,起延时作用/

}

}

int main(){

CLOCK myclock;

long i;

myclockhour = myclockminute = myclocksecond = 0; /hour,minute,second赋初值0/

for (i = 0; i < 100000; i++) { /利用循环结构,控制时钟运行的时间/

Update(&myclock); /时钟更新/

Display(&myclock); /时间显示/

Delay(); /模拟延时1秒/

}

return 0;

}

KEYVAL EQU 30H

KEYTM EQU 31H

KEYSCAN EQU 32H

DAT EQU 33H

SCANLED EQU 39H

CLK EQU 77H

SEC EQU 78H

MIN EQU 79H

HOUR EQU 7AH

PAUSE BIT 00H

DOT BIT 01H

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR ;50ms定时

ORG 001BH

LJMP T1ISR ;扫描显示

ORG 0030H

MAIN:

MOV SP,#5FH

MOV TMOD,#11H

MOV TH0,#03CH

MOV TL0,#0B0H

MOV TH1,#0ECH

MOV TL1,#078H

MOV KEYVAL,#0

MOV SCANLED,#0

MOV 33H,#10H

MOV 34H,#10H

MOV 35H,#10H

MOV 36H,#10H

MOV 37H,#10H

MOV 38H,#10H

MOV SEC,#0

MOV MIN,#0

MOV HOUR,#0

MOV CLK,#0

CLR PAUSE

SETB EA

SETB ET1

SETB TR1

LOOP:

LCALL KEYSEL

MOV A,KEYVAL

CJNE A,#0FFH,LOOP1

SJMP LOOP

LOOP1:

CJNE A,#10,LOOP2 ;“ON”启动

SETB TR0

SETB ET0

SETB PAUSE

SJMP LOOP

LOOP2:

CJNE A,#11,LOOP3 ;“=”清零

MOV SEC,#0

MOV MIN,#0

MOV HOUR,#0

LCALL DISCHG

SJMP LOOP

LOOP3:

CJNE A,#15,LOOP4 ;“+”暂停

CLR TR0

CLR ET0

CLR PAUSE

SJMP LOOP

LOOP4:

CJNE A,#14,LOOP5 ;“-”清显示暂停

MOV 33H,#10H

MOV 34H,#10H

MOV 35H,#10H

MOV 36H,#10H

MOV 37H,#10H

MOV 38H,#10H

CLR TR0

CLR ET0

CLR PAUSE

SJMP LOOP

LOOP5:

CJNE A,#10,LOOP6 ;数字键

LOOP6:

JC LOOP7

LJMP LOOP

LOOP7:

JNB PAUSE,LOOP8 ;暂停状态可以输入数字键

LJMP LOOP

LOOP8:

MOV 33H,34H

MOV 34H,35H

MOV 35H,36H

MOV 36H,37H

MOV 37H,38H

MOV 38H,KEYVAL

MOV A,33H

SWAP A

ORL A,34H

LCALL BCDH

MOV HOUR,A

MOV A,35H

SWAP A

ORL A,36H

LCALL BCDH

MOV MIN,A

MOV A,37H

SWAP A

ORL A,38H

LCALL BCDH

MOV SEC,A

LJMP LOOP

;------------------

;BCD转换为十六进制

BCDH:

MOV B,#10H

DIV AB 

MOV R7,B

MOV B,#10

MUL AB 

ADD A,R7

RET 

;------------------

;十六进制转换为BCD

HBCD:

MOV B,#10

DIV AB 

SWAP A 

ORL A,B

RET 

;------------------

KEYSEL:

MOV KEYVAL,#0

MOV KEYSCAN,#0EFH

LCALL GETKEY

MOV A,KEYTM

JZ KEYS1

MOV KEYVAL,A

SJMP KEYRTN

KEYS1:

MOV KEYSCAN,#0DFH

LCALL GETKEY

MOV A,KEYTM

JZ KEYS2

CLR C

ADD A,#4

MOV KEYVAL,A

SJMP KEYRTN

KEYS2:

MOV KEYSCAN,#0BFH

LCALL GETKEY

MOV A,KEYTM

JZ KEYS3

CLR C

ADD A,#8

MOV KEYVAL,A

SJMP KEYRTN

KEYS3:

MOV KEYSCAN,#7FH

LCALL GETKEY

MOV A,KEYTM

JZ KEYRTN

CLR C

ADD A,#12

MOV KEYVAL,A

KEYRTN:

LCALL CHGKEY

RET

;--------------------

GETKEY:

MOV KEYTM,#0

MOV A,KEYSCAN

MOV P3,A

NOP

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY

MOV R2,#10

LCALL DELAY

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY

MOV A,P3

ANL A,#0FH

MOV R7,A

SF:

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ SF

MOV A,R7

CJNE A,#0EH,NK1

MOV KEYTM,#1

SJMP NOKEY

NK1:

CJNE A,#0DH,NK2

MOV KEYTM,#2

SJMP NOKEY

NK2:

CJNE A,#0BH,NK3

MOV KEYTM,#3

SJMP NOKEY

NK3:

CJNE A,#07H,NOKEY

MOV KEYTM,#4

NOKEY: RET

;--------------------

DELAY:

MOV R3,#50

DELAY1:

MOV R4,#100

DJNZ R4,$

DJNZ R3,DELAY1

DJNZ R2,DELAY

RET

;--------------------

T0ISR:

PUSH ACC

CLR TR0

MOV TH0,#3CH

MOV TL0,#0B0H

SETB TR0

INC CLK

MOV A,CLK

CJNE A,#20,T0ISRE

MOV CLK,#0

INC SEC

MOV A,SEC

CJNE A,#60,T0ISRE

MOV SEC,#0

INC MIN

MOV A,MIN

CJNE A,#60,T0ISRE

MOV MIN,#0

INC HOUR

MOV A,HOUR

CJNE A,#24,T0ISRE

MOV SEC,#0

MOV MIN,#0

MOV HOUR,#0

T0ISRE:

LCALL DISCHG

POP ACC

RETI

;--------------------

DISCHG:

MOV A,HOUR

LCALL HBCD

PUSH ACC

ANL A,#0FH

MOV 34H,A

POP ACC

ANL A,#0F0H

SWAP A

MOV 33H,A

MOV A,MIN

LCALL HBCD

PUSH ACC

ANL A,#0FH

MOV 36H,A

POP ACC

ANL A,#0F0H

SWAP A

MOV 35H,A

MOV A,SEC

LCALL HBCD

PUSH ACC

ANL A,#0FH

MOV 38H,A

POP ACC

ANL A,#0F0H

SWAP A

MOV 37H,A

RET

;--------------------

T1ISR:

PUSH ACC

CLR TR1

MOV TH1,#0ECH

MOV TL1,#78H

SETB TR1

MOV DPTR,#LEDTAB

T100:

MOV R0,#DAT

MOV A,SCANLED

ADD A,R0

MOV R0,A

MOV A,SCANLED

JNZ T101

MOV P2,#01H

CLR DOT

SJMP T1DIS

T101:

DEC A

JNZ T102

MOV P2,#02H

SETB DOT

SJMP T1DIS

T102:

DEC A

JNZ T103

MOV P2,#04H

CLR DOT

SJMP T1DIS

T103:

DEC A

JNZ T104

MOV P2,#08H

SETB DOT

SJMP T1DIS

T104:

DEC A

JNZ T105

MOV P2,#10H

CLR DOT

SJMP T1DIS

T105:

MOV P2,#20H

CLR DOT

T1DIS:

MOV A,@R0

MOVC A,@A+DPTR

JNB DOT,T1DIS1

ORL A,#01H

T1DIS1:

CPL A

MOV P0,A

INC SCANLED

MOV A,SCANLED

CJNE A,#6,T1END

MOV SCANLED,#0

T1END:

POP ACC

RETI

;--------------------

CHGKEY:

MOV A,KEYVAL

JZ KV16

DEC A

JNZ KV01

MOV KEYVAL,#7

RET

KV01:

DEC A

JNZ KV02

MOV KEYVAL,#4

RET

KV02:

DEC A

JNZ KV03

MOV KEYVAL,#1

RET

KV03:

DEC A

JNZ KV04

MOV KEYVAL,#10

RET

KV04:

DEC A

JNZ KV05

MOV KEYVAL,#8

RET

KV05:

DEC A

JNZ KV06

MOV KEYVAL,#5

RET

KV06:

DEC A

JNZ KV07

MOV KEYVAL,#2

RET

KV07:

DEC A

JNZ KV08

MOV KEYVAL,#0

RET

KV08:

DEC A

JNZ KV09

MOV KEYVAL,#9

RET

KV09:

DEC A

JNZ KV10

MOV KEYVAL,#6

RET

KV10:

DEC A

JNZ KV11

MOV KEYVAL,#3

RET

KV11:

DEC A

JNZ KV12

MOV KEYVAL,#11

RET

KV12:

DEC A

JNZ KV13

MOV KEYVAL,#12

RET

KV13:

DEC A

JNZ KV14

MOV KEYVAL,#13

RET

KV14:

DEC A

JNZ KV15

MOV KEYVAL,#14

RET

KV15:

DEC A

JNZ KV16

MOV KEYVAL,#15

RET

KV16:

MOV KEYVAL,#0FFH

RET

;--------------------

LEDTAB: DB 0FCH ;"0" 00H

DB 60H ;"1" 01H

DB 0DAH ;"2" 02H

DB 0F2H ;"3" 03H

DB 66H ;"4" 04H

DB 0B6H ;"5" 05H

DB 0BEH ;"6" 06H

DB 0E0H ;"7" 07H

DB 0FEH ;"8" 08H

DB 0F6H ;"9" 09H

DB 0EEH ;"A" 0AH

DB 3EH ;"B" 0BH

DB 9CH ;"C" 0CH

DB 7AH ;"D" 0DH

DB 9EH ;"E" 0EH

DB 8EH ;"F" 0FH

DB 00H ;" " 10H

;--------------------

END

以上就是关于如何在电脑桌面上显示个时钟。全部的内容,包括:如何在电脑桌面上显示个时钟。、跪求:液晶LCD1602显示时钟的C程序!、用汇编语言做单片机时钟显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9828843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存