lr3_ipu
.pdfВЫВОД
Интерфейс PS/2 является весьма простым и экономичным способом обмена данными в последовательном режиме, что делает его весьма полезным, для работы с периферийными устройствами.
|
|
|
230101.2013.724.ПЗ ЛР |
Лист |
|
Изм. Лист № докум. |
Подпись |
Дата |
11 |
||
|
|||||
|
|
ps2.c
1 //Приложение А. Код программы работы Хоста
2
3#include <avr/io.h>
4#include <util/delay.h>
5#include "LCD_operations.h"
7#include <stdio.h>
8#include <stdlib.h>
10
11#define MDATA 3
12#define MCLK 2
14#define LEFT_BUTTON 0x01
15#define RIGHT_BUTTON 0x02
16#define MIDDLE_BUTTON 0x04
19// Переменные, для получения информации от Мышки
20char mstat;
21signed char mx;
22signed char my;
23signed int acu_x, acu_y;
24char buf[5];
25char maska,i;
27//"Лог 1" = Входу с подтяжкой, эмитируем открытый коллектор
28void gohi(int pin)
29{
30switch (pin) {
31case MDATA:
32PORTD |= (1<<MDATA);
33DDRD &= ~(1<<MDATA);
34break;
35case MCLK:
36PORTD |= (1<<MCLK);
37DDRD &= ~(1<<MCLK);
38break;
39};
40}
41//"Лог 0" = Обычный выход
42void golo(int pin)
43{
44switch (pin) {
45case MDATA:
46PORTD &= ~(1<<MDATA);
47DDRD |= (1<<MDATA);
48break;
49case MCLK:
50PORTD &= ~(1<<MCLK);
51DDRD |= (1<<MCLK);
52
53break;
54};
-1-
ps2.c
55 }
56
57//Отправка данных Хостом
58void mouse_write(char data)
59{
60char i;
61char parity = 1;
62/* Отдаём линии DATA и CLK устройству */
63gohi(MDATA);
64gohi(MCLK);
65_delay_us(300);
66/* Указываем готовность к передаче, опустив CLK */
67golo(MCLK);
68_delay_us(300);
69/* Устанавливаем старт-бит DATA=0 */
70golo(MDATA);
71_delay_us(10);
72/* Передаём управление CLK устройству */
73gohi(MCLK);
74/* Ждём от устройства ответа о готовности передать данные */
75while ((PIND & 0x04) == 4);
76/* Устройство готово, начинаем передачу информации 8бит+2 */
77for (i=0; i < 8; i++) {
78if (data & 0x01) {
79gohi(MDATA);
80}
81else {
82golo(MDATA);
83}
84/* wait for clock cycle */
85while ((PIND & 0x04) == 0);
86while ((PIND & 0x04) == 4);
87parity = parity ^ (data & 0x01);
88data = data >> 1;
89}
90/* Передача parity */
91if (parity) {
92gohi(MDATA);
93}
94else {
95golo(MDATA);
96}
97while ((PIND & 0x04) == 0);
98while ((PIND & 0x04) == 4);
99/* Передача stop bit */
100gohi(MDATA);
101_delay_us(50);
102while ((PIND & 0x04) == 4);
103/* Ждём подтверждения о приёме от мыши */
104while (((PIND & 0x04) ==0) || ((PIND & 0x08) == 0));
105/* Запрещаем отправку мышью данных, опустив CLK */
106golo(MCLK);
107}
108
-2-
ps2.c
109//Приём данных хвостом
110signed char mouse_read(void)
111{
112signed char data = 0x00;
113int i;
114char mask = 0x01;
115/* Отдаём линии DATA и CLK устройству */
116gohi(MCLK);
117gohi(MDATA);
118_delay_us(50);
119/* Пропускаем старт бит */
120while ((PIND & 0x04) ==4);
121_delay_us(5);
122while((PIND & 0x04) ==0);
123/* Начинаем приём данных */
124for (i=0; i < 8; i++) {
125while((PIND & 0x04) ==4);
126if ((PIND & 0x08) == 8) {
127data = data | mask;
128}
129while ((PIND & 0x04) ==0);
130mask = mask << 1;
131}
132/* eat parity bit, which we ignore */
133while ((PIND & 0x04) ==4);
134while ((PIND & 0x04) ==0);
135/* eat stop bit */
136while ((PIND & 0x04) ==4);
137while ((PIND & 0x04) ==0);
138/* Запрещаем отправку мышью данных, опустив CLK */
139golo(MCLK);
140return data;
141}
142
143
144void mouse_init()
145{
146gohi(MCLK);
147gohi(MDATA);
148mouse_write(0xff);
149 |
mouse_read(); |
/* ack |
byte */ |
||
150 |
mouse_read(); |
/* blank |
*/ |
||
151 |
mouse_read(); |
/* blank |
*/ |
||
152 |
mouse_write(0xf0); |
/* |
remote mode */ |
||
153 |
mouse_read(); |
/* |
ack |
*/ |
154_delay_us(100);
155}
156
157/* get a reading from the mouse */
158void loop1(void){
159mouse_write(0xeb); /* give me data! */
160 |
mouse_read(); |
/* ignore ack */ |
161mstat = mouse_read();
162mx = mouse_read();
-3-
ps2.c
163my = mouse_read();
164acu_x+=mx;
165acu_y+=my;
166 |
_delay_ms(20); |
/* twiddle */ |
167 |
} |
|
168
169
170
171int main(void){
172/* Инициализация порта D, запрет обмена для мыши */
173PORTD=0x00;
174DDRD=0x00;
175/* Инициализация LCD */
176LcdInit();
177_delay_ms(200);
178/* Вывод маски на LCD */
179LcdGotoXY(0,0);
180LcdSendString("PRESSED: ", 9);
181LcdGotoXY(0,1);
182LcdSendString(" x: ", 4);
183LcdGotoXY(0,2);
184LcdSendString(" y: ", 4);
185
186/* Переменные для отображения на LCD состояния мыши */
187signed int tempx, tempy;
188char tempmstat;
189mouse_init();
190while (1){
191 |
while((acu_x |
== |
tempx) && (acu_y == tempy) && (tempmstat == mstat)) |
192 |
|||
193 |
loop1(); |
// |
Получаем данные от мыши |
194tempx = acu_x;
195tempy = acu_y;
196tempmstat = mstat;
197_delay_ms(5);
198 |
LcdGotoXY(10,0); |
199 |
|
200 |
if (mstat & LEFT_BUTTON) LcdSendString("L", 1); else LcdSendString(" ", |
201 |
|
|
1); |
202if (mstat & MIDDLE_BUTTON) LcdSendString("M", 1); else LcdSendString(" ", 1);
203if (mstat & RIGHT_BUTTON) LcdSendString("R", 1); else LcdSendString(" "
, 1);
204
205/* Если мышь сместилась - выводим новые данные */
206itoa(acu_x, buf, 10);
207LcdGotoXY(6,1);
208 |
LcdSendString(" |
", 8); |
209LcdGotoXY(6,1);
210LcdSendString(buf, strlen(buf));
212itoa(acu_y, buf, 10);
213LcdGotoXY(6,2);
-4-
ps2.c
214 LcdSendString(" ", 8);
215LcdGotoXY(6,2);
216LcdSendString(buf, strlen(buf));
217};
218return 0;
219}
220
-5-