📄 led595.lst
字号:
C51 COMPILER V7.01 LED595 05/17/2004 17:50:55 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE LED595
OBJECT MODULE PLACED IN LED595.OBJ
COMPILER INVOKED BY: C:\Keil\C51\Bin\c51.exe LED595.C DB SB OE ROM(SMALL) SMALL OT(6,SPEED) WL(2) RB(0)
stmt level source
1 /******************************************************************
2 程序名:LED595
3 功能:接收主机发来的数据,在LED上显示数据。
4 创建时间:2004-3-29
5 作者:华明
6 ******************************************************************/
7
8 //#include <stdio.h>
9 #include <reg51.h>
10
11 #define uchar unsigned char
12 #define uint unsigned int
13 #define byte uchar
14 #define word uint
15
16 //定义输出引脚
17 sbit SER = P3^4; //输入的数据
18 sbit SCLK = P3^5; //串行输入,上升延有效
19 sbit RCLK = P3^7; //送锁存器信号,上升延有效
20 sbit TRG = P3^2;
21 sbit CLK = P3^1;
22 sbit DATA = P3^0;
23 sbit SMG5 = P1^7;
24 sbit SMG4 = P1^6;
25 sbit SMG3 = P1^5;
26 sbit SMG2 = P1^4;
27 sbit SMG1 = P1^3;
28
29 typedef struct _LEDNODE
30 {
31 uint utime; //改LED点亮的延时
32 uint utime2;
33 uchar uCode; //段码
34 uchar uSelect; //段选
35 }LEDNODE, *PLEDNODE;
36
37 //段码0,1,2,3,4,5,6,7,8,9
38 uchar code uLEDChar[] = {0x3f, 0x06, 0x9b, 0x8f, 0xa6, 0xad, 0xbd, 0x07, 0xbf, 0xaf};
39
40 //段选择码,分别为1、2、3、4、5
41 uchar code uSelChar[] = {0x7F, 0xBF, 0xDF,0xEF, 0xF7};
42
43 //uchar bGetData[5]; //读取的显示数据
44 LEDNODE LedNode[5] = {{1, 1000, 0x3f, 0x7F},
45 {1, 1000, 0x3f, 0xBF},
46 {1, 1000, 0x7f, 0xDF},
47 {1, 1000, 0x3f, 0xEF},
48 {1, 1000, 0x3f, 0xF7}};
49
50 uchar sparkle = 10; //闪烁控制
51 uchar uCmd = 'N'; //显示控制命令
52 uchar uSelIndex, uDataIndex;
53
54 //延时
55 void Delay(uint utime, uint utime2)
C51 COMPILER V7.01 LED595 05/17/2004 17:50:55 PAGE 2
56 {
57 1 uint utimein;
58 1 while (utime --)
59 1 {
60 2 utimein = utime2;
61 2 while(utimein --);
62 2 }
63 1 }
64
65 //接收主机发来的数据
66 byte I_Receive(void)
67 {
68 1 byte uData = 0;
69 1 register byte i;
70 1 for (i = 0; i<8; i++)
71 1 {
72 2 while (!CLK); //等待,阻塞
73 2 uData *= 2;
74 2 if (DATA)
75 2 uData ++;
76 2 }
77 1 return uData;
78 1 }
79
80
81 //接受主机发来的数据中断函数
82 /************************************
83 通信协议:
84 1.静态显示
85 命令:'N'要求静态显示;
86 2.指定片闪烁
87 命令:'S'要求某一片闪烁;
88 数据:(1)片选下标(0-4), 如果超过了4,
89 表示主机不再发送短码,
90 并将片选下标减去4,
91 表示当前要求闪烁的LED片;
92 (2)若下标在0-4之间,则发送段码过来;
93 3.全部闪烁
94 命令:'A'要求全部闪烁, sparkle = 10;
95 4.传输连续5片段码
96 命令:'T'要求传送5个段码的编号;
97 5.设置小数点
98 命令:'P'要求在指定位置上加小数点
99 数据:指定位置下标
100 ************************************/
101
102 void ReadData(void) interrupt 0
103 {
104 1
105 1 uchar bData, i;
106 1 //禁止中断
107 1 EA = 0;
108 1
109 1 //读取命令
110 1 bData = I_Receive();
111 1 //分析命令
112 1 switch (bData)
113 1 {
114 2 case 'N':
115 2 LedNode[uSelIndex].uSelect = uSelChar[uSelIndex]; //恢复当前片为静止显示
116 2 uCmd = bData;
117 2 break;
C51 COMPILER V7.01 LED595 05/17/2004 17:50:55 PAGE 3
118 2 case 'S':
119 2 {
120 3 LedNode[uSelIndex].uSelect = uSelChar[uSelIndex]; //恢复当前片为静止显示
121 3 uSelIndex = I_Receive(); //得到位码
122 3 if (uSelIndex > 4) //超过了位数,表示不要求传送数据
123 3 uSelIndex = uSelIndex - 4;
124 3 else
125 3 LedNode[uSelIndex].uCode = I_Receive(); //得到段码
126 3 uCmd = bData;
127 3 }
128 2 break;
129 2 case 'A':
130 2 LedNode[uSelIndex].uSelect = uSelChar[uSelIndex]; //恢复当前片为静止显示
131 2 sparkle = 10;
132 2 uCmd = bData;
133 2 break;
134 2 case 'T':
135 2 {
136 3 for (i=0; i<5; i++)
137 3 LedNode[4-i].uCode = I_Receive();
138 3 }
139 2 break;
140 2 case 'P':
141 2 uSelIndex = I_Receive(); //得到位码
142 2 for (i=0; i<5; i++)
143 2 LedNode[i].uCode &= 0xBF; //取消小数点
144 2 LedNode[uSelIndex].uCode |= 0x40; //设置小数点
145 2 break;
146 2 }
147 1 //开中断
148 1 EA = 1;
149 1 return;
150 1 }
151
152 //显示一片LED
153 void DisplayData(PLEDNODE pNode)
154 {
155 1 uchar i, uData, utime, utime2;
156 1 uData = pNode->uCode;
157 1 P1 = 0xff; //消隐
158 1 for (i=0; i<8; i++)
159 1 {
160 2 SER = uData & 0x80;
161 2 uData = uData << 1; //左移1位
162 2 SCLK = 0;
163 2 SCLK = 1;
164 2 }
165 1 RCLK = 0;
166 1 RCLK = 1;
167 1 P1 = pNode->uSelect;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -