?? 8574keyboard.lst
字號:
C51 COMPILER V8.08 8574KEYBOARD 03/31/2009 16:43:21 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 8574KEYBOARD
OBJECT MODULE PLACED IN 8574KEYBOARD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 8574KEYBOARD.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //#include <reg52.h>
2 #include <ADI/ADuC834.h>
3 #include <intrins.h>
4
5 #define uchar unsigned char
6 #define uint unsigned int
7
8 //1602移植過來的
9 sbit rs=P2^3; //1602的數據/指令選擇控制線
10 sbit rw=P2^4; //1602的讀寫控制線
11 sbit en=P2^5; //1602的使能控制線
12 /*P2口接1602的D0~D7,注意不要接錯了順序,我以前可在這上面吃過虧~*/
13 uchar code table[]="LCD1602 check ok"; //要顯示的內容1放入數組tablel
14 uchar code table1[]="study up"; //要顯示的內容2放入數組table1
15 uchar code esc[]="ESC";
16 uchar code light[]="LIGHT";
17 uchar code avc[]="AVC";
18 uchar code memo[]="MEMO";
19 uchar code hold[]="HOLD";
20 uchar code setup[]="SETUP";
21 uchar code pgdn[]="PgDn";
22
23 uchar n,m=0;
24
25 uchar slvadr=0x40 ; //被控器地址
26 uchar ack;
27 uchar key;
28 uchar curkey;
29 uchar key_right_flag=1;
30 uchar KeyPort;
31 uchar RBT[8];
32
33 //1602移植過來的
34 void delay(uint n) //延時函數
35 {
36 1 uint x,y;
37 1 for(x=n;x>0;x--)
38 1 for(y=110;y>0;y--);
39 1 }
40 void lcd_wcom(uchar com) //1602寫命令函數
41 {
42 1 rs=0; //選擇指令寄存器
43 1 rw=0; //選擇寫
44 1 P0=com; //把命令字送入P2
45 1 delay(5); //延時一小會兒,讓1602準備接收數據
46 1 en=1; //使能線電平變化,命令送入1602的8位數據口
47 1 en=0;
48 1 }
49 void lcd_wdat(uchar dat) //1602寫數據函數
50 {
51 1 rs=1; //選擇數據寄存器
52 1 rw=0; //選擇寫
53 1 P0=dat; //把要顯示的數據送入P2
54 1 delay(5); //延時一小會兒,讓1602準備接收數據
55 1 en=1; //使能線電平變化,數據送入1602的8位數據口
C51 COMPILER V8.08 8574KEYBOARD 03/31/2009 16:43:21 PAGE 2
56 1 en=0;
57 1 }
58 void lcd_init() //1602初始化函數
59 {
60 1 lcd_wcom(0x38); //8位數據,雙列,5*7字形
61 1 lcd_wcom(0x0F); //開啟顯示屏,關光標,光標不閃爍
62 1 lcd_wcom(0x06); //顯示地址遞增,即寫一個數據后,顯示位置右移一位
63 1 lcd_wcom(0x01); //清屏
64 1 }
65
66 void PCF8574init(void)
67 {
68 1 I2CM=1;
69 1 }
70
71 void delay1ms(uchar x)
72 {
73 1 unsigned char i,j;
74 1 while(x--)
75 1 {
76 2 for(i=5;i>0;i--)
77 2 for(j=132;j>0;j--);
78 2 }
79 1 }
80
81 void Delay_Cycles(char delay)
82 {
83 1 while(delay--);
84 1 }
85
86 /*---------------------------------------------------------------------------------------------------
87 開始:START
88 描述:啟動I2C 總線子程序--發送I2C 起始條件
89 ---------------------------------------------------------------------------------------------------*/
90 void start(void)
91 {
92 1 MDE=1;
93 1 MCO=1;
94 1 MDO=1;
95 1 _nop_();
96 1 _nop_();
97 1 _nop_();
98 1 _nop_();
99 1 _nop_();
100 1 MDO=0;
101 1 _nop_();
102 1 _nop_();
103 1 _nop_();
104 1 _nop_();
105 1 _nop_();
106 1 MCO=0;
107 1 }
108
109 void Ack_I2c(uchar a) //a=0發送應答信號,=1發送非應答信號
110 {
111 1 MDE=1;
112 1 if(a==0)MDO=0; /*在此發出應答或非應答信號 */
113 1 else MDO=1;
114 1 _nop_();
115 1 _nop_();
116 1 _nop_();
117 1 MCO=1;
C51 COMPILER V8.08 8574KEYBOARD 03/31/2009 16:43:21 PAGE 3
118 1 _nop_();
119 1 _nop_(); /*時鐘低電平周期大于4μs*/
120 1 _nop_();
121 1 _nop_();
122 1 _nop_();
123 1 MCO=0; /*清時鐘線,鉗住I2C總線以便繼續接收*/
124 1 _nop_();
125 1 _nop_();
126 1 }
127
128 void wrbyt(uchar shu)
129 {
130 1 uchar i;
131 1 ack=0;
132 1 MDE=1; // SETB MDE ; to enable SDATA pin as an output
133 1 MCO=0;
134 1 for(i=0;i<8;i++)
135 1 {
136 2 if(shu&0x80)
137 2 {
138 3 MDO=1;
139 3 _nop_();
140 3 MCO=1;
141 3 _nop_();
142 3 _nop_();
143 3 _nop_();
144 3 MCO=0;
145 3 //MDO=0;
146 3 }
147 2 else
148 2 {
149 3 MDO=0;
150 3 _nop_();
151 3 MCO=1;
152 3 _nop_();
153 3 _nop_();
154 3 _nop_();
155 3 MCO=0;
156 3 }
157 2 shu=shu<<1;
158 2 }
159 1 MDO=1;
160 1 MDE=0; // CLR MDE ; release data line for acknowledge
161 1 MCO=1; // SETB MCO ; send clock for acknowledge
162 1 Delay_Cycles(3);
163 1 MCO=0;
164 1 }
165
166 //void SendByte_Upon_I2C(unsigned char byte)
167 //{
168 // unsigned char send_bitdata;
169 // unsigned char send_bytedata=byte;
170 // uchar BITCNT=8; // MOV BITCNT,#8 ; 8 bits in a byte
171 // MDE=1; // SETB MDE ; to enable SDATA pin as an output
172 // MCO=0; // CLR MCO ; make sure that the clock line is low
173 // Delay_Cycles(5);
174 // while(BITCNT--)
175 // {
176 // if(send_bytedata&0x80)send_bitdata=1;
177 // else send_bitdata=0;
178 // MDO=send_bitdata; // MOV MDO,C ; put data bit on SDATA line
179 // MCO=1; // SETB MCO ; clock to send bit
C51 COMPILER V8.08 8574KEYBOARD 03/31/2009 16:43:21 PAGE 4
180 // Delay_Cycles(1);
181 // Delay_Cycles(5);
182 // MCO=0; // CLR MCO ; clear clock
183 // send_bytedata<<=1;
184 // } // DJNZ BITCNT,SENDBIT ; jump back and send all eight bits
185 // MDE=0; // CLR MDE ; release data line for acknowledge
186 // MCO=1; // SETB MCO ; send clock for acknowledge
187 // Delay_Cycles(3);
188 // MCO=0; //NEXT: CLR MCO ; clear clock
189 // return; // RET
190 //}
191
192 uchar RcvByte()
193 {
194 1 uchar retc;
195 1 uchar BitCnt;
196 1
197 1 retc=0;
198 1 MDE=0; /*置數據線為輸入方式*/
199 1 for(BitCnt=0;BitCnt<8;BitCnt++)
200 1 {
201 2 _nop_();
202 2 MCO=0; /*置時鐘線為低,準備接收數據位*/
203 2 _nop_();
204 2 _nop_(); /*時鐘低電平周期大于4.7μs*/
205 2 _nop_();
206 2 _nop_();
207 2 _nop_();
208 2 MCO=1; /*置時鐘線為高使數據線上數據有效*/
209 2 _nop_();
210 2 _nop_();
211 2 retc=retc<<1;
212 2 if(MDI==1)retc=retc+1; /*讀數據位,接收的數據位放入retc中 */
213 2 _nop_();
214 2 _nop_();
215 2 }
216 1 MCO=0;
217 1 _nop_();
218 1 _nop_();
219 1 return(retc);
220 1 }
221
222 /*---------------------------------------------------------------------------------------------------
223 名稱:STOP
224 描述:停止I2C 總線子程序--發送I2C 總線停止條件
225 ---------------------------------------------------------------------------------------------------*/
226 void stop(void)
227 {
228 1 MDE=1;
229 1 MDO=0;
230 1 _nop_();
231 1 MCO=1;
232 1 _nop_();
233 1 _nop_();
234 1 _nop_();
235 1 _nop_();
236 1 _nop_();
237 1 MDO=1;
238 1 _nop_();
239 1 _nop_();
240 1 _nop_();
241 1 }
C51 COMPILER V8.08 8574KEYBOARD 03/31/2009 16:43:21 PAGE 5
242 void checkack(void)
243 {
244 1 // MDO=1; /*8位發送完后釋放數據線,準備接收應答位*/
245 1 // MDE=0;
246 1 // _nop_();
247 1 // _nop_();
248 1 // MCO=1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -