📄 ex5-1.lst
字号:
C51 COMPILER V8.02 EX5_1 09/08/2007 22:54:58 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE EX5_1
OBJECT MODULE PLACED IN ex5-1.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE ex5-1.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 标题:范例 5-1
3 版本:1.0
4 Target:89S51
5 程序描述:这个范例说明如何使用8051 的Port 1连接到四颗七段显示器,
6 PORT 0的低4位分别控制这四颗共阳七段显示器,让四颗共阳七段显示器
7 使用扫描的方式轮流显示数字。这四颗七段显示器将显示出自数字时钟
8 PORT 2的P2.0和P2.1分别连接到2个弹跳按钮。*/
9 /* ***************************************************** */
10 #include <REGX51.H>
11 #define TIMER0_COUNT 0xEE18
12 /*10000h-(12,000,000/(12*200)) */
13 #define TRUE 1
14 #define FALSE 0
15 #define TIMES 25
16 #define DISPLAY 0
17 #define SET 1
18 const seven_seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,
19 0X80,0X90};const scan[4]={0X0E,0X0D,0X0B,0X07};
20 typedef struct {
21 char hour;
22 char minute;
23 char second;
24 } time;
25 unsigned char timer0_tick,i=0,keyA=0,keyB=0,mode=0;
26 time now;
27 static void timer0_isr(void) interrupt TF0_VECTOR using 1
28 {
29 1 TR0=0;
30 1 TL0=(TIMER0_COUNT & 0x00FF);
31 1 TH0=(TIMER0_COUNT >> 8);
32 1 TR0=1;
33 1 if (keyA !=0) {
34 2 keyA--;
35 2 if (keyA==0 && P2_0==0) {
36 3 mode++;
37 3 if(mode==2) mode=0;
38 3 }
39 2 } else if (P2_0==0) keyA=TIMES;
40 1 if (keyB !=0) {
41 2 keyB--;
42 2 if (keyB==0 && P2_1==0) {
43 3 now.minute++;
44 3 if(now.minute==60) {
45 4 now.hour++;
46 4 now.minute=0;
47 4 if(now.hour==24) now.hour=0;
48 4 }
49 3 }
50 2 } else if (P2_1==0) keyB=TIMES;
51 1 timer0_tick++;
52 1 if (timer0_tick==200) {
53 2 timer0_tick=0;
54 2 now.second++;
55 2 if(now.second==60){
C51 COMPILER V8.02 EX5_1 09/08/2007 22:54:58 PAGE 2
56 3 now.minute++;
57 3 now.second=0;
58 3 if(now.minute==60) {
59 4 now.hour++;
60 4 now.minute=0;
61 4 if(now.hour==24) now.hour=0;
62 4 }
63 3 }
64 2 }
65 1 switch (mode) {
66 2 case DISPLAY :
67 2 switch(i) {
68 3 case 0 : P1=seven_seg[now.minute%10];
69 3 P1_7=(now.second%2);
70 3 break;
71 3 case 1 : P1=seven_seg[now.minute/10];
72 3 break;
73 3 case 2 : P1=seven_seg[now.hour%10];
74 3 P1_7=0;
75 3 break;
76 3 case 3 : P1=seven_seg[now.hour/10];
77 3 break;
78 3 }
79 2 break;
80 2 case SET :
81 2 switch(i) {
82 3 case 0 : if (now.second%2) P1=seven_seg[now.minute%10];
83 3 else P1=0XFF;
84 3 break;
85 3 case 1 : if (now.second%2) P1=seven_seg[now.minute/10];
86 3 else P1=0XFF;
87 3 break;
88 3 case 2 : if (now.second%2) P1=seven_seg[now.hour%10];
89 3 else P1=0XFF;
90 3 break;
91 3 case 3 : if (now.second%2) P1=seven_seg[now.hour/10];
92 3 else P1=0XFF;
93 3 break;
94 3 }
95 2 break;
96 2 }
97 1 P0=scan[i];
98 1 i++;
99 1 if(i==4) i=0;
100 1 }
101 static void timer0_initialize(void)
102 {
103 1 EA=0;
104 1 timer0_tick=0;
105 1 TR0=0;
106 1 TMOD &= 0XF0;
107 1 TMOD |=0x01;
108 1 TL0=(TIMER0_COUNT & 0x00FF);
109 1 TH0=(TIMER0_COUNT >> 8);
110 1 PT0=0;
111 1 ET0=1;
112 1 TR0=1;
113 1 EA=1;
114 1 }
115 void main (void) {
116 1 timer0_initialize();
117 1 while (1); /*无穷循环 */
C51 COMPILER V8.02 EX5_1 09/08/2007 22:54:58 PAGE 3
118 1 }
119
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 406 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -