您现在所在的是:

PLC论坛

回帖:52个,阅读:2090 [上一页] [1] [2] [3] [4] [5] [6] [下一页]
20178
高雅的雅
文章数:15776
年度积分:-210
历史总积分:20178
注册时间:2015/5/12
发站内信
2018论坛解答高手
发表于:2016/6/10 21:48:16
#50楼
子程序调用:可是子程序没有入口,人家找不到自然要报警,告诉你查错你还嫌人家智能程度太高:只能说你自己智商太低太低好吗
那一瞬间忽然不再想你,因为去一趟漠河,走了一趟西藏,逛了一趟天涯海角,泡了一会栖谷温泉,回来就是:一切随他去吧,该咋过咋过!!车祸不死感言
1865
czhaii
文章数:320
年度积分:160
历史总积分:1865
注册时间:2016/3/13
发站内信
发表于:2016/6/11 6:25:59
#51楼
回复 #50楼 高雅的雅
用PLC的老手,给你一个复杂的单片机程序也未必能看懂。
1865
czhaii
文章数:320
年度积分:160
历史总积分:1865
注册时间:2016/3/13
发站内信
发表于:2016/6/11 6:28:25
#52楼
回复 #50楼 高雅的雅
 #include  <reg52.H>//L352 CODE1930
             #include  <intrins.h>
             #include  <Ctype.h>
             #define   uchar unsigned char
             #define   uint unsigned int
             #define   ulong unsigned long
             sfr       P5=0xc8;
             sbit      key=P2^7;
             sbit      keyen=P1^1;
             sbit      cs1=P1^2;
             sbit      reset=P1^4;
             sbit      rs=P1^5;
             sbit      sck=P5^4;
             sbit      sda=P1^7;
             sbit      Rom_CS=P2^3;      /*PIN1字库IC接口定义Rom_CS就是字库IC的CS#*/
             sbit      Rom_SCK=P2^4;     /*PIN6字库IC接口定义:Rom_SCK就是字库IC的SCK*/
             sbit      Rom_OUT=P2^2;     /*PIN2字库IC接口定义:Rom_OUT就是字库IC的OUT*/
             sbit      Rom_IN=P2^5;      /*PIN5字库IC接口定义:Rom_IN就是字库IC的IN*/
             uint      array[32],i;      //定义数组a 循环总变量i
             uchar     Avalue,Bvalue;    //合并为前后两个字节
             uchar     fontbuff[32];      //字库中读出的数据存放缓冲数组单元
             uchar code zhuang1[]={
/*-- 文字: 状 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00,
0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00};
uchar code tai1[]={
/*-- 文字: 态 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x00,0x04,0x04,0x04,0x84,0x44,0x34,0x4F,0x94,0x24,0x44,0x84,0x84,0x04,0x00,0x00,
0x00,0x60,0x39,0x01,0x00,0x3C,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00};
uchar code shi1[]={
/*-- 文字: 使 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,
0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00};
uchar code yong1[]={
/*-- 文字: 用 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00};
uchar code mao_hao[]={
/*-- 文字: : (冒号) --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};
char code num0[]={
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00
};
char code num1[]={
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00
};
char code num2[]={
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00
};
char code num3[]={
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00
};
char code num4[]={
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00
};
char code num5[]={
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00
};
char code num6[]={
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00
};
char code num7[]={
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
};
char code num8[]={
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00
};
char code num9[]={
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
};
/***********延时*********/
             void delay(int i)
             {
             int j,k;
             for(j=0;j<i;j++)
             for(k=0;k<550;k++);
             }
/***************送指令到字库IC***********************/
             void send_command_to_ROM( uchar datu )
             {
            uchar i;
             for(i=0;i<8;i++ )
             {
             if(datu&0x80)
             Rom_IN=1;
             else
             Rom_IN=0;
             datu=datu<<1;
             Rom_SCK=0;
             Rom_SCK=1;
             }
             }
/*****(从字库IC中取汉字或字符数据(1个字节****/
             static uchar ROMDATA( )
             {
               uchar i;
             uchar ret_data=0;
             Rom_SCK=1;
              for(i=0;i<8;i++)
              {
              Rom_OUT=1;
              delay(1);
              Rom_SCK=0;
              ret_data=ret_data<<1;
              if( Rom_OUT )
              ret_data=ret_data+1;
              else
              ret_data=ret_data+0;
              Rom_SCK=1;
              }
             return(ret_data);
             }
/*从相关地址High地址高字节Mid地址中字节Low地址低字节中连续读出DataLen个字节的数据到 pBuff的地址*/
             void BytesDataFromROM(uchar ADHigh,ADMid, ADLow,DataLen,uchar *pBuff)
             {
            uchar i;
            Rom_CS = 0;
             Rom_SCK=0;
            send_command_to_ROM(0x03);
            send_command_to_ROM(ADHigh);
            send_command_to_ROM(ADMid);
            send_command_to_ROM(ADLow);
             for(i=0;i<DataLen;i++ )
            *(pBuff+i)=ROMDATA();
            Rom_CS=1;
             }
/***函数功能:将两个八位(高位和低位)二进制传递给函数入口,
函数通过计算查找相应位置的汉字后写入出口32位字符表函数
入口函数uchar MSB,uchar LSB,出口字符表函数fontbuff***/
             ulong  fontaddr=0;
             void displayGB2312(uchar MSB,uchar LSB)
             {
            uchar i= 0;
            uchar addrHigh,addrMid,addrLow ;
             if(((MSB>=0xb0) &&(MSB<=0xf7))&&(LSB>=0xa1))
             {
/*国标简体(GB2312)汉字在字库IC中的地址由以下公式来计算:*/
/*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
/*由于担心8位单片机有乘法溢出问题,所以分三部取地址*/
             fontaddr = (MSB-0xb0)*94;
             fontaddr += (LSB-0xa1)+846;
             fontaddr = (ulong)(fontaddr*32);
             addrHigh = (fontaddr&0xff0000)>>16;  /*地址的高8位,共24位*/
             addrMid = (fontaddr&0xff00)>>8;      /*地址的中8位,共24位*/
             addrLow = fontaddr&0xff;        /*地址的低8位,共24位*/
             BytesDataFromROM(addrHigh,addrMid,addrLow,32,fontbuff);/*取32个字节的数据,存到"fontbuf[32]"*/
             i+=2;
             }
             else if(((MSB>=0xa1) &&(MSB<=0xa3))&&(LSB>=0xa1))
             {
/*国标简体(GB2312)15x16点的字符在字库IC中的地址由以下公式来计算:*/
/*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
/*由于担心8位单片机有乘法溢出问题,所以分三部取地址*/
             fontaddr = (MSB- 0xa1)*94;
             fontaddr += (LSB-0xa1);
             fontaddr = (ulong)(fontaddr*32);
             addrHigh = (fontaddr&0xff0000)>>16;  /*地址的高8位,共24位*/
             addrMid = (fontaddr&0xff00)>>8;      /*地址的中8位,共24位*/
             addrLow = fontaddr&0xff;        /*地址的低8位,共24位*/
             BytesDataFromROM(addrHigh,addrMid,addrLow,32,fontbuff);/*取32个字节的数据,存到"fontbuf[32]"*/
             i+=2;
             }
             else if((MSB>=0x20) &&(MSB<=0x7e))
             {
             unsigned char fontbuff[16];
             fontaddr = (MSB- 0x20);
             fontaddr = (unsigned long)(fontaddr*16);
             fontaddr = (unsigned long)(fontaddr+0x3cf80);
             addrHigh = (fontaddr&0xff0000)>>16;
             addrMid = (fontaddr&0xff00)>>8;
             addrLow = fontaddr&0xff;
              BytesDataFromROM(addrHigh,addrMid,addrLow,16,fontbuff);/*取16个字节的数据,存到"fontbuf[32]"*/
             i+=1;
             }
             else
             i++;
            }
/************写指令到LCD 模块**************/
             void transfer_command(int data1)
             {
             char i;
             cs1=0;
             rs=0;
              for(i=0;i<8;i++)
              {
              sck=0;
              if(data1&0x80) sda=1;
              else sda=0;
              sck=1;
              data1=data1<<=1;
              }
             }
/*写数据到LCD 模块*/
             void transfer_data(int data1)
             {
             char i;
             cs1=0;
             rs=1;
              for(i=0;i<8;i++)
              {
              sck=0;
              if(data1&0x80) sda=1;
              else sda=0;
              sck=1;
              data1=data1<<=1;
              }
             }
/************检测按键输入信号***************/
             void waitkey()
             {
repeat:       if(key==1)goto repeat;
             else delay(500);
             }
/************LCD 模块初始化***************/
             void initial_lcd()
             {
             cs1=0;
             reset=0; /*低电平复位*/
             delay(100);
             reset=1; /*复位完毕*/
             delay(20);
             transfer_command(0xe2); /*软复位*/
             delay(5);
             transfer_command(0x2c); /*升压步聚1*/
             delay(5);
             transfer_command(0x2e); /*升压步聚2*/
             delay(5);
             transfer_command(0x2f); /*升压步聚3*/
             delay(5);
             transfer_command(0x23); /*粗调对比度,可设置范围0x20~0x27*/
             transfer_command(0x81); /*微调对比度*/
             transfer_command(0x28); /*0x1a,微调对比度的值,可设置范围0x00~0x3f*/
             transfer_command(0xa2); /*1/9 偏压比(bias)*/
             transfer_command(0xc8); /*行扫描顺序:从上到下*/
             transfer_command(0xa0); /*列扫描顺序:从左到右*/
             transfer_command(0x40); /*起始行:第一行开始*/
             transfer_command(0xaf); /*开显示*/
             cs1=1;
             }
             void lcd_address(uchar page,uchar column)
             {
             cs1=0;
             column=column-1; //我们平常所说的第1 列,在LCD 驱动IC 里是第0 列。所以在这里减去
             page=page-1;
             transfer_command(0xb0+page); /*设置页地址。每页是8 行。一个画面的64 行被分成8 个页。我们平常所说的
第1 页,在LCD 驱动IC 里是第0 页,所以在这里减去1*/
             transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高4 位
             transfer_command(column&0x0f); //设置列地址的低4 位
             }
/***************全屏清屏*******************/
             void clear_screen()
             {
             unsigned char i,j;
             cs1=0;
              for(i=0;i<9;i++)
              {
              lcd_address(1+i,1);
               for(j=0;j<132;j++)
               {
               transfer_data(0x00);
               }
              }
             cs1=1;         //
             }
/*显示16x16 点阵图像、汉字、生僻字或16x16 点阵的其他图标*/
             void display_graphic_16x16(uchar page,uchar column,uchar *dp)
             {
             uchar i,j;
             cs1=0;
              for(j=0;j<2;j++)
              {
              lcd_address(page+j,column);
               for (i=0;i<16;i++)
               {
               transfer_data(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
               dp++;
               }
              }
             cs1=1;
             }
/*显示8x16 点阵图像、ASCII, 或8x16 点阵的自造字符、其他图标*/
             void display_graphic_8x16(uchar page,uchar column,uchar *dp)
             {
             uchar i,j;
             cs1=0;
              for(j=0;j<2;j++)
              {
              lcd_address(page+j,column);
               for (i=0;i<8;i++)
               {
               transfer_data(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
               dp++;
               }
              }
             cs1=1;
             }
/**************************************/
             void main(void)
             {
             keyen=0;
              while(1)
              {
              initial_lcd();
              clear_screen(); //clear all dots    清除所有显示点
              display_graphic_16x16(5,1,zhuang1); /*在第5 页,第1 列显示单个汉字"状"*/
              display_graphic_16x16(5,(1+16),tai1); /*在第5 页,第17 列显示单个汉字"态"*/
              display_graphic_8x16(5,(1+16*2),mao_hao); /*在第5 页,第25 列显示单个字符":"*/
              display_graphic_16x16(5,(1+16*2+8),shi1); /*在第5 页,第41 列显示单个汉字"使"*/
              display_graphic_16x16(5,(1+16*3+8),yong1); /*在第5 页,第49 列显示单个汉字"用"*/
              display_graphic_8x16(5,(89),num0); /*在第5 页,第89 列显示单个数字"0"*/
              display_graphic_8x16(5,(89+8*1),num0); /*在第5 页,第97 列显示单个数字"0"*/
              display_graphic_8x16(5,(89+8*2),mao_hao); /*在第5 页,第105 列显示单个字符":"*/
              display_graphic_8x16(5,(89+8*3),num0); /*在第5 页,第113 列显示单个数字"0"*/
              display_graphic_8x16(5,(89+8*4),num0); /*在第5 页,第121 列显示单个数字"0"*/
              waitkey();
  delay(200);
  displayGB2312(0XB2,0XC5); // 获取点阵代码。
              clear_screen(); //clear all dots    清除所有显示点
              display_graphic_16x16(5,1,fontbuff); /*在第5 页,第1 列*/
  waitkey();
  delay(200);
              }
             }

能看懂不?

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

78.0005