📄 hello.lst
字号:
C51 COMPILER V7.07 HELLO 11/07/2006 19:17:04 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE HELLO
OBJECT MODULE PLACED IN HELLO.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE HELLO.C DEBUG OBJECTEXTEND
stmt level source
1 //*******************************************************************
2 //***此程序为调试通过的源程序
3 //***由南京赛博电子有限公司提供
4 //***文件名:sy0606.C***//
5 //***是51系例单片机的最小系统
6 //***有AT89S51/52的在线下载功能
7 //***IIC总线芯片为24C02,记存密码
8 //*******************************************************************
9 #include"at89x52.h"
10 #include<intrins.h>
11 #define uchar unsigned char
12 #define uint unsigned int
13 #define nop _nop_() /* 定义空操作指令 */
14 //#define VAR P1
15 sbit rs=P2^2; /*LCD模块用*/
16 sbit rw=P2^1; /*LCD模块用*/
17 sbit enable=P2^0; /*LCD模块用*/
18 sbit SCL=P3^4; /*24C01 CSL接脚=89C51 T0 P3.4*/
19 sbit SDA=P3^5; /*24C01 SDA接脚=89C51 T1 P3.5*/
20 sbit en =P2^7; /*DTLED-6显示芯片使能端*/
21 sbit dout=P2^6; /*DTLED-6显示芯片数据读入端*/
22 sbit clk=P2^5; /*DTLED-6显示芯片/时钟芯片DS1302时钟输入端*/
23 sbit DINOUT=P2^4; /*DS1302时钟芯片数据输入输出端*/
24 sbit RST=P2^3; /*DS1302芯片复位起始端*/
25 bit FLAG0=0; /*位标号FLAG0=1键盘扫描回应*/
26 bit FLAG1=1; /*位标号20H.1比较密码回应旗号*/
27 bit FLAG2=1; /*位标号FLAG2=0时,进入键盘操作*/
28 bit FLAG3=1; /*位标号FLAG3=0时,键盘操作*/
29 bit FLAG4=0; /*位标号FLAG4=0时,键盘操作*/
30 bit FLAG5=0; /*位标号FLAG5=1时,存储*键按下*/
31 bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no); /* 向有子地址器件写入6字节数据函数
- */
32 bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no); /* 向有子地址器件读取6字节数据函数
- */
33 bit acknow; /* 应答标志位 acknow=1 表示正常响应 acknow=0 表示未响应 */
34 static const char tab[16]={0x01,0x02,0x03,0x0c, /*键盘码00,01,02,03,*/
35 0x04,0x05,0x06,0x0d, /*键盘码04,05,06,07,*/
36 0x07,0x08,0x09,0x0e, /*键盘码08,09,0a,0b,*/
37 0x0a,0x00,0x0b,0x0f};/*键盘码0c,0d,0e,0f*/
38 //static const char tab1[6]={0x01,0x01,0x01,0x01,0x01,0x01};/*内定密码"888888"*/
39 uchar char1[]="Syber Nanjing.Co";
40 uchar char2[]="Password:";
41 uchar dispbuf[9]; /*显示值存放阵列*/
42 uchar clocktmp[3]; /*显示值存放阵列*/
43 uchar bufdata[9];
44 uchar buf_rec_com1;
45 uchar bufuart[6]; /*串口接收值存放阵列*/
46 //uchar buf_rec_com1; //huzm
47 //uchar rec_comm1_len=0; //huzm
48 uchar a1=0,clockbak,b1=100,stand=0,m=0,busy,count=10;
49 char ww=0,ptr=0,ptr1=0; /*PTR键盘扫描指标,ptr1显示器扫描指标*/
50 void delay (unsigned int value) /*延时副程式*/
51 {
52 1 while (value!=0) value--; /*10US延时*/
53 1 }
C51 COMPILER V7.07 HELLO 11/07/2006 19:17:04 PAGE 2
54 void Enable(uchar c);
55 void Write1(char *c1);
56 void Write2(char c2);
57 void Write3(void); /* 显示密码字符串 */
58 void send_to_Led_a(void); /*串行发送到DTLED-6副程式*/
59 void BCD(void); /*BCD码转换副程式*/
60 void clear(void); /*清除按键存放/显示器阵列dispbuf[]副副程式*/
61 void open(void); /*开门比较密码副程式*/
62 void read24c02(); /*读24c02的存储值*/
63 void write24c02(); /*写24c02的存储值*/
64 void IICSAVE(void); /*设定密码并存入buft[]阵列副程式*/
65 //void disp(void); /*显示存放在dispbuf[]阵列的密码副程式*/
66 void send_to_Comm1(void); /*串口serial发送副程式*/
67 void temp(void);
68 void Rd1302st(void); /*读时钟芯片DS1302*/
69 void Rd1302(void); /*读时钟芯片DS1302*/
70 void Wr1302(void); /*写时钟芯片DS1302*/
71 void Start(); /* 起动总线函数 */
72 void Stop(); /* 结束总线函数 */
73 void SendByte(uchar c); /* 8951发数据或地址给8583 字节数据发送函数 */
74 uchar RcvByte(); /* 8951从24C01读数据字节数据接收函数 */
75 void Ack(bit a); /* 主机8951应答子函数 */
76 void xch(void); /*宣告按键存放/显示器阵列dispbuf[]右键滚入副程式*/
77 void wxb1(void); /*0~9计数,秒*/
78 void wxb2(void); /*0~9计数,分*/
79 void wxb3(void); /*0~9计数,时*/
80 void save_clocks(void); /*按显示时间更改时钟*/
81 /*********************************************************************/
82
83 //串行发送DTLED-6显示
84 //dispbuf0-dispbuf1-dispbuf2-dispbuf3-dispbuf4-dispbuf5-dispbuf6-dispbuf7-dispbuf8
85 // 小数点 - 数码管1- 数码管2- 数码管3- 数码管4- 数码管5- 数码管6-ID识别码-BZ识别码
86 //00000xxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx
87 //小数点=1~6,其它为不显示
88 //数码管1-6=0~15,
89 //ID识别码=0~15
90 //BZ识别码=BZ.3为蜂鸣输出控制位,0=关闭,1=打开
91 // BZ0~2为蜂鸣频率输出设定为,000=不分频, 最高频率输出=4800Hz;
92 // 001=一次分频,频率输出=4800/ 2 =2400Hz;
93 // 010=二次分频,频率输出=4800/ 4 =1200Hz;
94 // 011=三次分频,频率输出=4800/ 8 =600Hz;
95 // 100=四次分频,频率输出=4800/ 16=300Hz;
96 // 101=五次分频,频率输出=4800/ 32=150Hz;
97 // 110=六次分频,频率输出=4800/ 64=75Hz;
98 // 111=七次分频,频率输出=4800/128=38Hz;
99 //======================================================================
100 void send_to_Led_a(void) /*串行发送DTLED-6显示副程式*/
101 {
102 1 char ts0,i,j;
103 1 clk=0;
104 1 en=0;
105 1 delay(10);
106 1 for(j=0;j<9;j++)
107 1 {
108 2 ts0=dispbuf[j];
109 2 for(i=0;i<4;i++) /*发小数点码8,4,2,1*/
110 2 {
111 3 clk=1;
112 3 ts0=ts0<<1;
113 3 if(AC==1)
114 3 dout=1;
115 3 else dout=0;
C51 COMPILER V7.07 HELLO 11/07/2006 19:17:04 PAGE 3
116 3 clk=0;
117 3 nop;
118 3 delay(3);
119 3 }
120 2 }
121 1 en=1;
122 1 } /*返回主程式*/
123 //======================================================================
124 void Write1(char *c1)
125 {while(*c1!=0)
126 1 {Write2(*c1);
127 2 c1++;
128 2 }
129 1 }
130 //======================================================================
131 void Write3(void)
132 {uchar i=6;
133 1 while(i>0)
134 1 { P1=bufdata[i]|0x30;
135 2 rs=1;rw=0;
136 2 enable=1;
137 2 delay(2);
138 2 enable=0;
139 2 i--;
140 2 }
141 1 }
142 //======================================================================
143 void Write2(char c2)
144 {P1=c2;
145 1 rs=1;rw=0;enable=1;
146 1 delay(2);
147 1 enable=0;
148 1 }
149 //======================================================================
150 void Enable(uchar c)
151 {
152 1 P1=c;
153 1 rs=0;rw=0;enable=1;
154 1 delay(2);
155 1 enable=0;
156 1 }
157
158 /***********************************************************************/
159 void temp(void)
160 { FLAG2=0;
161 1 if(tab[ptr]==0x0e)
162 1 {
163 2 //disp(); /*如果是按“C”则呼叫显示密码DISP*/
164 2 dispbuf[0]=0x03; /*小数点位*/
165 2 }
166 1 else /*否则往下执行*/
167 1 {
168 2 switch(tab[ptr]) /*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/
169 2 {
170 3 case 0x0a:
171 3 write24c02(); /*是否按“*”是则呼叫设定密码SET*/
172 3 clear(); /*是否按“#”是则呼叫清除显示器CLEAR*/
173 3 break; /*跳出此循环*/
174 3 case 0x0b:
175 3 clear(); /*是否按“#”是则呼叫清除显示器CLEAR*/
176 3 break; /*跳出此循环*/
177 3 case 0x0c: /*是否按“A”,未规划键待用户自己定义*/
C51 COMPILER V7.07 HELLO 11/07/2006 19:17:04 PAGE 4
178 3 FLAG2=1; P3_6=1;
179 3 dispbuf[0]=0x03; /*小数点位*/
180 3 break; /*跳出此循环*/
181 3 case 0x0d: /*是否按“B”,未规划键待用户自己定义*/
182 3 break; /*跳出此循环*/
183 3 case 0x0e: /*是否按“C”,已侦测过*/
184 3 read24c02(); /*呼叫读取密码存放在DATE1[]副程式*/
185 3 break; /*跳出此循环*/
186 3 case 0x0f:
187 3 open(); /*是否按“D”,是则呼比较密码开门副程式*/
188 3 dispbuf[0]=0x03; /*小数点位*/
189 3 goto openend;
190 3 break; /*跳出此循环*/
191 3 default:
192 3 xch(); /*以上均不是则为数字键呼叫XCH作右键滚入*/
193 3 break; /*跳出此循环*/
194 3 } /*跳出SWITCH*/
195 2 delay(100); /*按钮抗机械反弹跳*/
196 2 while(m==P0); /*按钮放开否?*/
197 2 send_to_Led_a(); /*串行发送到DTLED-6副程式*/
198 2 openend: nop;
199 2 }
200 1 } /*返回上一层程式*/
201 /****************************************************/
202 void temp_setclock(void) /*判断有按键输入否?*/
203 {
204 1 switch(dispbuf[0]) /*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/
205 1 {
206 2 case 0x01:
207 2 wxb1(); /*0~9计数*/
208 2 break; /*跳出此循环*/
209 2 case 0x03:
210 2 wxb1(); /*0~9计数*/
211 2 break; /*跳出此循环*/
212 2 case 0x05:
213 2 wxb2(); /*0~2,0~4计数*/
214 2 break; /*跳出此循环*/
215 2 default: /*以上均不是*/
216 2 break; /*跳出此循环*/
217 2 }
218 1 delay(100); /*按钮抗机械反弹跳*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -