ht1380_time3.lst
来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 430 行 · 第 1/2 页
LST
430 行
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:40:48 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE HT1380_TIME3
OBJECT MODULE PLACED IN ht1380_time3.OBJ
COMPILER INVOKED BY: D:\SOFTWARE\kkk\C51\BIN\C51.EXE ht1380_time3.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2
3 /*****定义ht1380芯片接口********/
4 // ht1380 ht1380_sclk --->P1.0
5 // ht1380 I/O --->P1.1
6 // ht1380 ht1380_rest --->P1.2
7 sbit ht1380_sclk=P1^0;
8 sbit ht1380_data=P1^1;
9 sbit ht1380_rest=P1^2;
10 sbit beep=P1^7;
11 bit flag=0;
12 bit flag2=0;
13 /**********定义两个全局变量*********/
14 //定义数组变量用于存放四个数码管的显示数据
15 //定义number存放动态显示是第几个数码管
16 unsigned char d[4],number;
17
18 /*********定义时间变量年月日时分秒***********/
19 unsigned char year,month,day,hour,minute,second,callhour,callminute,callsecond,rehour,reminute,resecond,ca
-llhour2,callminute2,callsecond2;
20 /**********定义冒号变量 distime=1 是数码管冒号显示出来************/
21 bit distime;
22
23 /*******与数码管相关的两个表*********/
24 //一个显示译码表 //注:这里表比前一个多了一个值,最后一个数代表空显示
25 //一个使能译码表
26 unsigned char code tab[11]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0};
27 unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
28
29 /******延时程序***********/
30 void delay(unsigned char dy)
31 {
32 1 while(--dy);
33 1 }
34
35 /******按键接口描述********/
36 //左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4
37 //左第一个按键键值为1
38 //左第二个按键键值为2
39 //左第三个按键键值为3
40 //左第四个按键键值为4
41
42 /******读取按键子程序 getkey()*************/
43 unsigned char getkey (void)
44 { unsigned char k,m,tem,keytem;
45 1 unsigned int j=0;
46 1 keytem=0;
47 1
48 1 tem=P2 & 0xf0; //第一次读取按键值
49 1 if(tem!=0xf0) //判断有无按键按下
50 1 {
51 2 for(k=0;k<20;k++)
52 2 delay(250); //延时一段时间
53 2 tem=P2 & 0xf0; //再次读取按键值
54 2 if(tem!=0xf0)
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:40:48 PAGE 2
55 2 { if(tem==0x70) keytem=1; //表示左第一个按键按下
56 3 else if(tem==0xb0) keytem=2; //表示左第二个按键按下
57 3 else if(tem==0xd0) keytem=3; //表示左第三个按键按下
58 3 else if(tem==0xe0) keytem=4; //表示左第四个按键按下
59 3 }
60 2 }
61 1
62 1 while(tem!=0xf0)
63 1 {
64 2 for(m=0;m<250;m++)
65 2 delay(250),j++;
66 2 tem=P2 & 0xf0; //等待按键释放
67 2 if (tem==0x70&&j>500)
68 2 {
69 3 flag=1;
70 3
71 3 }
72 2
73 2
74 2 if (tem==0xb0&&j>500)
75 2 {
76 3 flag2=1;
77 3
78 3 }
79 2 }
80 1 return(keytem); //返回按键值
81 1 }
82
83 /******* ht1380 子程序*****************/
84 //------------- sent_char to ht1380----------
85 //上升沿写入
86 void sent_char(unsigned char sentchar)
87 {
88 1 unsigned char ii;
89 1
90 1 for(ii=0;ii<8;ii++)
91 1 {
92 2 ht1380_sclk=0;
93 2 if ((sentchar & 1)!=0) ht1380_data=1;
94 2 else ht1380_data=0;
95 2 ht1380_sclk=1;
96 2 sentchar=sentchar>>1;
97 2 }
98 1 }
99 //------------- get_char from ht1380---------
100 unsigned char get_char()
101 {
102 1 unsigned char getchar,ii,temp;
103 1 getchar=0;temp=1;
104 1 for(ii=0;ii<8;ii++)
105 1 {
106 2 ht1380_sclk=0;
107 2 ht1380_data=1;
108 2 if(ht1380_data==1) getchar=getchar |temp;
109 2 ht1380_sclk=1;
110 2 temp=temp<<1;
111 2 }
112 1 return(getchar);
113 1 }
114
115 //-------------set_wp_off------------------
116 void set_wp_off()
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:40:48 PAGE 3
117 {
118 1 ht1380_rest=1;
119 1 sent_char(0x8e); //10001110b
120 1 sent_char(0); //00000000b
121 1 ht1380_sclk=0;
122 1 ht1380_rest=0;
123 1 }
124 //-----------set_wp_on--------------------
125 void set_wp_on()
126 {
127 1 ht1380_rest=1;
128 1 sent_char(0x8e); //10001110b
129 1 sent_char(0x80); //10000000b
130 1 ht1380_sclk=0;
131 1 ht1380_rest=0;
132 1 }
133 //----------read_time --------------------
134 void read_time()
135 {
136 1 unsigned char temp;
137 1 ht1380_rest=1;
138 1 sent_char(0xbf); //10111111b
139 1 second=get_char();
140 1 minute=get_char();
141 1 hour= get_char();
142 1 day= get_char();
143 1 month= get_char();
144 1 temp= get_char(); /* week day */
145 1 year= get_char();
146 1 temp= get_char();
147 1 ht1380_sclk=0;
148 1 ht1380_rest=0;
149 1
150 1 }
151 //--------------set time-----------------
152 void set_time()
153 {
154 1 set_wp_off();
155 1 ht1380_rest=1;
156 1 sent_char(0xbe); //10111110b
157 1 sent_char(second);
158 1 sent_char(minute);
159 1 sent_char(hour);
160 1 sent_char(day);
161 1 sent_char(month);
162 1 sent_char(1); /* week day */
163 1 sent_char(year);
164 1 sent_char(0);
165 1 ht1380_sclk=0;
166 1 ht1380_rest=0;
167 1 set_wp_on();
168 1 }
169
170 /*****定时器初始化程序*******/
171 void Init_Timer (void)
172 {
173 1 TMOD=0x21;
174 1 TH0=(65536-1000)/256;
175 1 TL0=(65536-1000)%256;
176 1 TR0=1;
177 1 ET0=1;
178 1 EA=1;
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:40:48 PAGE 4
179 1 }
180
181 /*****定时器0中断服务程序******/
182 //显示处理,具体可以参考前面的实验
183 void timer0() interrupt 1 using 1
184 {
185 1 TH0=(65536-1000)/256;
186 1 TL0=(65536-1000)%256;
187 1 number=number++;
188 1 if(number>3) number=0;
189 1 P2=digit[number];
190 1 P0=tab[d[number]];
191 1 //在第二个数码管显示时,将最高位的小数点显示出来,这里为冒号
192 1 if(distime==1 && number==1)
193 1 P0=tab[d[number]]+0x80;
194 1 }
195 /*******主函数***********/
196 //效果:
197 //显示时分
198 //可用按键调整时间-时分
199 //在较时状态时,相应的数字闪烁
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?