📄 lesson8.lst
字号:
C51 COMPILER V8.08 LESSON8 04/10/2009 16:18:05 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE LESSON8
OBJECT MODULE PLACED IN lesson8.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lesson8.c DEBUG OBJECTEXTEND
line level source
1 /*-------------------------------------------------------------/
2 // 51接收光电旋钮信号 发送键值编码
3 //按键中断 int0,1
4 // 扫描旋钮扭动
5 /*------------------------------------------------------------*/
6
7
8 #include<reg52.h>
9 #define uchar unsigned char
10 #define uint unsigned int
11 #define ulint unsigned long int
12
13
14 //键盘以及PS2接口
15 sbit PS_DATA=P0^0; //用P0。0 Z做数据线
16 sbit PS_CLK=P0^1; //用p0.1做时钟线
17
18
19 sbit key_an=P3^2; //确定键
20 sbit key_down=P3^3; //向上旋动
21 sbit key_up=P3^4; //向下旋动
22
23 sbit beep=P2^3; //蜂鸣器指示
24
25 uint En_num; //按键时间间隔计数
26 uchar key_flag; //按键时间差标志 循环次数标志
27
28 uchar num,count,send_flag;
29 uint n_flag,AD_count;
30
31
32 uchar Plus_send(); //发送脉冲
33
34
35 void delayus(unsigned int us)
36 {
37 1 while(--us) ;
38 1 }
39
40 void Delay1ms(unsigned int x)//延时1ms
41 {
42 1 unsigned char j;
43 1 while(x--)
44 1 {
45 2 for(j=0;j<125;j++)
46 2 {;}
47 2 }
48 1 }
49
50
51 //液晶初始化+++定时器+++中断 初始化
52 void init()
53 {
54 1 send_flag=0;
55 1 AD_count=0;
C51 COMPILER V8.08 LESSON8 04/10/2009 16:18:05 PAGE 2
56 1 n_flag=18; //脉宽量程 标志
57 1
58 1 num=0;
59 1 count=0;
60 1 key_flag=1;
61 1 En_num=0;
62 1
63 1 // 定时器+++中断 初始化
64 1
65 1 TMOD=0x22;//设置定时器1为工作方式2 (做串口波特率发生器 ) 定时器T0工作方式 2(按键时间间隔)
66 1 TH1=0xfd; //初值 波特率9600
67 1 TL1=0xfd;
68 1 TH0=0; //计数256us
69 1 TL0=0;
70 1 TR1=1; //启动定时器
71 1 TR0=1; //启动定时器
72 1
73 1
74 1 ET0=1;
75 1 EA=1; //所有中断 允许
76 1 EX0=1; //允许INT 0
77 1 EX1=1; //允许INT 0
78 1
79 1 }
80
81
82 /****************************************************/
83 //PS/2发送函数
84 // 发送一个编码
85 /****************************************************/
86 void PS_send(uchar x)
87 {
88 1
89 1 uchar i,temp,char_temp;
90 1 bit flag_check=1; //奇数偶校验位
91 1 Delay1ms(3);
92 1 temp=x;
93 1
94 1 for(i=0;i<8;i++)
95 1 {
96 2 char_temp=temp&0x01;
97 2 if(char_temp==0x01)
98 2 {
99 3 flag_check=!flag_check; //获得奇偶校验位
100 3
101 3 }
102 2 temp=temp>>1;
103 2 }
104 1 PS_CLK=1;
105 1 while(!PS_CLK)
106 1 {
107 2 ;
108 2 }
109 1 PS_CLK=1;
110 1 PS_DATA=1;
111 1 if(PS_CLK==1)
112 1 {
113 2 delayus(30);
114 2
115 2 }
116 1 ////提示发送开始
117 1 if(PS_CLK==1&&PS_DATA==1)
C51 COMPILER V8.08 LESSON8 04/10/2009 16:18:05 PAGE 3
118 1 {
119 2 PS_DATA=0; //起始位为0
120 2 delayus(10);
121 2 PS_CLK=0;
122 2 delayus(5);
123 2 temp=x;
124 2 for(i=0;i<8;i++) //发送8位数据位
125 2 {
126 3
127 3 PS_CLK=1;
128 3 delayus(5);
129 3 char_temp=temp&0x01;
130 3
131 3 if(char_temp==0x01)
132 3 {PS_DATA=1;}
133 3 else
134 3 {PS_DATA=0;}
135 3
136 3 delayus(10);
137 3 PS_CLK=0;
138 3 delayus(5);
139 3 temp=temp>>1;
140 3 }
141 2
142 2 PS_CLK=1;
143 2 delayus(5);
144 2 PS_DATA=flag_check; //发送奇偶校验
145 2 delayus(10);
146 2 PS_CLK=0;
147 2 delayus(5);
148 2 PS_CLK=1;
149 2 delayus(5);
150 2 PS_DATA=1; //发送停止位
151 2 delayus(10);
152 2 PS_CLK=0;
153 2 delayus(5);
154 2 PS_CLK=1;
155 2 }
156 1 delayus(30);
157 1 PS_CLK=1;PS_DATA=1;
158 1 if(PS_CLK==1&&PS_DATA==0)
159 1 {
160 2 return;
161 2
162 2 }
163 1
164 1 }
165 void main()
166 {
167 1 init();
168 1 while(1)
169 1 {
170 2 if(key_up==1&key_down==1)
171 2 {
172 3 while(key_up);
173 3 if(key_down==1)
174 3 {
175 4 PS_send(0xE0);
176 4 PS_send(0x75);
177 4 }
178 3 else
179 3 {
C51 COMPILER V8.08 LESSON8 04/10/2009 16:18:05 PAGE 4
180 4
181 4 PS_send(0xE0);
182 4 PS_send(0x72);
183 4
184 4 }
185 3
186 3 }
187 2
188 2 }
189 1
190 1 }
191 /**********************************/
192 // 发送负脉冲
193 // n_flag 设定发送的量程
194 /**********************************/
195 void timer0() interrupt 1 //定时器0中断为中断1
196 {
197 1
198 1 En_num++;
199 1 if(En_num>=1000) //1秒
200 1 {
201 2 En_num=0;
202 2 key_flag=0;//表示超过了时间差
203 2 }
204 1
205 1 }
206
207
208 //脉宽增加--按键中断
209 void int_key_up() interrupt 0//外部中断0为中断0
210 {
211 1
212 1 EX0=EX1=0;//先关外部中断0
213 1 Delay1ms(10);
214 1 if(key_an==0) //延时消抖 key_up是按键 应管脚 。
215 1 {
216 2 if(key_flag==0) //时间间隔超过0.5S
217 2 {
218 3 PS_send(0x0D); //发送Tab
219 3 key_flag=1;
220 3 En_num=0;
221 3
222 3 }
223 2 else
224 2 {
225 3 PS_send(0x5A); //发送enter 5a 29
226 3 En_num=0;
227 3
228 3 }
229 2 }
230 1 while(!key_an);
231 1 EX0=EX1=1;//重新开外部中断
232 1 }
233
234 //脉宽减少-按键中断
235 void int_key_down() interrupt 2//外部中断1是中断2
236 {
237 1
238 1
239 1
240 1 }
241
C51 COMPILER V8.08 LESSON8 04/10/2009 16:18:05 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 402 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -