Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lr3_ipu

.pdf
Скачиваний:
10
Добавлен:
09.05.2015
Размер:
474.61 Кб
Скачать

ВЫВОД

Интерфейс 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-

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]