📄 7279按键显示.lst
字号:
C51 COMPILER V7.06 7279__键_允_ 06/04/2005 15:57:07 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 7279__键_允_
OBJECT MODULE PLACED IN 7279按键显示.OBJ
COMPILER INVOKED BY: c:\KEIL\C51\BIN\C51.exe 7279按键显示.c DB OE
stmt level source
1 #include "c8051f020.h"
2 #include <intrins.h>
3
4 sbit HD7279_DAT=P1^7;
5 sbit HD7279_CLK=P1^6;
6
7 #define NOSELECT7279 P5 |= 0x80 //SPICS4(P57)=1
8 #define SELECT7279 P5 &= ~(0x80) //SPICS4(P57)=0;
9 #define Set7279DAT HD7279_DAT=1
10 #define Clr7279DAT HD7279_DAT=0
11 #define Set7279CLK HD7279_CLK=1
12 #define Clr7279CLK HD7279_CLK=0
13
14 void SYSCLK_Init (void); //初始化时钟
15 void Delay1us(unsigned char T);
16 void Delay1ms(unsigned char T);
17 void Delay1s(unsigned char T);
18 void Timer0_Init (void); //初始化定时器
19 void PORT_Init (void); //初始化IO口
20 void SPI0_Init (void); //初始化SPI0
21 void Send7279Byte(unsigned char ch);
22 void Test7279(bit LoopFlag);
23
24 void main (void)
25 {
26 1 WDTCN = 0xde;
27 1 WDTCN = 0xad; //关看门狗
28 1 SYSCLK_Init (); //初始化时钟
29 1 Timer0_Init(); //初始化定时器
30 1 PORT_Init (); //初始化IO口
31 1 // SPI0_Init (); //初始化SPI0
32 1 CPT1CN |= 0x80; //使能比较器1
33 1 REF0CN = 0x03; //使能片内参考电压
34 1 EA=1; //开中断
35 1 Test7279(1);
36 1 }
37
38
39 void SYSCLK_Init (void)
40 {
41 1 int i; // delay counter
42 1 OSCXCN = 0x65; // start external oscillator with
43 1 // 18.432MHz crystal
44 1 for (i=0; i < 256; i++) ; // Wait for osc. to start up
45 1 //while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
46 1 OSCICN = 0x88; // select external oscillator as SYSCLK
47 1 // source and enable missing clock
48 1 // detector
49 1 OSCICN = 0x07; //interal 16MHZ
50 1 }
51
52
53 void PORT_Init (void) // 初始化IO口
54 {
55 1 XBR0 = 0x07; // Enable SMBus, SPI0, and UART0
C51 COMPILER V7.06 7279__键_允_ 06/04/2005 15:57:07 PAGE 2
56 1 XBR1 = 0x00;
57 1 XBR2 = 0x44; // Enable crossbar and weak pull-ups
58 1 //EMI0TC = 0x21;
59 1 //P74OUT = 0xFF;
60 1 //P0MDOUT = 0x15;
61 1 //P1MDOUT |= 0x3C; //P1.2-P1.5推挽输出
62 1 //P1 &= 0xc3; //P1.2-P1.5=0
63 1 }
64
65 void SPI0_Init (void) //初始化SPI0
66 {
67 1 SPI0CFG = 0x07; // data sampled on 1st SCK rising edge
68 1 // 8-bit data words
69 1 SPI0CFG|=0xC0; //CKPOL =1;
70 1
71 1 SPI0CN = 0x03; // Master mode; SPI enabled; flags
72 1 // cleared
73 1 SPI0CKR = SYSCLK/2/8000000-1; // SPI clock <= 8MHz (limited by
74 1 // EEPROM spec.)
75 1 }
76
77 unsigned char Count1ms;
78 void Timer0_Init (void) //定时器0初始化,定时1ms
79 {
80 1 CKCON|=0x8;
81 1 TMOD|=0x1; //定时器0方式1,16Bit
82 1 Count1ms=10;
83 1 TR0 = 0; // STOP Timer0
84 1 TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
85 1 TL0 = -SYSCLK/1000;
86 1 TR0 = 1; // START Timer0
87 1 IE|= 0x2;
88 1 }
89
90 void Timer0_ISR (void) interrupt 1 // 定时器0中断服务程序
91 {
92 1 TH0 = (-SYSCLK/1000) >> 8;
93 1 TL0 = -SYSCLK/1000;
94 1 if (Count1ms) Count1ms--;
95 1 }
96
97 void Send7279Byte(unsigned char ch)
98 {
99 1 char i;
100 1 SELECT7279; //置CS低电平
101 1 Delay1us(50); //延时50μ
102 1
103 1 for (i=0;i<8;i++)
104 1 {
105 2 if (ch&0x80) //输出7位到HD7279A的DATA端
106 2 {
107 3 Set7279DAT;
108 3 }
109 2 else
110 2 {
111 3 Clr7279DAT;
112 3 }
113 2 Set7279CLK; //置CLK高电平
114 2 ch=ch<<1; //待发数据左移
115 2 Delay1us(8); //延时8μ
116 2 Clr7279CLK; //置CLK低电平
117 2 Delay1us(8); //延时50μ
C51 COMPILER V7.06 7279__键_允_ 06/04/2005 15:57:07 PAGE 3
118 2 }
119 1 Clr7279DAT; //发送完毕,DATA端置低,返回
120 1 }
121 unsigned char Receive7279Byte(void)
122 {
123 1 unsigned char i,ch;
124 1 ch=0;
125 1 Set7279DAT; //DATA端置为高电平,输入状态
126 1 Delay1us(50); //延时50μ
127 1 for (i=0;i<8;i++)
128 1 {
129 2 Set7279CLK; //置CLK高电平
130 2 Delay1us(8); //延时8μ
131 2 ch=ch<<1; //接收数据左移1位
132 2 if (HD7279_DAT)
133 2 ch+=1; //接收1位数据
134 2 Clr7279CLK; //置CLK低电平
135 2 Delay1us(8); //延时8μ
136 2 }
137 1 Clr7279DAT; //接收完毕,DATA端重新置成低电平(输出状态)
138 1 return ch;
139 1 }
140
141 char GetKeyValue(void)
142 {
143 1 char KeyValue;
144 1 if (CPT1CN&0x40) return -1; //无键按下
145 1 Send7279Byte(0x15); //发读键盘指令
146 1 KeyValue=Receive7279Byte();
147 1 NOSELECT7279; //置CS高电平
148 1 return KeyValue;
149 1 }
150
151 void WaitKeyOff(void)
152 {
153 1 while (!(CPT1CN&0x40));
154 1 }
155
156 void Test7279(bit LoopFlag)
157 {
158 1 char KeyValue;
159 1 Delay1ms(25); //等待25ms复位时间
160 1 Send7279Byte(0xA4); //发复位指令
161 1 NOSELECT7279; //置CS高电平
162 1 if (LoopFlag==0) return;
163 1
164 1 for (;;)
165 1 {
166 2 KeyValue=GetKeyValue();
167 2 if(KeyValue!=-1)
168 2 {
169 3 Send7279Byte(0xC8); //发送键码值,按方式1译码下载显示
170 3 Send7279Byte(KeyValue%16);
171 3 NOSELECT7279; //置CS高电平
172 3 WaitKeyOff();
173 3 }
174 2 }
175 1 }
176
177
178 void Delay1us(unsigned char us)
179 {
C51 COMPILER V7.06 7279__键_允_ 06/04/2005 15:57:07 PAGE 4
180 1 while (us)
181 1 {
182 2 _nop_();
183 2 _nop_();
184 2 _nop_();
185 2 _nop_();
186 2 _nop_();
187 2 --us;
188 2 }
189 1 }
190
191 void Delay1ms(unsigned char T)
192 {
193 1 Count1ms=T;
194 1 while (Count1ms);
195 1 }
196
197 void Delay1s(unsigned char T)
198 {
199 1 while (T)
200 1 {
201 2 Delay1ms(200);
202 2 Delay1ms(200);
203 2 Delay1ms(200);
204 2 Delay1ms(200);
205 2 Delay1ms(200);
206 2 T--;
207 2 }
208 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 348 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 5
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 + -