📄 lesson9_c.lst
字号:
C51 COMPILER V7.50 LESSON9_C 06/15/2006 21:31:47 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LESSON9_C
OBJECT MODULE PLACED IN lesson9_C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lesson9_C.C ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /************************************************/
3 /*单位名称:华南理工大学电信学院*/
4 /*模块:1位共阴数码管,CD4511驱动,使用反极法的键盘,6116*/
5 /*创建人:景永年 日期:2006年5月25日*/
6 /*修改人:*/
7
8 /*功能描述:串口接收PC机发送的数据,并显示*/
9 /*其他说明:*/
10 /*版本号:*/
11 /*************************************************/
12 #include "reg52.h"
13 #include "stdio.h"
14 #include "absacc.h"
15 #include "intrins.h"
16
17 #define uchar unsigned char
18 #define uint unsigned char
19
20 unsigned char volatile xdata g_sec_disp _at_ 0xFFFF;
21 unsigned char volatile xdata g_min_disp _at_ 0xEFFF;
22 unsigned char volatile xdata g_hr_disp _at_ 0xDFFF;
23
24 //void time0_init(void);
25 void time1_init(void);
26 void serial_interrupt(void);
27
28 void keypad_scan(void);
29 void keypad_response(uchar key_number);
30 void display_led(void);
31
32 void delay(uchar m, uchar n);
33
34 data unsigned char g_uc_sec_cnt,g_uc_min_cnt,g_uc_hr_cnt;//g_uc_ms_cnt;
35 data uint g_ui_ram_addr;
36 data uchar g_uc_recv_serial_cnt;
37 data unsigned char g_uc_key_number,g_uc_disp_cnt =7;/*uc_disp_cnt显示位计数器*/
38 code unsigned char g_uc_key_number_all[12]={0xF3,0xEB,0xDB,0xBB,0xF5,0xED,0xDD,0xBD,0xF6,0xEE,0xDE,0xBE};
39
40 sbit beep = P1^7;
41
42 main()
43 {
44 1 //time0_init();
45 1 time1_init();
46 1
47 1 g_uc_sec_cnt = 0xAA;
48 1 g_uc_min_cnt = 0xAA;
49 1 g_uc_hr_cnt = 0x1F;
50 1 //g_uc_ms_cnt = 0;
51 1 g_uc_recv_serial_cnt = 0;
52 1 g_ui_ram_addr = 0x7800;//first addr
53 1
54 1 //SP = 0x60 ;//no need to Initiate stack
55 1 //ET0 = 1;//enable T0 interrupt
C51 COMPILER V7.50 LESSON9_C 06/15/2006 21:31:47 PAGE 2
56 1 //TR0 = 1;//start the timer0
57 1 TR1 = 1;//start the timer1, not enable T1 interrupt
58 1 ES = 1;//enable serial interrupt
59 1
60 1 display_led();//display "1",ready for receive the serial data
61 1 while(g_uc_recv_serial_cnt < 11)//waiting for 11 times serial interrupt
62 1 {
63 2 _nop_();
64 2 }
65 1 ES = 0;//mask the serial interrupt
66 1 EA = 0;//mask all interrupt
67 1
68 1 g_uc_sec_cnt = 0xA3;
69 1 g_uc_min_cnt = 0xAA;
70 1 g_uc_hr_cnt = 0xA2;
71 1 display_led();
72 1
73 1 while(1)
74 1 {
75 2 keypad_scan();
76 2 }
77 1
78 1 }
79
80
81 /*************************************************/
82 /*time0_init*/
83 /*************************************************/
84 /*void time0_init(void)
85 {
86 TMOD = 0x01 ;//定时中断的初始化,定时器0工作在定时器模式
87 IE = 0x80 ;//开总中断;由TR0启停,16bit(模式1)
88 TH0 = 0x3C ;//初值15536
89 TL0 = 0xB0 ;//100ms=0.1s
90
91 }*/
92 /*************************************************/
93 /*time1_init*///设置串行通信的波特率
94 /*************************************************/
95 void time1_init(void)
96 {
97 1 TMOD = 0x20;
98 1 IE = 0x80;
99 1 TH1 = 0xF3;//baud rate:2400
100 1 TL1 = 0xF3;
101 1 SCON = 0x50;//mode 1
102 1 PCON = 0x80;
103 1
104 1 }
105
106 /*************************************************/
107 /*
108 name:keypad_scan()
109 function: scan the keypad, get the key number
110 使用反极法检测键值
111 output:uc_key_number
112 */
113 /*************************************************/
114 void keypad_scan(void)
115 {
116 1 P1 = 0XF8;
117 1
C51 COMPILER V7.50 LESSON9_C 06/15/2006 21:31:47 PAGE 3
118 1 ACC = P1;
119 1 ACC &= 0XF8;
120 1 if(!(ACC == 0XF8))
121 1 {
122 2 delay(2,255);
123 2 P1 = 0XF8;
124 2 ACC = P1;
125 2 ACC &= 0XF8;
126 2 if(!(ACC == 0XF8))/*note:if(ACC != 0XF8) ACC XOR 0xF8;if(!(ACC == 0XF8)) the value of the ACC don't chan
-ge*/
127 2 {
128 3 g_uc_key_number = ACC;/*get the row number*/
129 3
130 3 P1 = 0X07;
131 3
132 3 ACC = P1;
133 3 ACC &= 0X07;
134 3 if(!(ACC == 0X07))
135 3 {
136 4 delay(2,255);
137 4 P1 = 0X07;
138 4 ACC = P1;
139 4 ACC &= 0X07;/*contains the column number*/
140 4 if(!(ACC == 0X07))
141 4 {
142 5 g_uc_key_number |= ACC;/*combine to the key number*/
143 5 keypad_response(g_uc_key_number);
144 5 }
145 4 }
146 3 }
147 2 }
148 1 }
149
150 /*************************************************/
151 /*
152 name:keypad_response()
153 function:response to the key number
154 input:uc_key_number
155 */
156 /*************************************************/
157 void keypad_response(uchar key_number)
158 {
159 1 uchar k;
160 1 lab:P1 = 0X07;/*release the key or not?*/
161 1 ACC = P1;
162 1 ACC &= 0X07;
163 1
164 1 if((ACC == 0X07))/*release the key*/
165 1 {
166 2 for(k=0;k<=11;k++)
167 2 {
168 3 if(key_number == g_uc_key_number_all[k])
169 3 break;
170 3 }
171 2 switch(k)
172 2 {
173 3 case 10:/*A*/
174 3 g_uc_sec_cnt = 0xFF;//熄灭数码管,A~F不能显示
175 3 g_uc_min_cnt = 0xFF;
176 3 g_uc_hr_cnt = 0xFF;
177 3
178 3 display_led();/*显示时钟CD4511不能显示A~F*/
C51 COMPILER V7.50 LESSON9_C 06/15/2006 21:31:47 PAGE 4
179 3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -