1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
| #include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含\_nop\_()函数定义的头文件
//全局变量声明 #define uchar unsigned char #define uint unsigned int
//ADC0832端口引脚定义 sbit CS=P1^0; //将CS位定义为P3.4引脚 sbit CLK=P1^1; //将CLK位定义为P1.0引脚 sbit DIO=P1^2; //将DIO位定义为P1.1引脚
sbit wr=P2^0; //数据写 sbit rd=P2^1; //数据读 sbit ce=P2^2; //片选 sbit cd=P2^3; //指令数据通道,1指令,0数据 sbit rst=P2^4; //复位信号
void delay(uint t); void init\_12864(); void write\_data(uchar dat); void write\_cmd1(uchar cmd); void write\_cmd2(uchar dat,uchar cmd); void write\_cmd3(uchar data1,uchar data2,uchar cmd); uchar read\_status(); void check\_status(); void clear\_screen(); void display\_char(uchar x,uchar y,uchar ch); void init(); uchar A\_D(); uchar code digit[10]= {16,17,18,19,20,21,22,23,24,25}; //定义字符数组显示数字 //注意汉字数组要加code放到外部存储器中,如果不加code则空间不够 uchar code HZ0[5][32]= { { 0x10,0x10,0x08,0x20,0x04,0x40,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08, 0x21,0x08,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,/\*"单",0\*/ },
{ 0x00,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x1F,0xFC,0x10,0x00,0x10,0x00, 0x10,0x00,0x1F,0xE0,0x10,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x40,0x20,/\*"片",1\*/
},
{ 0x10,0x00,0x11,0xF0,0x11,0x10,0x11,0x10,0xFD,0x10,0x11,0x10,0x31,0x10,0x39,0x10, 0x55,0x10,0x55,0x10,0x91,0x10,0x11,0x12,0x11,0x12,0x12,0x12,0x12,0x0E,0x14,0x00,/\*"机",2\*/ },
{ 0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0, 0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/\*"学",0\*/ }, //学
{ 0x00,0x00,0x7F,0xF8,0x00,0x08,0x00,0x08,0x08,0x08,0x04,0x08,0x02,0x08,0x02,0x08, 0x00,0x68,0x01,0x88,0x0E,0x08,0x70,0x08,0x20,0x08,0x00,0x08,0x00,0x50,0x00,0x20,/\*"习",1\*/ } };
uchar code HZ1[5][32]= {
{ 0x01,0x00,0x21,0x08,0x21,0x08,0x3F,0xF8,0x00,0x20,0x22,0x20,0x22,0x3E,0xFF,0x42, 0x22,0x94,0x22,0x10,0x3E,0x10,0x22,0x10,0x22,0x28,0x3E,0x28,0x22,0x44,0x00,0x82,/\*"嵌",0\*/ },
{ 0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,0x02,0x80, 0x04,0x40,0x04,0x40,0x08,0x20,0x08,0x20,0x10,0x10,0x20,0x10,0x40,0x08,0x80,0x06,/\*"入",1\*/ },
{ 0x00,0x48,0x00,0x44,0x00,0x44,0x00,0x40,0xFF,0xFE,0x00,0x40,0x00,0x40,0x3E,0x40, 0x08,0x40,0x08,0x40,0x08,0x20,0x08,0x22,0x0F,0x12,0x78,0x0A,0x20,0x06,0x00,0x02,/\*"式",2\*/ },
{ 0x00,0x00,0x7F,0xFC,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0xFF,0xFE, 0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x40,0x20,/\*"开",3\*/ },
{ 0x01,0x00,0x11,0x10,0x11,0x08,0x22,0x00,0x3F,0xFC,0x02,0x00,0x04,0x00,0x07,0xF8, 0x0A,0x08,0x09,0x08,0x11,0x10,0x10,0xA0,0x20,0x40,0x40,0xA0,0x03,0x18,0x1C,0x06,/\*"发",4\*/ },
};
uchar code HZ3[4][32]= { //电 { 0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8, 0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x0A,0x01,0x02,0x01,0x02,0x00,0xFE }, //压 { 0x00,0x00,0x3F,0xFE,0x20,0x00,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x2F,0xFC, 0x20,0x80,0x20,0x80,0x20,0x90,0x20,0x88,0x20,0x88,0x40,0x80,0x5F,0xFE,0x80,0x00 }, //: { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, //伏 { 0x08,0x40,0x08,0x50,0x08,0x48,0x10,0x48,0x10,0x40,0x37,0xFE,0x30,0x40,0x50,0x40, 0x90,0xA0,0x10,0xA0,0x10,0xA0,0x11,0x10,0x11,0x10,0x12,0x08,0x14,0x04,0x18,0x02 } }; uchar code HZ4[11][32] = { //零 { 0x3F,0xF8,0x01,0x00,0x7F,0xFE,0x41,0x02,0x9D,0x74,0x01,0x00,0x1D,0x70,0x02,0x80, 0x0C,0x60,0x32,0x18,0xC1,0x06,0x1F,0xE0,0x00,0x20,0x06,0x40,0x01,0x80,0x00,0x40 }, //一 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, //二 { 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00 }, //三 { 0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00 }, //四 { 0x00,0x00,0x00,0x00,0x7F,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x48,0x44,0x48,0x3C,0x50,0x04,0x60,0x04,0x40,0x04,0x7F,0xFC,0x40,0x04,0x00,0x00 }, //五 { 0x00,0x00,0x7F,0xFC,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xF0,0x04,0x10, 0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0xFF,0xFE,0x00,0x00 }, //六 { 0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00, 0x04,0x40,0x04,0x20,0x08,0x10,0x08,0x08,0x10,0x08,0x20,0x04,0x40,0x04,0x00,0x00 }, //七 { 0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x3C,0x07,0xC0,0xFA,0x00, 0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x04,0x02,0x04,0x02,0x04,0x01,0xFC,0x00,0x00 }, //八 { 0x00,0x00,0x00,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x20, 0x08,0x20,0x08,0x20,0x08,0x10,0x10,0x10,0x10,0x08,0x20,0x08,0x20,0x04,0x40,0x02 }, //九 { 0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xE0,0x04,0x20,0x04,0x20,0x04,0x20, 0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x22,0x10,0x22,0x20,0x22,0x40,0x1E,0x80,0x00 }, //点 { 0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xFC,0x02,0x00,0x02,0x00,0x3F,0xF0,0x20,0x10, 0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x24,0x88,0x22,0x44,0x42,0x44,0x80,0x04 } }; //汉字显示函数,处在x y处显示汉字hz void display\_HZ(uchar x,uchar y,uchar \*hz)//x 0-3 y 0-7 { uchar i,j=0; for(i=0; i<16; i++) { write\_cmd3(((j/2)<<4)|(y\*2),x,0x24);//地址指针设置..低地址,高地址,命令 write\_cmd2(hz[j++],0xc0); write\_cmd2(hz[j++],0xc0); } } //由于pg12864f不带中文字库,所以采取取模方式以图片显示汉字。
void main() { uchar i,j=0; uint AD_val; //储存A/D转换后的值 uchar Int,Dec,t,h; //分别储存转换后的整数部分与小数部分小数 init(); for(i=0; i<5; i++) display\_HZ(0,1+i,HZ0[i]); for(i=0; i<5; i++) display\_HZ(1,1+i,HZ1[i]); delay(500); while(1) { AD_val= A\_D(); //进行A/D转换 delay(500); Int=(AD_val)/51; //计算整数部分 Dec=(AD_val%51)\*100/51; //计算小数部分 t=Dec/10; //取十位(小数点后第一位) h=Dec%10; //取个位(小数点后第二位) display\_HZ(3,0,HZ3[0]);//电 display\_HZ(3,1,HZ3[1]);//压 display\_HZ(3,2,HZ3[2]);//: display\_HZ(3,3,HZ4[Int]); display\_HZ(3,4,HZ4[10]);//. display\_HZ(3,5,HZ4[t]); display\_HZ(3,6,HZ4[h]); display\_HZ(3,7,HZ3[3]);//伏 }
}
void delay(uint t) { uint i,j; for(i=0; i<t; i++) for(j=0; j<50; j++); }
void init() { P2=0Xff; P1=0Xff;
rst=1; delay(10); rst=0;
wr=1; rd=1; ce=1; cd=1; rst=1;
check\_status(); write\_cmd3(0x01,0x00,0x21);//光标指针设置 check\_status(); write\_cmd3(0x00,0x00,0x42);//图形区首地址 check\_status(); write\_cmd3(16,0x00,0x43);//图形区宽度 check\_status(); write\_cmd1(0x80);//显示方式设置,正常显示 check\_status(); write\_cmd1(0x98);//图形方式显示,不显示字母,只打点 check\_status(); write\_cmd1(0xa0);//光标形状设置1 0 1 0 0 N2 N1 N0 }
void write\_data(uchar dat) { rd=1; cd=0; ce=0; wr=0; P0=dat; delay(10); wr=1; ce=1; cd=1; }
void write\_cmd1(uchar cmd) { rd=1; cd=1; ce=0; wr=0; P0=cmd; delay(10); wr=1; ce=1; cd=0; } //先送参数,再送指令 void write\_cmd2(uchar dat,uchar cmd) { check\_status(); write\_data(dat); check\_status(); write\_cmd1(cmd); } void write\_cmd3(uchar data1,uchar data2,uchar cmd) { check\_status(); write\_data(data1); check\_status(); write\_data(data2); check\_status(); write\_cmd1(cmd); }
uchar read\_status() { uchar status; P0=0;//端口b置为输入 rd=0; wr=1; ce=0; cd=1; status=P1; return status; } void check\_status() { uchar s; P0=0Xff;//端口b置为输出 while((s&0x80)!=0x80) s=read\_status();//等待位1,2置为。命令读写准备好。数据读写准备好 }
uchar A\_D() { uchar i,dat; CS=1; //一个转换周期开始 \_nop\_(); CLK=0; //为第一个脉冲作准备 \_nop\_(); \_nop\_(); CS=0; //CS置0,片选有效 \_nop\_(); DIO=1; //DIO置1,规定的起始信号 \_nop\_(); CLK=1; //第一个脉冲 CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平 \_nop\_();
DIO=1; //DIO置1, 通道选择信号 \_nop\_();
CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
CLK=0; //第二个脉冲下降沿
DIO=0; //DI置0,选择通道0
CLK=1; //第三个脉冲
CLK=0; //第三个脉冲下降沿
DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
CLK=1; //第四个脉冲 for(i=0; i<8; i++) //高位在前 { CLK=1; //第四个脉冲 \_nop\_(); \_nop\_(); CLK=0; \_nop\_(); \_nop\_(); dat<<=1; //将下面储存的低位数据向右移 dat|=(uchar)DIO; //将输出数据DIO通过或运算储存在dat最低位 } CS=1; //片选无效 return dat; //将读书的数据返回 }
|