📄 key_display.lst
字号:
C51 COMPILER V8.02 KEY_DISPLAY 09/06/2007 19:43:26 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEY_DISPLAY
OBJECT MODULE PLACED IN key_display.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key_display.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**************COPYRIGHT RESERVED BY DU************************/
2 //key_display.c
3 #include "c8051F020.h"
4 #include "intrins.h"
5 #include "CH452CMD.H" // 定义常用命令码及外部子程序
6 #include "pin.h"
7 #include "math.h"
8
9
10 #ifndef __UNSIGNEDS
11 #define __UNSIGNEDS
12 #define uint unsigned int
13 #define uchar unsigned char
14 #define ushort unsigned short
15 #define ulong unsigned long
16 #endif
17
18 /***********关看门狗*********************/
19 void Reset_Sources_Init()
20 {
21 1 WDTCN = 0xDE;
22 1 WDTCN = 0xAD;
23 1
24 1 }
25
26
27 /***********系统时钟4M*********************/
28 void Oscillator_Init()
29 {
30 1 OSCICN = 0x05;
31 1 }
32
33
34
35 /***********ADC输入初始化,改变AMX0SL=0x01-0x07为AIN1-AIN7*********************/
36 void ADC_Init()
37 {
38 1 AMX0SL = 0x01; //AIN1作为AD输入,30管脚
39 1 //ADC0CF = 0x08;
40 1 ADC0CN = 0x80; //ADC使能
41 1
42 1 }
43 /***********DAC输出初始化*********************/
44 void DAC_Init()
45 {
46 1 DAC0CN = 0x80; //DAC使能
47 1
48 1 }
49
50 /***********参考电压初始化*********************/
51 void Voltage_Reference_Init()
52 {
53 1 REF0CN = 0x03; //内部参考电压2.5V
54 1
55 1 }
C51 COMPILER V8.02 KEY_DISPLAY 09/06/2007 19:43:26 PAGE 2
56 /***输出占空比不同的PWM可以设定P0.0,0.1...改变PCA0CPH0.PCA0CPM1改变占空比 *****/
57 void PCA_Init()
58 {
59 1 PCA0CN = 0x40; /*允许PCA定时器/计数器*/
60 1 PCA0L = 0x00;
61 1 PCA0H = 0x00;//PCA0MD = 0x80;
62 1 PCA0CPM0 = 0x43; /*8位PWM方式,当CCF0=1时,允许辅捉/比较标志的中断申请*/
63 1 PCA0CPL0 = 0x00; /*置初值*/
64 1 PCA0CPH0 = 0x80; // PCA0CPH0 = 0xC0 //PCA0MD = 0x01; /*PCA定时器/计数器溢出中断禁止*/
65 1 PCA0CPM1 = 0x43; /*8位PWM方式,当CCF1=1时,允许辅捉/比较标志的中断申请*/
66 1 PCA0CPL1 = 0x00; /*置初值*/
67 1 PCA0CPH1 = 0x80;
68 1
69 1
70 1
71 1 }
72
73
74
75 /***定时器0,1初始化 TMOD设置几位什么方式CKCON是时基是系统的几倍*****/
76 void Timer_Init()
77 {
78 1 TR0=0; //关定时器0
79 1 TR1=0; //关定时器1
80 1 TMOD = 0x11;
81 1 CKCON=0x00; //定时器1的时基与系统1/12
82 1 TH0=0x7D ; //全程定时
83 1 TL0=0xCC ;
84 1 TH1=0x7D ; //初值 1s
85 1 TL1=0xFB ;
86 1 }
87
88
89 /***********延时n ms******************/
90 void delayms(uint n)
91 {
92 1 uint i,j,k;
93 1 for(i=0;i<n;i++)
94 1 for(j=0;j<200;j++)
95 1 for(k=0;k<10;k++)
96 1 _nop_();
97 1
98 1 }
99
100
101 /***********ADC输入实现****************uchar i,uchar j*****/
102 float AD_IN(void)
103 {
104 1 // float tmp;
105 1 uint temp;
106 1 // AMX0P = 0x10;
107 1 delayms(10);
108 1 AD0BUSY=1;
109 1 while(AD0INT == 0);
110 1 temp=ADC0H<<8;
111 1 temp+=ADC0L;
112 1 // tmp=(2.5*(temp/4095.0))*1000;
113 1 //return(tmp);
114 1 return(temp);
115 1 }
116
117
C51 COMPILER V8.02 KEY_DISPLAY 09/06/2007 19:43:26 PAGE 3
118 /***********DAC输出实现*********************/
119 void DA_OUT(uint dat)
120 {
121 1 uint dah,dal;
122 1 dah=dat>>8;
123 1 dal=dat&0x00FF;
124 1 DAC0L=(uchar)dal;
125 1 DAC0H=(uchar)dah;
126 1
127 1 }
128
129
130 /***********CH452写入*********************/
131 void CH452_Write(ushort cmd)
132 {
133 1 uchar i;
134 1 DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
135 1 CH452_LOAD_CLR; //命令开始,LOAD=0
136 1 CH452_LOAD_D_OUT; // 设置LOAD为输出方向
137 1 CH452_DOUT_D_IN; // 设置DOUT为输入方向
138 1 CH452_DIN_D_OUT; // 设置DIN为输出方向
139 1 CH452_DCLK_D_OUT; // 设置DCLK为输出方向
140 1 for(i=0;i!=12;i++) //送入12位数据,低位在前
141 1 {
142 2 if (cmd&1) {CH452_DIN_SET;}
143 2 else {CH452_DIN_CLR;} // 输出位数据
144 2 // 另外的表达CH452_DIN=cmd&1;
145 2 CH452_DCLK_CLR;
146 2 cmd>>=1;
147 2 DELAY_1US;
148 2 DELAY_1US;
149 2 CH452_DCLK_SET; //上升沿有效
150 2 }
151 1 CH452_LOAD_SET; //加载数据,LOAD上升沿
152 1 DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
153 1 DELAY_1US;
154 1 DELAY_1US;
155 1 DELAY_1US;
156 1 DELAY_1US;
157 1 DELAY_1US;
158 1 DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
159 1 DELAY_1US;
160 1 DELAY_1US;
161 1 DELAY_1US;
162 1 DELAY_1US;
163 1 DELAY_1US;
164 1 DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
165 1 DELAY_1US;
166 1 DELAY_1US;
167 1 DELAY_1US;
168 1 DELAY_1US;
169 1 DELAY_1US;
170 1
171 1 ENABLE_KEY_INTERRUPT;
172 1 }
173
174
175
176 /***********CH452读出*********************/
177 uchar CH452_Read( void )
178 {
179 1 uchar i;
C51 COMPILER V8.02 KEY_DISPLAY 09/06/2007 19:43:26 PAGE 4
180 1 uchar cmd,keycode; //定义命令字,和数据存储器
181 1 DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
182 1 cmd=0x07; //读按键的命令字
183 1 CH452_LOAD_CLR;
184 1 for(i=0;i!=4;i++) // 只需要发出高4位,多发也可以,但应该确保最后留下的4位是该命令码
185 1 {
186 2 if (cmd&1) {CH452_DIN_SET;}
187 2 else {CH452_DIN_CLR;} // 输出位数据
188 2 CH452_DCLK_CLR;
189 2 cmd>>=1; //往右移一位
190 2 CH452_DCLK_SET; //产生时钟上升沿锁通知CH451输入位数据
191 2 }
192 1 CH452_LOAD_SET; //产生加载上升沿通知CH451处理命令数据
193 1 keycode=0; //清除keycode
194 1 for(i=0;i!=7;i++)
195 1 {
196 2 keycode<<=1; //数据移入keycode,高位在前,低位在后
197 2 if (CH452_DOUT) keycode++; //从高到低读入451的数据
198 2 CH452_DCLK_CLR; //产生时钟下升沿通知CH451输出下一位
199 2 CH452_DCLK_SET;
200 2 }
201 1 CLEAR_KEY_INTER_FLAG; //清中断标志
202 1 ENABLE_KEY_INTERRUPT;
203 1 return(keycode); //反回键值
204 1 }
205 /***********CH452初始化*********************/
206 void CH452_Init(void)
207 {
208 1 //CH452_Write(CH452_RESET); //此套020板子千万不可用020复位,否则数码管不亮
209 1 DELAY_1US;
210 1 DELAY_1US;
211 1 DELAY_1US;
212 1 DELAY_1US;
213 1 DELAY_1US;
214 1 DELAY_1US;
215 1 CH452_Write( CH452_SYSON2 ); /* 启用键盘和数码管 */
216 1 CH452_Write( CH452_BCD ); /* BCD译码,8个数码管 */ // | CH452_SCANLIMIT_7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -