📄 1602.lst
字号:
C51 COMPILER V8.01 1602 03/30/2008 11:45:28 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE 1602
OBJECT MODULE PLACED IN 1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602.c BROWSE DEBUG OBJECTEXTEND CODE
line level source
1 //单行或双行显示
2 //显示的起始位置设定
3 //屏幕左右移动,动画效果
4 //给定一个字符数组,如何通过strlen()来判断字符串的长度?这样在for初始化时,也许可以简化程序
5 //最后的一行,会再次显一遍,又返回到了第一行
6 //遇到\n 自动换行
7
8 //两个外部中断调节,自动翻页的速度。
9 //暂停键,再次按,开始
10
11 //设置一个手动翻页,上下键
12
13 //如果全用中断那么中断太多,如何扩展中断?
14 #include <at89x51.h>
15 #include <intrins.h>
16 #define uchar unsigned char
17 #define uint unsigned int
18 sbit lcd_RS=P2^5; //定义寄存器
19 sbit lcd_RW=P2^6; //定义是否读写
20 sbit lcd_E=P2^7; //定义使能端
21 sbit lcd_flag=P0^7; //定义是否Busy标志
22 sbit pd=P1^0;
23 sbit pu=P1^1;
24 sbit spdd=P1^2;
25 sbit spdu=P1^3;
26 uint spd=600;
27 uchar *app;
28 //uchar dis1[]="0123456789012345";
29 //uchar dis2[]="abcdefghijklmnop";
30 uchar code dis[]="you bought all the books you need thiss emester yet?";
31 //uchar dis1[]="012345";
32 bit lcd_busy() //判断是否忙碌 RS=Low,RW=High,E=High:读状态
33 {
34 1 bit flag;
35 1 lcd_RS=0; //寄存器为Low
36 1 lcd_RW=1; //是否读写为High
37 1 lcd_E=1; //使能端为High
38 1 if (lcd_flag==1) flag=1;
39 1 else flag=0;
40 1 lcd_E=0;
41 1 return flag; //返回标志,判断是否LCD忙碌
42 1 }
43 void lcd_putcommand(uchar command) //写指令 RS=Low,RW=Low,E=High:写指令
44 {
45 1 while (lcd_busy()); //判断是否忙碌
46 1 lcd_RS=0;
47 1 lcd_RW=0;
48 1 lcd_E=0;
49 1 P0=command;
50 1 lcd_E=1;
51 1 lcd_E=0;
52 1 }
53 void lcd_putchar(uchar putchar) //写数据 RS=High,RW=Low,E=High:写数据
54 {
55 1 while(lcd_busy()); //判断是否忙碌
C51 COMPILER V8.01 1602 03/30/2008 11:45:28 PAGE 2
56 1 lcd_RS=1;
57 1 lcd_RW=0;
58 1 lcd_E=0;
59 1 P0=putchar;
60 1 lcd_E=1;
61 1 lcd_E=0;
62 1 }
63 void lcd_moveto(uchar x,uchar y) //显示字符的位置:第x行y列(X=1或2,Y=1~16)
64 {
65 1 if (x==0) lcd_putcommand(0x80|y-1); //第一行,并初始化从第y-1个字符开始显示
66 1 if (x==1) lcd_putcommand(0xc0|y-1); //第二行,并............
67 1 }
68 void lcd_delay(uint ms) //延时函数
69 {
70 1 uchar i;
71 1 while(ms--)
72 1 {
73 2 for(i=0;i<250;i++)
74 2 {
75 3 _nop_();_nop_();_nop_();_nop_();
76 3 }
77 2 }
78 1 }
79 void lcd_init(void)
80 {
81 1 lcd_putcommand(0x38); lcd_delay(1); //LCD为2行,5×7字
82 1 lcd_putcommand(0x0e); //打开显示,显示光标,光标不闪
83 1 // lcd_putcommand(0x0f); //....................光标闪烁
84 1 lcd_delay(1);
85 1 lcd_putcommand(0x06); lcd_delay(1);//每次右移一字符
86 1
87 1 }
88 void main(void)
89 {
90 1 // IT0=1; //设置中断触发方式,下降沿
91 1 // IE=0X81;
92 1
93 1 //uchar flag,m,i;
94 1 uchar *p;
95 1 app=dis;
96 1 //m=strlen(dis);
97 1 lcd_init(); //初始化
98 1 // lcd_delay(10);
99 1 IT0=1; //设置中断触发方式,下降沿
100 1 IE=0X81; //中断放在前面,会引起指针变量声明错误
101 1 while(1)
102 1 {app=dis;
103 2 while(*app!='\0')
104 2 {
105 3 /************第一行***************/
106 3 lcd_moveto(0,1);
107 3 lcd_putcommand(0x08); //在显示数据时关闭显示,否则如果cpu慢的话,会感觉闪烁
108 3 for(p=app;(p<app+16)&&(*p!='\0');p++) //逻辑判断的顺序是从右到左,所以把 *p~='\0'写右边
109 3 {
110 4
111 4 lcd_putchar(*p);
112 4 // lcd_delay(100);
113 4 }
114 3 app+=16;
115 3 // lcd_putcommand(0x0e);
116 3 // lcd_delay(200);
117 3 /***********第二行****************/
C51 COMPILER V8.01 1602 03/30/2008 11:45:28 PAGE 3
118 3 // lcd_putcommand(0x08);
119 3 lcd_moveto(1,1);
120 3 for(p=app;(p<app+16)&&(*p!='\0');p++)
121 3 {
122 4 lcd_putchar(*p);
123 4 // lcd_delay(100);
124 4 }
125 3 // dis=dis+16;
126 3 lcd_putcommand(0x0e);
127 3
128 3 lcd_delay(spd);
129 3 lcd_putcommand(0x01);
130 3
131 3 if(*p=='\0') break; //阻止最后一行再次显示
132 3
133 3
134 3 }
135 2 }
136 1
137 1 // while(1);
138 1 }
139
140
141 void lcd_key() interrupt 0 using 2 //外部中断0 ,第一组寄存器,r0
142 {
143 1 /* switch (P1)
144 1 {
145 1 case 0xfe: //第一个键按下
146 1 }*/
147 1 if (pu==0)
148 1 {app-=16;}
149 1 else if (pd==0)
150 1 {app+=16;}
151 1 else if (spdd==0)
152 1 { if(spd<2000)
153 2 spd+=500;
154 2
155 2 }
156 1 else if (spdu==0)
157 1 { if(spd>200)
158 2 spd-=500;
159 2
160 2 }
161 1 else ;//异常原因引起的中断,不处理,但此处有个问题,如果同时按下两个键呢,呵呵,总有个先后,你说呢
162 1
163 1 }
C51 COMPILER V8.01 1602 03/30/2008 11:45:28 PAGE 4
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION lcd_busy (BEGIN)
; SOURCE LINE # 32
; SOURCE LINE # 33
; SOURCE LINE # 35
0000 C2A5 CLR lcd_RS
; SOURCE LINE # 36
0002 D2A6 SETB lcd_RW
; SOURCE LINE # 37
0004 D2A7 SETB lcd_E
; SOURCE LINE # 38
0006 308704 JNB lcd_flag,?C0001
0009 D200 R SETB flag
000B 8002 SJMP ?C0002
000D ?C0001:
; SOURCE LINE # 39
000D C200 R CLR flag
000F ?C0002:
; SOURCE LINE # 40
000F C2A7 CLR lcd_E
; SOURCE LINE # 41
0011 A200 R MOV C,flag
; SOURCE LINE # 42
0013 ?C0003:
0013 22 RET
; FUNCTION lcd_busy (END)
; FUNCTION _lcd_putcommand (BEGIN)
; SOURCE LINE # 43
;---- Variable 'command' assigned to Register 'R7' ----
; SOURCE LINE # 44
0000 ?C0004:
; SOURCE LINE # 45
0000 120000 R LCALL lcd_busy
0003 40FB JC ?C0004
0005 ?C0005:
; SOURCE LINE # 46
0005 C2A5 CLR lcd_RS
; SOURCE LINE # 47
0007 C2A6 CLR lcd_RW
; SOURCE LINE # 48
0009 C2A7 CLR lcd_E
; SOURCE LINE # 49
000B 8F80 MOV P0,R7
; SOURCE LINE # 50
000D D2A7 SETB lcd_E
; SOURCE LINE # 51
000F C2A7 CLR lcd_E
; SOURCE LINE # 52
0011 22 RET
; FUNCTION _lcd_putcommand (END)
; FUNCTION _lcd_putchar (BEGIN)
; SOURCE LINE # 53
;---- Variable 'putchar' assigned to Register 'R7' ----
; SOURCE LINE # 54
0000 ?C0007:
; SOURCE LINE # 55
0000 120000 R LCALL lcd_busy
0003 40FB JC ?C0007
C51 COMPILER V8.01 1602 03/30/2008 11:45:28 PAGE 5
0005 ?C0008:
; SOURCE LINE # 56
0005 D2A5 SETB lcd_RS
; SOURCE LINE # 57
0007 C2A6 CLR lcd_RW
; SOURCE LINE # 58
0009 C2A7 CLR lcd_E
; SOURCE LINE # 59
000B 8F80 MOV P0,R7
; SOURCE LINE # 60
000D D2A7 SETB lcd_E
; SOURCE LINE # 61
000F C2A7 CLR lcd_E
; SOURCE LINE # 62
0011 22 RET
; FUNCTION _lcd_putchar (END)
; FUNCTION _lcd_moveto (BEGIN)
; SOURCE LINE # 63
;---- Variable 'y' assigned to Register 'R5' ----
;---- Variable 'x' assigned to Register 'R6' ----
0000 AE07 MOV R6,AR7
; SOURCE LINE # 64
; SOURCE LINE # 65
0002 EE MOV A,R6
0003 7008 JNZ ?C0010
0005 ED MOV A,R5
0006 14 DEC A
0007 4480 ORL A,#080H
0009 FF MOV R7,A
000A 120000 R LCALL _lcd_putcommand
000D ?C0010:
; SOURCE LINE # 66
000D BE0108 CJNE R6,#01H,?C0012
0010 ED MOV A,R5
0011 14 DEC A
0012 44C0 ORL A,#0C0H
0014 FF MOV R7,A
0015 120000 R LCALL _lcd_putcommand
; SOURCE LINE # 67
0018 ?C0012:
0018 22 RET
; FUNCTION _lcd_moveto (END)
; FUNCTION _lcd_delay (BEGIN)
; SOURCE LINE # 68
;---- Variable 'i' assigned to Register 'R5' ----
;---- Variable 'ms' assigned to Register 'R6/R7' ----
; SOURCE LINE # 69
0000 ?C0013:
; SOURCE LINE # 71
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -