Proteus isis 基于无字库pg12864f 的c51汉字显示以及a/d转换电压表仿真

 

 

汉字使用取模软件获得,

代码如下

#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[6][32]={{
//长
0x08,0x00,0x08,0x10,0x08,0x20,0x08,0x40,0x08,0x80,0x09,0x00,0x08,0x00,0xFF,0xFE,
0x0A,0x00,0x09,0x00,0x08,0x80,0x08,0x40,0x09,0x20,0x0A,0x18,0x0C,0x06,0x08,0x00},
//沙
{0x00,0x40,0x20,0x40,0x10,0x40,0x11,0x48,0x81,0x44,0x42,0x42,0x42,0x42,0x14,0x48,
0x10,0x48,0x20,0x48,0xE0,0x10,0x20,0x10,0x20,0x20,0x20,0x40,0x21,0x80,0x06,0x00},
//民
{0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x80,0x20,0x80,
0x3F,0xFC,0x20,0x80,0x20,0x40,0x20,0x40,0x24,0x24,0x28,0x14,0x30,0x0C,0x20,0x04},
//政
{0x00,0x20,0x00,0x20,0xFF,0x20,0x08,0x3E,0x08,0x44,0x08,0x44,0x48,0x44,0x4E,0xA4,
0x48,0x28,0x48,0x28,0x48,0x10,0x48,0x10,0x4F,0x28,0xF0,0x48,0x00,0x84,0x01,0x02},
//学
{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},
//院
{0x00,0x40,0x78,0x20,0x4B,0xFE,0x52,0x02,0x54,0x04,0x61,0xF8,0x50,0x00,0x48,0x00,
0x4B,0xFE,0x48,0x90,0x68,0x90,0x50,0x90,0x41,0x12,0x41,0x12,0x42,0x0E,0x44,0x00}};

uchar code HZ1[6][32]={
//物
{0x10,0x80,0x10,0x80,0x50,0x80,0x50,0xFC,0x7D,0x54,0x52,0x54,0x90,0x54,0x10,0x94,
0x1C,0x94,0xF1,0x24,0x52,0x24,0x10,0x44,0x10,0x44,0x10,0x84,0x11,0x28,0x10,0x10},
//联
{0x00,0x88,0xFC,0x48,0x48,0x50,0x48,0x00,0x79,0xFC,0x48,0x20,0x48,0x20,0x78,0x20,
0x4B,0xFE,0x48,0x20,0x4C,0x50,0x78,0x50,0xC8,0x88,0x08,0x88,0x09,0x04,0x0A,0x02},
//一
{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},
//七
{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,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,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}};
uchar code HZ2[2][32]={{
//廖
0x00,0x80,0x3F,0xFE,0x20,0x00,0x2F,0x7C,0x29,0x24,0x25,0x14,0x29,0xA4,0x21,0x60,
0x26,0x18,0x38,0x86,0x23,0x20,0x2C,0x40,0x41,0x88,0x4E,0x30,0x81,0xC0,0x0E,0x00},
//亮
{0x02,0x00,0x01,0x00,0x7F,0xFC,0x00,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x00,0x00,
0x7F,0xFE,0x40,0x02,0x8F,0xE4,0x08,0x20,0x08,0x20,0x10,0x22,0x20,0x22,0xC0,0x1E}};

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<6;i++)
    display_HZ(0,1+i,HZ0[i]);
for(i=0;i<6;i++)
    display_HZ(1,1+i,HZ1[i]);
for(i=0;i<2;i++)
    display_HZ(2,3+i,HZ2[i]);
	
while(1){
AD_val= A_D();    //进行A/D转换
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;   //一个转换周期开始
   CLK=0;  //为第一个脉冲作准备
   CS=0;  //CS置0,片选有效
   DIO=1;    //DIO置1,规定的起始信号  
   CLK=1;   //第一个脉冲
   CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平
   DIO=1;   //DIO置1, 通道选择信号  
   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;         //第四个脉冲
      CLK=0; 
      dat<<=1;       //将下面储存的低位数据向右移
   dat|=(uchar)DIO;   //将输出数据DIO通过或运算储存在dat最低位 
    }             
    CS=1;          //片选无效 
  return dat;  //将读书的数据返回     
  }





 

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值