📄 5045_spi_c.lst
字号:
C51 COMPILER V7.50 5045_SPI_C 05/10/2009 09:56:48 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 5045_SPI_C
OBJECT MODULE PLACED IN 5045_SPI_C.OBJ
COMPILER INVOKED BY: D:\学习资料\单片机开发软件\C51\BIN\C51.EXE 5045_SPI_C.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*用C语言编的5045程序
2 K1键:加一键。实验板上闪烁的字符加一,前两位是地址值,后两位是数据值。
3 K2键:减一键。实验板上闪烁的字符减一,前两位是地址值,后两位是数据值。
4 K3键:读写交换键。P1^0亮,表示读指示;P1^1亮,表示写指示。
5 K4键:多功能键。按一下,控制P^4的点亮或熄灭,亮,表示K1和K2改写的是地址,同时地址值闪烁;
6 连按两下控制P1^5的点亮,表示执行(K1,K2,K3或K4任意键按一下,P1^5都会熄灭)。
7 */
8 #include<reg51.h>
9 #include<intrins.h>
10
11 void initial(void); //函数声明
12 void kscan(void);
13 void SPISendByte(unsigned char ch);
14 unsigned char SPIreceiveByte();
15 void ChangeAdr(unsigned char Adr);
16 void ChangeData(unsigned char Data);
17 void Display(void);
18 void mDelay(unsigned char Delay);
19 unsigned char ReadStatus(void);
20 void WriteStatus(void);
21 unsigned char ReadEEP(void);
22 void WriteEEP(void);
23 //bit CheakWrite(void);
24
25 #define T0INIT_H (65536-2000)/16
26 #define T0INIT_L (65536-2000)%16
27 #define uchar unsigned char
28 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
29 //5045命令定义
30 #define WREN 0x06 //读允许命令,Enable Write Operation
31 #define WRDI 0x04 //读禁止命令,Disable Write Operation
32 #define RDSR 0x05 //读状态寄存器,Read Status Register
33 #define WRSR 0x01 //写状态寄存器,Write Status Register
34 #define READ_L 0x03 //读低256字节EEProm
35 #define READ_H 0x0b //读高256字节EEProm
36 #define WRITE_L 0x02 //写低256字节EEProm
37 #define WRITE_H 0x0a //写高256字节EEProm
38
39 uchar bdata flag;
40 sbit flag_k=flag^0; //有键按下标志
41 sbit flag_k12_first=flag^1; //键1和键2第一次按下标志
42 sbit flag_k3_first=flag^2; //K3第一次按键标志
43 sbit flag_k_enter=flag^3; //有键按下标志,为的是减少硬件是用次数
44 sbit flag_addr_data=flag^4; //地址或数据加减标志
45 sbit K4_func1=flag^5; //k4功能键标志
46 sbit K4_func2=flag^6;
47 sbit DorW=flag^7;
48 sbit P1_0=P1^0;
49 sbit P1_1=P1^1;
50
51 sbit P1_2=P1^2; //K1键显示
52 sbit P1_3=P1^3; //K2键显示
53 sbit P1_4=P1^4; //K4功能1显示,亮,地址调节;灭,数据调节
54 sbit P1_5=P1^5; //K4功能2显示
55 //bit bdata P12=1,P13=1,P14=1,P15=1; //写这一句的时候代码是380多,不加的话是250左右
C51 COMPILER V7.50 5045_SPI_C 05/10/2009 09:56:48 PAGE 2
56 uchar bdata dictation;
57 sbit P12=dictation^0;sbit P13=dictation^1;sbit P14=dictation^2;sbit P15=dictation^3;
58 sbit flag_k4_first=dictation^4; //作为k4键的第一次设置标志
59 uchar Addr,Data,QdorYsh,K4_Delay,K4_Count; //用到的字节定义
60 uchar ds; //显示位选择
61 uchar code GYshjzh[16]={0xC0,0xF9,0xA4,0xB0, //共阳十进制值,十位数字转换字节存放区0---F
62 0x99,0x92,0x82,0xF8,
63 0x80,0x90,0x88,0x83,
64 0xC6,0xA1,0x86,0x8E};
65 uchar code DisBit[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; //显示位字节存放区,中间两个是消隐码
66 uchar idata DisData[12]={0xc0,0xc0,0xff,0xff,0xc0,0xc0,
67 0xff,0xff,0xff,0xff,0xc0,0xc0}; //显示数据字节存放区,0xff是消隐码,地址消隐
68 //uchar AdrH,AdrL,Hidden,Hidden,DataH,DataL;
69 //uchar idata *DisPoi[6]; //定义指针数组,指示显示的每位的数字
70 //-----------------------函数声明,变量定义--------------------------------------------------------
71 sbit SCK=P3^6; // 将p3.6口模拟时钟输出
72 sbit MOSI=P3^7; // 将p3.7口模拟主机输出
73 sbit MISO=P3^7; // 将p3.7口模拟主机输入
74 sbit CS=P2^1; // 将p2.1口模拟片选
75 sbit WP=P2^0; //写保护
76 /**********主函数***************************/
77 void main()
78 {
79 1 initial();
80 1 while(1)
81 1 { Display();
82 2 if(K4_func1==1)
83 2 {
84 3 P14=~P14;
85 3 P1_4=P14;
86 3 flag_addr_data=~flag_addr_data;
87 3 if(flag_addr_data==1) //数据闪烁,表明修改的内容是数据
88 3 {
89 4 DisData[6]=DisData[0];
90 4 DisData[7]=DisData[1];
91 4 DisData[10]=0xff;
92 4 DisData[11]=0xff;
93 4 }
94 3 else //地址闪烁,表明修改的内容是地址
95 3 {
96 4 DisData[6]=0xff;
97 4 DisData[7]=0xff;
98 4 DisData[10]=DisData[4];
99 4 DisData[11]=DisData[5];
100 4 }
101 3 K4_func1=0;
102 3 }
103 2 if(K4_func2==1)
104 2 { //P1_5=0; //P1_5LED点亮,表示读写执行
105 3 // P15=~P15;
106 3 // P1_5=P15;
107 3 if(DorW==1) //读命令
108 3 {Data=ReadEEP();
109 4 ChangeData(Data);
110 4 if(flag_addr_data==1) //数据闪烁,表明修改的内容是数据
111 4 {
112 5 DisData[6]=DisData[0];
113 5 DisData[7]=DisData[1];
114 5 DisData[10]=0xff;
115 5 DisData[11]=0xff;
116 5 }
117 4 else //地址闪烁,表明修改的内容是地址
C51 COMPILER V7.50 5045_SPI_C 05/10/2009 09:56:48 PAGE 3
118 4 {
119 5 DisData[6]=0xff;
120 5 DisData[7]=0xff;
121 5 DisData[10]=DisData[4];
122 5 DisData[11]=DisData[5];
123 5 }
124 4 }
125 3 else
126 3 {
127 4 WriteEEP();
128 4 // CheakWrite(void); //5045状态检查操作
129 4 }
130 3 K4_func2=0;
131 3 P1_5=0; //P1_5LED点亮,表示读写执行
132 3 // P1_5=1; //P1_5LED熄灭
133 3 }
134 2 }
135 1 }
136 void initial(void)
137 {
138 1 TMOD=0x01; //定时器0工作于方式1
139 1 TH0=T0INIT_H;
140 1 TL0=T0INIT_L;
141 1 TR0=1; //定时器0开始运行
142 1 EA=1;
143 1 ET0=1;
144 1 DorW=1; //设置为读显示
145 1 P1_0=0; //读显示灯亮
146 1 P12=1;
147 1 P13=1;
148 1 P14=1;
149 1 P15=1;
150 1 WriteStatus();
151 1 }
152 /*************T0中断程序*********************
153 键盘扫描程序
154 ******************/
155 void T0int(void) interrupt 1 using 1
156 { //P1_0=0;
157 1 TH0=T0INIT_H;
158 1 TL0=T0INIT_L;
159 1 if(K4_Delay!=0)
160 1 {
161 2 K4_Delay--;
162 2 if(K4_Delay==0)
163 2 {if(K4_Count!=1)
164 3 {
165 4 K4_func2=1;
166 4 K4_Count=0; //计数器复位
167 4 }
168 3 else
169 3 {
170 4 K4_func1=1;
171 4 K4_Count=0; //计数器复位
172 4 P1_5=1; //再一次有键按下,P1_5LED熄灭
173 4 }
174 3 flag_k4_first=0; //取消标志位,可以下次再用
175 3 }
176 2 }
177 1 // else
178 1 // ;
179 1 if(flag_k==1)
C51 COMPILER V7.50 5045_SPI_C 05/10/2009 09:56:48 PAGE 4
180 1 { QdorYsh--;
181 2 if(QdorYsh!=0)
182 2 // QdorYsh--;
183 2 ;
184 2 else
185 2 kscan();
186 2 }
187 1 else
188 1 kscan();
189 1 }
190 /*****************键盘扫描程序*****************/
191 void kscan(void)
192 { uchar j;
193 1 j=P3&0x3c;
194 1 if(j!=0x3c) //我加上括号就是259个code,不加的话是132个code
195 1 {
196 2 if(flag_k==1)
197 2 {
198 3 switch(P3&0x3c)
199 3 {
200 4 case 0x38: //K1键处理程序
201 4 // P12=~P12;
202 4 // P1_2=P12;
203 4 P1_5=1; //再一次有键按下,P1_5LED熄灭
204 4 if(flag_addr_data==0)
205 4 {if(flag_k12_first==1)
206 5 {
207 6 Addr++;
208 6 ChangeAdr(Addr);
209 6 QdorYsh=20;
210 6 }
211 5 else
212 5 {
213 6 Addr++;
214 6 ChangeAdr(Addr);
215 6 flag_k12_first=1;
216 6 QdorYsh=200;
217 6 }
218 5 }
219 4 else
220 4 {if(flag_k12_first==1)
221 5 {
222 6 Data++;
223 6 ChangeData(Data);
224 6 QdorYsh=20;
225 6 }
226 5 else
227 5 {
228 6 Data++;
229 6 ChangeData(Data);
230 6 flag_k12_first=1;
231 6 QdorYsh=200;
232 6 }
233 5 }
234 4 flag_k=0;
235 4 break;
236 4 case 0x34: //K2键处理程序
237 4 // P13=~P13;
238 4 // P1_3=P13;
239 4 P1_5=1; //再一次有键按下,P1_5LED熄灭
240 4 if(flag_addr_data==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -