📄 max7219.lst
字号:
C51 COMPILER V7.50 MAX7219 12/02/2008 20:51:11 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAX7219
OBJECT MODULE PLACED IN Max7219.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Max7219.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /* *********************************************************************
2 数字钟
3 串行8位显示Max7219模块。
4 晶振 22.1184, 通讯BAUD 19200
5 2008年10月
6 *************************************************************************/
7 #include <reg51.h>
8 #include <absacc.h>
9 #include <intrins.h>
10 #define uchar unsigned char
11 #define uint unsigned int
12 #define _NOP() _nop_();_nop_()
13 # define MCA XBYTE[0x800a] /*寄存器A*/
14 # define MCB XBYTE[0x800b] /*寄存器B*/
15 # define MCC XBYTE[0x800c] /*寄存器C*/
16 # define MCD XBYTE[0x800d] /*寄存器D*/
17 # define SEC_ADDR XBYTE[0x8000]
18 # define SEC_ALARM_ADDR XBYTE[0x8001] /*秒报警*/
19 # define MINU_ADDR XBYTE[0X8002]
20 # define MINU_ALARM_ADDR XBYTE[0x8003] /*分报警*/
21 # define HOUR_ADDR XBYTE[0X8004]
22 # define HOUR_ALARM_ADDR XBYTE[0x8005] /*时报警*/
23 # define WEEK_ADDR XBYTE[0x8006] /**/
24 # define DAY_ADDR XBYTE[0x8007]
25 # define MONTH_ADDR XBYTE[0x8008]
26 # define YEAR_ADDR XBYTE[0x8009]
27
28 # define U24_T0_ADDR XBYTE[0x8500] /* U24 74LS574 口地址定义 电机驱动*/
29
30 sbit Beep=P1^0;
31
32 sbit LOAD=P3^4; // P1^0
33 sbit DIN=P1^4; // P1^1
34 sbit CLK=P1^5; // P1^2
35 sbit uip_bit=ACC^7;
36 sbit DOG=P1^7;
37 uchar xdata *addr ;
38 uchar idata max=0;
39 uchar idata nm[13]={0,0,0,0,0,0,0,0,0,0,0,0,0}; /*定义显示日期时钟字符的ASC码一维数组*/
40 uchar idata dt[7]={04,10,11,16,56,0,0}; /*时标缓冲区及初值*/
41 uchar code et[7]={9,8,7,4,2,0,0}; /*年、月、日、时、分、秒时标寄存器地址*/
42
43 uchar code da_str[9]={4,3,2,1,8,7,6,5,0};
44 uchar idata RECEIVE_BUF[12]; /*通讯接收缓冲区*/
45 uchar idata ANS_TEMP[16]; /*通讯发送缓冲区*/
46 uchar data COMM_NUM;
47 uchar data SHEAD;
48
49 void PROCESS_COM(void);
50
51 /*软件延时*/
52 void msec( uint x)
53 { uchar j;
54 1 while(x--)
55 1 { for(j=0;j<250;j++)
C51 COMPILER V7.50 MAX7219 12/02/2008 20:51:11 PAGE 2
56 2 { DOG=!DOG;
57 3 if(SHEAD==1){
58 4 PROCESS_COM();
59 4 SHEAD=0;
60 4 return;
61 4 }
62 3 }/*一次延时0.5毫秒。*/
63 2 }
64 1 }
65
66
67 /* 发送一字节到MAX7219,高位在前 */
68 void send(uchar c)
69 { uchar bit_cnt;
70 1 CLK=0;
71 1 _NOP();
72 1 for(bit_cnt=0;bit_cnt<8;bit_cnt++)
73 1 { if((c<<bit_cnt)&0x80)DIN=1;
74 2 else DIN=0;
75 2 _NOP();
76 2 CLK=1;
77 2 _NOP();
78 2 _NOP();
79 2 CLK=0;
80 2 _NOP();
81 2 _NOP();
82 2 }
83 1
84 1 }
85 /*向显示器某位送命令或数字*/
86 void input(uchar addr,uchar dat)
87 {
88 1 send(addr);/*传送寄存器地址字节(位选)*/
89 1 send(dat);/*传送寄存器数据字节*/
90 1 LOAD=1;
91 1 _NOP();
92 1 _NOP();
93 1 LOAD=0;
94 1 }
95 /*初始化显示器*/
96 void dip_int(void)
97 { uchar i;
98 1 CLK=0;
99 1 LOAD=0;
100 1 input(0x0c,0x00);/*关闭显示*/
101 1 input(0x09,0xff);/*全译码模式*/
102 1 input(0x0b,0x07);/*显示 8*LED */
103 1 input(0x0a,0x02);/*亮度占空比31/32 */
104 1 input(0x0f,0x00);/*显示测试寄存器为正常显示方式 */
105 1 input(0x0c,0x01);/*开显示 */
106 1 for(i=8;i>0;i--)input(i,0);
107 1
108 1 }
109 /*关闭显示*/
110 void cls(void)
111 { uchar i;
112 1 CLK=0;
113 1 LOAD=0;
114 1 for(i=1;i<9;i++)input(i,0x0f);/*每个字符‘黑’*/
115 1 LOAD=1;
116 1 CLK=1;
117 1 }
C51 COMPILER V7.50 MAX7219 12/02/2008 20:51:11 PAGE 3
118 /*显示字符串(8 位)*/
119 void str(uchar *s)
120 { uchar i;
121 1 input(0x0c,0x01);
122 1 for(i=8;i>0;i--)
123 1 input(i,s[i-1]);
124 1 }
125 /* 时钟工作状态初始化函数*/
126 void initstat (void)
127 { // uchar i;
128 1 // uint g;
129 1 MCB=0xaa; /*中断允许,时标值为BCD码,24小时制,芯片工作*/
130 1 HOUR_ALARM_ADDR=0xff; /*每小时闹钟中断*/
131 1 MINU_ALARM_ADDR=0xff;
132 1 SEC_ALARM_ADDR=0xff;
133 1 MCA=0x2f; /*选时钟32.268 kh,中断周期500ms*/
134 1 ACC=MCC; /*清中断请求标志*/
135 1 ACC=MCD; /*VRT=1,数据有效*/
136 1 MCB=0x2a;
137 1 }
138 /*读时标函数*/
139 void rMC(void)
140 { uchar i,q=0;
141 1 uchar date;
142 1 do {ACC=MCA;} while (uip_bit==1); /*判UIP位*/
143 1 for (i=0;i<6;i++)
144 1 { date=*(addr+et[i]); /* 读时标寄存器值到缓冲区*/
145 2 msec(50);
146 2 nm[q]=(date/16);/*将读来的二制进制数的高四位转换为一位可显示的ASC码*/
147 2 if (nm[q]>9)nm[q]=9;
148 2 q++;
149 2 nm[q]=(date%16); /*将低四位也转换为一位待显示的ASC码*/
150 2 if (nm[q]>9)nm[q]=9;
151 2 q++;
152 2
153 2 }
154 1 }
155 /*写时标函数*/
156 void wMC(void)
157 { uchar i;
158 1 for (i=0;i<=5;i++)
159 1 dt[i]=(dt[i]/10*16+dt[i]%10);/*将十进制的日期、时间转换为二进制*/
160 1 for (i=0;i<6;i++) *(addr+et[i])=dt[i];
161 1 }
162
163 /*串口通讯结束判断*/
164 uchar WAIT_BUF(void) using 3
165 { uint idata M_WBW;
166 1 for (M_WBW=0;M_WBW<=10000;M_WBW++) /*10ms*/
167 1 {if (RI==1){return 1;}
168 2 DOG=!DOG;}
169 1 return 0;
170 1 }
171
172 /*通讯中断子程序,为查询接收方式,发生中断后进入中断,关CPU中断*/
173 void SBINTER(void) interrupt 4 using 3
174 { uchar idata M_COMMB,M_COMMB2,j;
175 1 if (TI==1){TI=0;}
176 1 if (RI==1)
177 1 {
178 2 M_COMMB=SBUF;
179 2 RI=0;
C51 COMPILER V7.50 MAX7219 12/02/2008 20:51:11 PAGE 4
180 2 if (M_COMMB==0x7e) /*收到包头*/
181 2 { IE=(IE & 0xef); /*关CPU中断*/
182 3 for(M_COMMB=0;M_COMMB<4;M_COMMB++) /*接收命令4个字节*/
183 3 { j=WAIT_BUF();
184 4 if (j==1){ /*通讯结束调用,如果返回值为1则通讯结束*/
185 5 RECEIVE_BUF[M_COMMB]=SBUF;/*将接收到的数据送入接收缓冲区 RECEIVE_BUF */
186 5 RI=0;}
187 4 else
188 4 { IE=IE|0x10; /*如果接收有误,开CPU中断*/
189 5 return;}
190 4 }
191 3 M_COMMB2=RECEIVE_BUF[3];
192 3 if ((M_COMMB2==0)||(M_COMMB2==6)) /*根据接收到的长度信息接收数据*/
193 3 { for (M_COMMB=0;M_COMMB<M_COMMB2+1;M_COMMB++)/*循环接收数据*/
194 4 { j=WAIT_BUF();
195 5 if (j==1)
196 5 { RECEIVE_BUF[4+M_COMMB]=SBUF;
197 6 RI=0;}
198 5 else { IE=IE|0x10; /*接收有误,开CPU中断*/
199 6 return;}
200 5 }
201 4 }
202 3 else {IE=IE|0x10; /*接收长度信息有误,开CPU中断,跳走*/
203 4 return;}
204 3
205 3 SHEAD=1;
206 3 }
207 2 }
208 1 }
209
210
211 /*通讯发送字符串子程序*/
212 void SEND_STRING(uint M_SBW)
213 { uint idata M_SBW2 ;
214 1 for (M_SBW2=0;M_SBW2<M_SBW+1;M_SBW2++)
215 1 { SBUF=ANS_TEMP[M_SBW2];
216 2 while (TI==0){DOG=!DOG;}
217 2 TI=0;}
218 1 }
219
220 /*计算回送校验和*/
221 uint GET_BACK_CHKSUM(void)
222 { uint idata M_GSCW1,M_GSCW2;
223 1 M_GSCW1=0;M_GSCW2=1;
224 1 do { M_GSCW1=M_GSCW1+ANS_TEMP[M_GSCW2];M_GSCW2++;}
225 1 while (M_GSCW2<ANS_TEMP[3]*256+ANS_TEMP[4]+5);
226 1 return (M_GSCW1 & 0x0ff);
227 1 }
228 /*时间校正*/
229 void PROCES_TIME_SET(void)
230 { uchar idata tt[6];
231 1 uchar i;
232 1 tt[0]=RECEIVE_BUF[4]; tt[1]=RECEIVE_BUF[5]; tt[2]=RECEIVE_BUF[6]; /*接收日期*/
233 1 tt[3]=RECEIVE_BUF[7]; tt[4]=RECEIVE_BUF[8]; tt[5]=RECEIVE_BUF[9]; /*接收时间*/
234 1 for (i=0;i<6;i++){dt[i]=tt[i];} /*送入时标数组。*/
235 1 for (i=0;i<=5;i++) /**/
236 1 {dt[i]=(dt[i]/10*16+dt[i]-dt[i]/10*10);} /*将十进制的日期、时间转换为二
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -