📄 lesson5_c.lst
字号:
C51 COMPILER V7.50 LESSON5_C 06/13/2006 17:10:58 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LESSON5_C
OBJECT MODULE PLACED IN Lesson5_C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Lesson5_C.C ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /************************************************/
3 /*单位名称:华南理工大学电信学院*/
4 /*模块:1位共阴数码管,CD4511驱动,使用反极法的键盘*/
5 /*创建人:景永年 日期:2006年5月25日*/
6 /*修改人:*/
7
8 /*功能描述:带置位功能的6个LED数码管数字时钟*/
9 /*其他说明:当时钟的时针大于50后,不能准确的调整*/
10 /*版本号:*/
11 /*************************************************/
12 #include "reg52.h"
13 #include "stdio.h"
14 #define uchar unsigned char
15
16 unsigned char volatile xdata g_sec_disp _at_ 0xFFFF;
17 unsigned char volatile xdata g_min_disp _at_ 0xEFFF;
18 unsigned char volatile xdata g_hr_disp _at_ 0xDFFF;
19
20 void time0_init(void);
21
22 void keypad_scan(void);
23 void keypad_response(uchar key_number);
24 void display_led(void);
25
26 void delay(void);
27
28 data unsigned char uc_sec_cnt,uc_min_cnt,uc_hr_cnt,uc_ms_cnt;
29 data unsigned char uc_key_number,uc_disp_cnt =7;/*uc_disp_cnt显示位计数器*/
30 code unsigned char uc_key_number_all[12]={0xF3,0xEB,0xDB,0xBB,0xF5,0xED,0xDD,0xBD,0xF6,0xEE,0xDE,0xBE};
31
32 main()
33 {
34 1
35 1
36 1 time0_init();
37 1
38 1 uc_sec_cnt = 0;
39 1 uc_min_cnt = 0;
40 1 uc_hr_cnt = 0;
41 1 uc_ms_cnt = 0;
42 1
43 1 //SP = 0x60 ;//no need to Initiate stack
44 1 ET0 = 1;//start the timer0
45 1 TR0 = 1;
46 1
47 1 while(1)
48 1 {
49 2 keypad_scan();
50 2 }
51 1
52 1 }
53
54
55 /*************************************************/
C51 COMPILER V7.50 LESSON5_C 06/13/2006 17:10:58 PAGE 2
56 /*time0_init*/
57 /*************************************************/
58 void time0_init(void)
59 {
60 1 TMOD = 0x01 ;//定时中断的初始化,定时器0工作在定时器模式
61 1 IE = 0x80 ;//开总中断;由TR0启停,16bit(模式1)
62 1 TH0 = 0x3C ;//初值15536
63 1 TL0 = 0xB0 ;//100ms=0.1s
64 1
65 1 }
66
67 /*************************************************/
68 /*
69 name:keypad_scan()
70 function: scan the keypad, get the key number
71 使用反极法检测键值
72 output:uc_key_number
73 */
74 /*************************************************/
75 void keypad_scan(void)
76 {
77 1 P1 = 0XF8;
78 1
79 1 ACC = P1;
80 1 ACC &= 0XF8;
81 1 if(!(ACC == 0XF8))
82 1 {
83 2 delay();
84 2 P1 = 0XF8;
85 2 ACC = P1;
86 2 ACC &= 0XF8;
87 2 if(!(ACC == 0XF8))/*note:if(ACC != 0XF8) ACC XOR 0xF8;if(!(ACC == 0XF8)) the value of the ACC don't chan
-ge*/
88 2 {
89 3 uc_key_number = ACC;/*get the row number*/
90 3
91 3 P1 = 0X07;
92 3
93 3 ACC = P1;
94 3 ACC &= 0X07;
95 3 if(!(ACC == 0X07))
96 3 {
97 4 delay();
98 4 P1 = 0X07;
99 4 ACC = P1;
100 4 ACC &= 0X07;/*contains the column number*/
101 4 if(!(ACC == 0X07))
102 4 {
103 5 uc_key_number |= ACC;/*combine to the key number*/
104 5 keypad_response(uc_key_number);
105 5 }
106 4 }
107 3 }
108 2 }
109 1 }
110
111 /*************************************************/
112 /*
113 name:keypad_response()
114 function:response to the key number
115 input:uc_key_number
116 */
C51 COMPILER V7.50 LESSON5_C 06/13/2006 17:10:58 PAGE 3
117 /*************************************************/
118 void keypad_response(uchar key_number)
119 {
120 1 uchar k;
121 1 lab:P1 = 0X07;/*release the key or not?*/
122 1 ACC = P1;
123 1 ACC &= 0X07;
124 1
125 1 if((ACC == 0X07))/*release the key*/
126 1 {
127 2 for(k=0;k<=11;k++)
128 2 {
129 3 if(key_number == uc_key_number_all[k])
130 3 break;
131 3 }
132 2 switch(k)
133 2 {
134 3 case 10:/*A*/
135 3 ET0 = 0;//停止timer0
136 3 TR0 = 0;
137 3 uc_sec_cnt = 0xFF;//熄灭数码管,A~F不能显示
138 3 uc_min_cnt = 0xFF;
139 3 uc_hr_cnt = 0xFF;
140 3
141 3 display_led();/*显示时钟CD4511不能显示A~F*/
142 3
143 3 uc_disp_cnt = 0;
144 3 break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -