📄 untitled.lst
字号:
1: /*****************************************
2: *
3: *
4: * 时钟频率:内部8MHz *
5: * 设 计:方 勇 *
6: * 修改日期:2008年08月20日 *
7: * 编译环境:maplab8.1 *
8: * 实验环境:自制试验板 *
9: * 使用端口:1602:PC0,PC2,PC4~PC7 *
10: *****************************************/
11:
12: #include "pic18.h"
13: #pragma romdata TABLE=0x1000
14: const rom char table[240]={0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
15: 0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00, //"P",0~15
16: 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
17: 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, //"I",16~31
18: 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
19: 0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00, //"C",32~47
20: 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
21: 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, //"1",48~63
22: 0x00,0x70,0x88,0x08,0x00,0x1C,0x22,0x21, //"8"左,64~71
23: 0x08,0x88,0x70,0x00,0x21,0x22,0x1C,0x00, //"8"右,72~79
24: 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
25: 0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00, //"F",80~95
26: 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
27: 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, //"4",96~111
28: 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
29: 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, //"5",112~127
30: 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
31: 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, //"8",128~143
32: 0x00,0x10,0x0C,0x04,0x4C,0xB4,0x94,0x05,
33: 0xF6,0x04,0x04,0x04,0x14,0x0C,0x04,0x00,
34: 0x00,0x82,0x82,0x42,0x42,0x23,0x12,0x0A,
35: 0x07,0x0A,0x12,0xE2,0x42,0x02,0x02,0x00, //"实",144~175
36: 0x02,0xFA,0x82,0x82,0xFE,0x80,0x40,0x60,
37: 0x08,0x04,0x24,0x40,0x3F,0x22,0x2C,0x21, //"验"左,176~191
38: 0x58,0x46,0x48,0x50,0x20,0x20,0x20,0x00,
39: 0x21,0x2E,0x20,0x30,0x2C,0x23,0x20,0x00, //"验"右,192~207
40: 0x10,0x10,0xD0,0xFF,0x50,0x90,0x00,0xFE,
41: 0x62,0xA2,0x22,0x21,0xA1,0x61,0x00,0x00,
42: 0x04,0x03,0x00,0x7F,0x00,0x11,0x0E,0x41,
43: 0x20,0x11,0x0A,0x0E,0x31,0x60,0x20,0x00};//"板",208~239
44: #pragma romdata
45:
46: void initial()
47: {
48: INTCON=0X00;
49: WDTCON=0;
50: ADCON1=0X87; //设置所有与模拟输入共用的引脚为I/O方式
51: TRISE=TRISE&0XF8; //设置RE0,RE1,RE2为输出
52: TRISB=TRISB&0XFE; //设置RB0为输出
53: TRISA=TRISA&0XF7; //设置RA3为输出
54:
55: }
56:
57:
58: //读液晶显示器状态子程序,行参E代表液晶的边
59: void LCDSTA1(int E)
60: //int E;
61: {
62: int E1FLAG;
63: TRISD=0XFF; //设置D口为输入
64: while(1)
65: {
66: if(E==1)
67: {PORTA=PORTA|0X08; //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
68: PORTE=(PORTE|0X01)&0XF9;}
69: else
70: {PORTA=PORTA&0XF7; //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
71: PORTE=(PORTE|0X05)&0XFD;}
72: PORTB=PORTB|0X01; //RB0/E=1
73: E1FLAG=PORTD&0X80;
74: PORTB=PORTB&0XFE; //RB0/E=0
75: if(E1FLAG==0X0000)break;
76: }
77: }
78:
79: //对液晶显示器发指令子程序,行参E代表处理的液晶的边
80: void TRANS1(int TRANS,int E)
81: //int TRANS,E;
82: {
83: LCDSTA1(E);
84: TRISD=0X00; //RD为输出
85: if(E==1) //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=0
86: {PORTA=PORTA|0X08;
87: PORTE=PORTE&0XF8;}
88: else //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=0
89: {PORTA=PORTA&0xF7;
90: PORTE=(PORTE|0X04)&0XFC;}
91: PORTD=TRANS;
92: PORTB=PORTB|0X01; //RB0/E=1
93: PORTB=PORTB&0XFE; //RB0/E=0
94: }
95:
96: //对液晶显示器写数据子程序
97: void WRITE1(char WRITE,int CLMADD,int E)
98: //int WRITE,CLMADD,E;
99: {
100: TRANS1(CLMADD,E); //设置列地址
101: LCDSTA1(E); //查询液晶是否为空闲
102: TRISD=0X00; //RD为输出
103: if(E==1) //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=1
104: {PORTA=PORTA|0X08;
105: PORTE=(PORTE|0X02)&0xFA;}
106: else //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=1
107: {PORTA=PORTA&0xF7;
108: PORTE=(PORTE|0X06)&0xFE;}
109: PORTD=WRITE;
110: PORTB=PORTB|0X01; //RB0/E=1
111: PORTB=PORTB&0XFE; //RB0/E=0
112: }
113:
114: //开E边显示子程序
115: void DISP1(int E)
116: //int E;
117: {
118: int E1FLAG;
119: while(1)
120: {
121: TRANS1(0X03F,E); //送出控制命令
122: LCDSTA1(E); //判断液晶是否为空闲状态
123: TRISD=0XFF; //设置ED为输入
124: if(E==1) //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
125: {PORTA=PORTA|0X08;
126: PORTE=(PORTE|0X01)&0xF9;}
127: else //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
128: {PORTA=PORTA&0xF7;
129: PORTE=(PORTE|0X05)&0xFD;}
130: PORTB=PORTB|0X01; //RB0/E=1
131: E1FLAG=PORTD&0X20;
132: PORTB=PORTB&0XFE; //RB0/E=0
133: if(E1FLAG==0X00)break; //如果液晶被打开,则退出循环,否则继续打开
134: }
135: }
136:
137: //E边清屏子程序
138: void CLEAR1(int E)
139: //int E;
140: {
141: int PAGEADD,PAGENUM,CLMADD,CLMSUM;
142: for(PAGENUM=0X08,PAGEADD=0X0B8;PAGENUM>0;PAGENUM--,PAGEADD++)
143: {
144: TRANS1(PAGEADD,E); //设置相应的页地址
145: for(CLMSUM=0x40;CLMSUM<=0X7F;CLMSUM++)
146: {
147: LCDSTA1(E); //判断液晶空闲状态
148: WRITE1(0X00,CLMSUM,E); //送0清屏
149: }
150: }
151: }
152:
153:
154: //关E边显示子程序
155: void DISOFF1(int E)
156: //int E;
157: {
158: int E1FLAG;
159: while(1)
160: {
161: TRANS1(0X3E,E); //发送控制命令
162: LCDSTA1(E); //判断液晶是否为空闲状态
163: TRISD=0XFF; //设置RD为输入
164: if(E==1) //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
165: {PORTA=PORTA|0X08;
166: PORTE=(PORTE|0X01)&0xF9;}
167: else //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
168: {PORTA=PORTA&0xF7;
169: PORTE=(PORTE|0X05)&0xFD;}
170: PORTB=PORTB|0X01; //RB0/E=1
171: E1FLAG=PORTD&0X20;
172: PORTB=PORTB&0XFE; //RB0/E=0
173: if(E1FLAG==0X20)break; //如液晶关闭,则推出循环,否则继续关闭
174: }
175: }
176:
177: //LCD的E边初始化子程序
178: void LCD1INIT(int E)
179: {
180: DISOFF1(E); //关E区显示
181: /*TRANS1(0X0A4,E);
182: TRANS1(0X0A9,E);
183: TRANS1(0X0E2,E);
184: TRANS1(0X0A0,E);*/
185: CLEAR1(E); //清屏
186: LCDSTA1(E); //判断液晶空闲状态
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -