📄 yijia.lst
字号:
C51 COMPILER V3.20, SN-50203013 YIJIA 06/29/07 20:42:04 PAGE 1
DOS C51 COMPILER V3.20, COMPILATION OF MODULE YIJIA
OBJECT MODULE PLACED IN C:\MC\YIJIA.OBJ
COMPILER INVOKED BY: C:\COMP51\C51.EXE C:\MC\YIJIA.C DB SB OE
stmt level source
1 #include <reg51.h>
2
3 #define USE_KEY
4 #define CH451_RESET 0x0201 /*复位 */
5 #define CH451_LEFTMOV 0x0300 /*设置移动方式-左移 */
6 #define CH451_LEFTCYC 0x0301 /*设置移动方式-左循 */
7 #define CH451_RIGHTMOV 0x0302 /*设置移动方式-右移 */
8 #define CH451_RIGHTCYC 0x0303 /*设置移动方式-右循 */
9 #define CH451_SYSOFF 0x0400 /*关显示、键盘、看门狗 */
10 #define CH451_SYSON1 0x0401 /*开显示 */
11 #define CH451_SYSON2 0x0403 /*开显示、键盘、关看门狗 */
12 #define CH451_SYSON3 0x0407 /*开显示、键盘、看门狗功能 */
13 #define CH451_DSP 0x0500 /*设置默认显示方式 */
14 #define CH451_BCD 0x0580 /*设置BCD译码方式 */
15 #define CH451_USER 0x05c0 /*设置BCD译码方式、4位数码管、最亮*/
16 #define CH451_TWINKLE 0x0600 /*设置闪烁控制的命令码,无闪烁 */
17 #define CH451_TWINKLE1 0x0601 /*设置闪烁控制--从右向左计数,1闪烁(DIG0驱动) */
18 #define CH451_TWINKLE2 0x0602 /*设置闪烁控制--从右向左计数,2闪烁(DIG1驱动) */
19 #define CH451_TWINKLE3 0x0604 /*设置闪烁控制--从右向左计数,3闪烁(DIG2驱动) */
20 #define CH451_TWINKLE4 0x0608 /*设置闪烁控制--从右向左计数,4闪烁(DIG3驱动) */
21 #define CH451_TWINKLE5 0x0610 /*设置闪烁控制--从右向左计数,5闪烁(DIG4驱动) */
22 #define CH451_TWINKLE6 0x0620 /*设置闪烁控制--从右向左计数,6闪烁(DIG5驱动) */
23 #define CH451_TWINKLE7 0x0640 /*设置闪烁控制--从右向左计数,7闪烁(DIG6驱动) */
24 #define CH451_TWINKLE8 0x0680 /*设置闪烁控制--从右向左计数,8闪烁(DIG7驱动) */
25 #define CH451_DIG0 0x0800 /*送数码管位0显示的数据,本值或上一个要显示的值即可
-*/
26 #define CH451_DIG1 0x0900 /*送数码管位1显示的数据,本值或上一个要显示的值即可 */
27 #define CH451_DIG2 0x0a00 /*送数码管位2显示的数据,本值或上一个要显示的值即可 */
28 #define CH451_DIG3 0x0b00 /*送数码管位3显示的数据,本值或上一个要显示的值即可 */
29 #define CH451_DIG4 0x0c00 /*送数码管位4显示的数据,本值或上一个要显示的值即可 */
30 #define CH451_DIG5 0x0d00 /*送数码管位5显示的数据,本值或上一个要显示的值即可
-*/
31 #define CH451_DIG6 0x0e00 /*送数码管位6显示的数据,本值或上一个要显示的值即可 *
-/
32 #define CH451_DIG7 0x0f00 /*送数码管位7显示的数据,本值或上一个要显示的值即可 */
33 #define CH451_KEY 0x07 /*读取键值的命令码 */
34
35 #define maxp 3000
36 #define minp 30
37
38 typedef unsigned char U8 ;
39 typedef unsigned int U16;
40
41 bit pf; /* 有脉冲信号标志*/
42 bit t10msf; /* 10ms 间隔到标志 */
43 bit udf; /*需要显示更新标志 */
44
45 bit kf; /*有按键按下标志*/
46 bit k1f; /*按键k1按下标志--左键--启动、确认*/
47 // bit k2f; /*按键k2按下标志--中左键--移位*/
48 // bit k3f; /*按键k3按下标志--中右键--增1*/
49 // bit k4f; /*按键k3按下标志--右键--减1*/
50
51 sbit HC14=P3^2; /* INT0, 光电信号输入口*/
52 sbit jout=P2^0; /* 喷码信号输出口*/
C51 COMPILER V3.20, SN-50203013 YIJIA 06/29/07 20:42:04 PAGE 2
53
54
55 /* CH451接口*/
56 sbit ch451_dout=P3^3; /* INT1,键盘中断和键值数据输入,接CH451的数据输出*/
57 sbit ch451_load=P1^0; /*串行命令加载,上升延激活 */
58 sbit ch451_din=P1^1; /*串行数据输出,接CH451的数据输入 */
59 sbit ch451_dclk=P1^7; /*串行数据时钟上升延激活 */
60 U8 ch451_key; /* 存放键盘中断中读取的键值 */
61
62 sbit s=P1^2; /* 93c46的片选 */
63 sbit c=P1^3; /* 93c46的串行时钟 */
64 sbit d=P1^4; /* 93c46的数据输入 */
65 sbit q=P1^6; /* 93c46的数据输出 */
66
67 U8 skv[4]; /*显示缓存,4字节,分别存放要显示的个、十、百、千*/
68 U16 setv; /*设置的脉冲数值*/
69 U16 cv; /*当前接受的脉冲数值*/
70
71 void int0() interrupt 0 using 1 /*光电输入中断*/
72 {
73 1 /*设置光电输入标志 */
74 1 pf=1;
75 1
76 1 }
77 /*void int1() interrupt 2 using 1 /* 键盘输入中断*/
78 /*{
/*设置按键按下标志 */
80 /* kf=1;
} */
83 void time0() interrupt 1 using 1 /* 设置T0为10ms中断*/
84 {
85 1 TH0=0xdc; /* 重装时间常数*/
86 1 TL0=0x0;
87 1 t10msf=1;
88 1 }
89
90
91 void updatedisp(unsigned char* disp,bit twif,unsigned char twip); /* 更新显示*/
92 U16 read93(U8 ax);
93 void write93(U8 ax, U16 dx);
94 void erwren93(void);
95 void erwrdisen93(void);
96 void erase93(U8 ax);
97 void eraseall93(void);
98 void writeall93(U16 dx);
99 U8 ch451_read();
100 void ch451_init();
101 void ch451_write(U16 command);
102 void delay();
103
104 void main()
105 {
106 1 U16 temp1,temp2,temp3;
107 1 U8 ck,shift;
108 1 /* 初始化*/
109 1 P1=0x00; /* 初始化输出端口*/
110 1 P2=0x00;
111 1
112 1 SP=0x5f; /* 初始化堆栈指针*/
113 1
114 1 /* 初始化变量*/
C51 COMPILER V3.20, SN-50203013 YIJIA 06/29/07 20:42:04 PAGE 3
115 1 pf=0;
116 1 k1f=0;
117 1 kf=0;
118 1
119 1 temp1=read93(2);
120 1 temp2=read93(4);
121 1 temp3=read93(6);
122 1 if(temp1==temp2)
123 1 setv=temp1;
124 1 else if(temp2==temp3)
125 1 setv=temp2;
126 1 else
127 1 setv=temp1;
128 1 if(setv<minp)
129 1 {
130 2 setv=3000;
131 2 erwren93();
132 2 write93(2,0xaaaa);
133 2 write93(4,0xaaaa);
134 2 write93(6,0xaaaa);
135 2 erwrdisen93();
136 2 }
137 1 cv=0;
138 1 skv[0]=setv%10;
139 1 skv[1]=(setv%100)/10;
140 1 skv[2]=(setv%1000)/100;
141 1 skv[3]=(setv/1000);
142 1 udf=1;
143 1
144 1 /* 初始化芯片ch451*/
145 1 ch451_init(); /*调用初始化 */
146 1
147 1 /* 初始化CPU*/
148 1 IP=0x05; /* 两个外中断为高优先级*/
149 1 TCON=0x05; /*设置外中断为下降沿触发 */
150 1 /* 允许两个外中断*/
151 1 EX0=1;
152 1 EX1=1;
153 1
154 1 // TMOD=0x21; /* 设置T0/T1工作方式:T0为方式1, 16位定时器,T1为波特率发生器,8位自装入方式
-*/
155 1 // TH0=0x0dc; /* 设置T0为10ms中断--12Mp:d8f0*///10*1000/(12/12M)=10000(T), (65536-10000)=
-0xd8f0
156 1 // TL0=0x0; //11.0592Mp:10ms=10*1000us, 10*1000/(12/11.0592M)=9216(T), (65536-9216)=0xd
-c00
157 1 // TR0=1; /* 启动T0*/
158 1 // ET0=1; /* 允许T0中断*/
159 1
160 1 // ES=1; /* 允许串口中断*/
161 1
162 1 EA=1; /* 开中断*/
163 1
164 1 /* 开始运行*/
165 1 while(1)
166 1 {
167 2 if(pf) /* 有光电信号*/
168 2 {
169 3 pf=0;
170 3 cv++; /*当前脉冲数值增1 */
171 3 if(cv>=setv) /*如果当前脉冲数与设置值相等,则重新开始计数,并发出一个脉冲--用于喷码机动作 *
-/
172 3 {
C51 COMPILER V3.20, SN-50203013 YIJIA 06/29/07 20:42:04 PAGE 4
173 4 cv=0;
174 4
175 4 jout=1;
176 4 jout=0;
177 4 }
178 3 /*更新显示*/
179 3 skv[0]=cv%10;
180 3 skv[1]=(cv%100)/10;
181 3 skv[2]=(cv%1000)/100;
182 3 skv[3]=(cv/1000);
183 3 udf=1; /*脉冲数改变,需要更新显示 */
184 3
185 3 }
186 2 if(kf) /*有按键--按键处理 */
187 2 {
188 3 kf=0;
189 3 if(k1f) /*已经按过启动键的按键操作处理 */
190 3 {
191 4 if(ch451_key==0x40) /*减1键操作,当前设置位之值发生改变*/
192 4 {
193 5 if(ck==0)
194 5 ck=9;
195 5 else
196 5 ck--;
197 5 }
198 4 else if(ch451_key==0x41) /*增1键操作,当前设置位之值发生改变*/
199 4 {
200 5 if(ck==9)
201 5 ck=0;
202 5 else
203 5 ck++;
204 5 }
205 4 else if(ch451_key==0x42) /*移位键操作*/
206 4 {
207 5 skv[shift]=ck; /*获取修改过的当前设置位之值,暂存起来 */
208 5 if(shift==3) /*改变设置位*/
209 5 shift=0;
210 5 else
211 5 shift++;
212 5 ck=skv[shift]; /*取得新设置位之值,用于修改 */
213 5 }
214 4 else if(ch451_key==0x43) /*确认键--与启动按键操作是同一键,第1次按是启动,第2次按是确认
-*/
215 4 {
216 5 k1f=0;
217 5
218 5 /*计算新的设置值,并保存新的设置值*/
219 5 setv=skv[3]*1000+skv[2]*100+skv[1]*10+skv[0];
220 5 erwren93();
221 5 write93(2,setv);
222 5 write93(4,setv);
223 5 write93(6,setv);
224 5 erwrdisen93();
225 5 /*设置完毕,重新显示为当前脉冲数 */
226 5 skv[0]=cv%10;
227 5 skv[1]=(cv%100)/10;
228 5 skv[2]=(cv%1000)/100;
229 5 skv[3]=(cv/1000);
230 5 }
231 4
232 4 }
233 3 else if(ch451_key==0x43) /*启动键--与确认按键操作是同一键,第1次按是启动,第2次按是确认*/
C51 COMPILER V3.20, SN-50203013 YIJIA 06/29/07 20:42:04 PAGE 5
234 3 {
235 4 k1f=1; /*k1f=1表明当前在操作按键设置,显示设置值,并闪烁*/
236 4 skv[0]=setv%10;
237 4 skv[1]=(setv%100)/10;
238 4 skv[2]=(setv%1000)/100;
239 4 skv[3]=(setv/1000);
240 4
241 4 /*首先设置个位,个位闪烁 */
242 4 shift=0; /*表明当前设置位--也是闪烁位 */
243 4 ck=skv[shift]; /*取当前要设置的值 */
244 4 }
245 3 else
246 3 {
247 4 /*没有按启动键,先按了其它键,则其它的功能处理*/
248 4
249 4 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -