commc.lst
来自「郑州远博公司生产的单片机A型实验板原理图及配套试验源程序」· LST 代码 · 共 225 行
LST
225 行
C51 COMPILER V7.20 COMMC 02/20/2005 14:59:35 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE COMMC
OBJECT MODULE PLACED IN commc.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE commc.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*======YB-51-A单片机通用实验板串口中断和液晶屏显示演示程序===========================
2 在pc机上利用通用串口调试程序(在配套光盘上),发送的字符可以在液晶屏上显示出来,同时可以接收单片机回送的字
-符
3 注意:程序编译后,会出现警告提示,是由于有未调用的函数和有被多个程序调用的函数,在此不影响实验
4 结果,暂可不用去理会。(可以通过屏蔽未调用的函数和把被多个程序调用的函数设为再入函数来解决)
5 ======程序来源:远博科技 0371-6949037 13949105551 13603453895=======================
6 ======日期:2004.9.8=====================*/
7 /*===================================================================
8
9 [注]:AT89C51的晶振频率为11.0592MHz
10 ====================================================================*/
11
12 /* ACM1602A (16x2)接线图
13 =====================================================================
14 连接线图: ACM-------51 ACM-------51 ACM--------51
15 DB0-----P0.0 DB4-----P0.4 RS-------P1_0
16 DB1-----P0.1 DB5-----P0.5 RW-------P1_1
17 DB2-----P0.2 DB6-----P0.6 E--------P1_2
18 DB3-----P0.3 DB7-----P0.7 BLA------P1_3
19
20 VLCD接1K电阻到GND
21
22 ====================================================================*/
23 /*阅读本程序之前,请参考光盘上带的LCD1602的工作原理(长沙太阳人科技公司提供)*/
24
25 #include <AT89X51.H>
26 #include <Delay.h>
27 #include <stdio.h>
28 #include <Intrins.h>
29 #define uchar unsigned char
30 #define uint unsigned int
31
32 // 1602连线
33 #define RS P1_0 //数据/命令选择
34 #define RW P1_1 //读/写选择
35 #define Elcm P1_2 //使能信号
36 #define BLA P1_3 //液晶显示屏背光
37
38 #define DataPort P0 // 数据端口
39 #define Busy 0x80
40 void WaitForEnable( void );
41 void LcdWriteData( char dataW );
42 void LcdWriteCommand( uchar CMD,uchar AttribC ) ;
43 void LcdReset( void ) ;
44 void DispOneChar(uchar x,uchar y,uchar Wdata) ;
45 void ePutstr(uchar x,uchar y, uchar code *ptr) ;
46 void comminit(void);
47 void scomm(void);
48 code char examp[]="serial communication test";
49 uchar x=0,y=0,sedata;
50
51
52 void main(void) {
53 1 DelayMs(1000); //延时,保证器件复位
54 1 comminit(); //串口初始化,打开串口中断
C51 COMPILER V7.20 COMMC 02/20/2005 14:59:35 PAGE 2
55 1 BLA=0; //打开液晶显示屏背光
56 1 LcdReset(); //液晶屏初始化
57 1 ePutstr(0,0,examp); // 液晶屏显示一个预定字符串
58 1 DelayMs(10000);
59 1 LcdReset();
60 1 while(1); //无限循环。
61 1 }
62
63
64 /*=======================================================
65 液晶屏上显示字符串
66 =======================================================*/
67 void ePutstr(uchar x,uchar y, uchar code *ptr) {
68 1 uchar i,l=0;
69 1 while (*ptr++ >0){l++;}; //统计字符的个数(c中,对于字符串而言,最后是以“\0”结束的,对应的ASC码
-为零
70 1 ptr=ptr-(l+1); //使指针重新指向首个字符
71 1 for (i=0;i<l;i++) { DispOneChar(x++,y,*ptr++);
72 2 if ( x == 31 ) { x = 0; y ^= 0; }
73 2 }
74 1 }
75
76
77 /*=======================================================
78 显示光标定位
79 =======================================================*/
80 void Disp_XY( char posx,char posy) {
81 1
82 1 uchar temp;
83 1
84 1 temp = posx & 0x0f;
85 1 posy &= 0x1;
86 1 if ( posx>15 ) temp |= 0x40;
87 1 if (posy==1) temp |=0x40;
88 1 temp |= 0x80;
89 1 LcdWriteCommand(temp,0);
90 1 }
91
92 /*=======================================================
93 按指定位置显示数出一个字符
94 =======================================================*/
95 void DispOneChar(uchar x,uchar y,uchar Wdata) {
96 1
97 1 Disp_XY( x, y ); // 定位显示地址
98 1 LcdWriteData( Wdata ); // 写字符
99 1 }
100
101 /*=======================================================
102 初始化程序, 必须按照产品资料介绍的初始化过程进行
103 =======================================================*/
104 void LcdReset( void ) {
105 1
106 1 LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
107 1 DelayMs(10);
108 1 LcdWriteCommand( 0x38, 0); // 共三次
109 1 DelayMs(10);
110 1 LcdWriteCommand( 0x38, 0);
111 1 DelayMs(10);
112 1
113 1 LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
114 1 LcdWriteCommand( 0x08, 1); // 显示关闭
115 1 LcdWriteCommand( 0x01, 1); // 显示清屏
C51 COMPILER V7.20 COMMC 02/20/2005 14:59:35 PAGE 3
116 1 LcdWriteCommand( 0x06, 1); // 显示光标移动设置
117 1 LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
118 1 }
119
120 /*=======================================================
121 写控制字符子程序: E=1 RS=0 RW=0
122 =======================================================*/
123 void LcdWriteCommand( uchar CMD,uchar AttribC ) {
124 1
125 1 if (AttribC) WaitForEnable(); // 检测忙信号?
126 1 RS=0; RW=0; _nop_();
127 1 DataPort=CMD; _nop_();
128 1 // 送控制字子程序
129 1 Elcm=1;_nop_();_nop_();Elcm=0; // 操作允许脉冲信号
130 1 }
131
132 /*=======================================================
133 当前位置写字符子程序: E =1 RS=1 RW=0
134 =======================================================*/
135 void LcdWriteData( char dataW ) {
136 1
137 1 WaitForEnable();
138 1 // 检测忙信号
139 1
140 1 RS=1; RW=0; _nop_();
141 1
142 1 DataPort=dataW; _nop_();
143 1
144 1 Elcm=1; _nop_(); _nop_(); Elcm=0; // 操作允许脉冲信号
145 1
146 1 }
147
148 /*=======================================================
149 正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
150 DB7: 0 LCD控制器空闲; 1 LCD控制器忙
151 ========================================================*/
152 void WaitForEnable( void ) {
153 1
154 1 DataPort = 0xff;
155 1
156 1 RS=0; RW=1; _nop_(); Elcm=1; _nop_(); _nop_();
157 1
158 1 while( DataPort & Busy );
159 1 Elcm=0;
160 1 }
161
162 /********************************************************************************
163 串口中断服务程序,在中断中调用液晶屏显示程序
164 *********************************************************************************/
165 void scomm(void) interrupt 4 {
166 1 while(!RI); //判断是否接收完成
167 1 EA=0;
168 1 RI=0;
169 1 sedata=SBUF; //保存数据
170 1 DispOneChar(x++,y,sedata);
171 1 if ( x == 32 ) { x = 0; y ^= 0; } //显示到最后位置以后,重新开始从第一个位置显
-示
172 1 SBUF=sedata; //转发数据
173 1 while (!TI); //判断是否发送完成
174 1 TI=0;
175 1 EA=1;
176 1 }
C51 COMPILER V7.20 COMMC 02/20/2005 14:59:35 PAGE 4
177 /*********************************************************************************
178 串口初始化程序
179 **********************************************************************************/
-
180 void comminit(void) {
181 1 TMOD=0x20; //定时器1方式2定时
182 1 TH1=0xfd;
183 1 TL1=0xfd; //置定时器初值,选定9600bps
184 1 SCON=0x50; //选择通讯方式1 (1位起始,8位数据,1位停止)
185 1 TR1=1; //启动定时器
186 1 ET1=0;
187 1 ES=1; //开串口中断
188 1 EA=1; //开中断
189 1 }
190
191
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 503 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 9
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?