您现在的位置:智能制造网>技术中心>LCD1620和LCD12864I/O控制显示

直播推荐

更多>

企业动态

更多>

推荐展会

更多>

LCD1620和LCD12864I/O控制显示

2010年04月21日 17:08:46人气:2336来源:西安誉通光电测控有限责任公司

 

//LCD1620——I/O模拟控制方式
#Include <reg52.h>
#Include <intrins.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;

sbit rs = P2^0; //寄存器选择信号,高表示数据、低表示指令
sbit rw = P2^1; //读写控制信号,高表示读、低表示写
sbit ep = P2^2;//片选使能信号。下降沿触发

BYTE code dis1[] = {"abcdef"};//每行zui多显示16个字符
BYTE code dis2[] = {"ABCDEF"};

delay(BYTE ms)// 延时子程序
{      
 BYTE i;
 while(ms--)
 {
  for(i = 0; i< 250; i++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}

BOOL lcd_bz()// 测试LCD忙碌状态 011
{       
 BOOL result;
 rs = 0;//指令
 rw = 1;//读
 ep = 1;//使能
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result = (BOOL)(P0 & 0x80);//读忙标志和地址计数器ACC的值
 //P0口如果等于0X80,则说明不忙碌,(数据总线的高位为1)
 ep = 0;//使能下降沿触发
 return result; 
}

lcd_wcmd(BYTE cmd)// 写入指令数据到LCD 000
{      
 while(lcd_bz());
 rs = 0;
 rw = 0;
 ep = 0;//下降沿
 _nop_();
 _nop_(); 
 P0 = cmd;//写指令数据,已经定义“ BYTE cmd”
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1; //高
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0; //低 
}

lcd_pos(BYTE pos)//设定显示位置
{       
 lcd_wcmd(pos | 0x80);
}

lcd_wdat(BYTE dat)//写入字符显示数据到LCD 100 
{      
 while(lcd_bz());
 rs = 1;
 rw = 0;
 ep = 0;
 P0 = dat;//写数据数据,已经定义“BYTE dat”
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1; //高
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0; //低
}

lcd_init() //LCD初始化设定
{       
 lcd_wcmd(0x38);   //打开显示开关、允许移动位置、允许功能设置
 delay(1);
 lcd_wcmd(0x0c);   //打开显示开关、设置输入方式
 delay(1);
 lcd_wcmd(0x06);   //设置输入方式、光标返回
 delay(1);
 lcd_wcmd(0x01);   //清除LCD的显示内容
 delay(1);
}

main()
{
 BYTE i;
 lcd_init();    // 初始化LCD   
 delay(10);
 lcd_pos(0);    // 设置显示位置为*行的第5个字符
 i = 0;
 while(dis1[i] != '0')
 {      // 显示字符"abcdef"
  lcd_wdat(dis1[i]);
  i++;
 }
 //lcd_pos(0x41);   // 设置显示位置为第二行第二个字符
 lcd_pos(64);   // 设置显示位置为第二行第1个字符
 i = 0;
 while(dis2[i] != '0')
 {
  lcd_wdat(dis2[i]); // 显示字符"ABCDEF "
  i++;
 }
 while(1);    //
}

//LCD12864—I/O模拟控制显示方式
/********************************************/
/* 12864系列测试程序  */
//128*64--16行*8页*64列
/********************************************/

#Include <reg51.h>
#Include <ctype.h>
#Include <string.h>
#Include <stdlib.h>
#Include <stdio.h>
#Include <math.h>

#define Disp_On  0x3f//显示开0011 111X 显示开/关指令
#define Disp_Off 0x3e//显示关0011 111X  显示开/关指令
#define Col_Add  0x40//设置列地址01XX XXXX(0-63列)
#define Page_Add 0xb8 //设置页地址指令1011 1XXX(0-7页)、页(PAGE)设置指令
#define Start_Line 0xc0//起始行11XX XXXX(0-63行)显示起始行(ROW)设置指令

#define Lcd_Bus P0  //总线接口 MCU P1<------> LCM
sbit Mcs=P2^6;  //主芯片选中(使能 Master chip enable)
sbit Scs=P2^5;  //从芯片选中(使能 Slave chip enable)
sbit Enable=P2^7; //LCD信号使能 6800 mode Enable single  
sbit Di=P2^4;  //数据、命令选择端 Data or Instrument Select
sbit RW=P2^3;  //读写控制端 Write or Read
sbit Lcd_Rst=P1^0; //Lcm reset
/*
#Include<absacc.h>
#define LCD_CMD_WRA      XBYTE[0x8008] //;写指令代码,RS=0、R/W=0
#define LCD_DATA_WRA  XBYTE[0x8009] //;写数据,RS=1、R/W=0
#define LCD_BUSY_RDA  XBYTE[0x800A] //;读忙标志和AC值,RS=0、R/W=1
#define LCD_DATA_RDA  XBYTE[0x800B] //;读数据,RS=1、R/W=1
#define LCD_CMD_WRB      XBYTE[0x8004] //;写指令代码,RS=0、R/W=0
#define LCD_DATA_WRB  XBYTE[0x8005] //;写数据,RS=1、R/W=0
#define LCD_BUSY_RDB  XBYTE[0x8006] //;读忙标志和AC值,RS=0、R/W=1
#define LCD_DATA_RDB  XBYTE[0x8007] //;读数据,RS=1、R/W=1
*/
char code ce[]={
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00
};
char code shi[]={
/*-- 文字: 试 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00
};
char code kai[]={
/*-- 文字: 开 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00
};
char code shi3[]={
/*-- 文字: 始 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x90,0x70,0x1F,0x12,0xF0,0x00,0x20,0x70,0x28,0x27,0x22,0x28,0x70,0x20,0x00,
0x40,0x21,0x12,0x0C,0x06,0x09,0x30,0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00
};
char code wan[]={
/*-- 文字: 完 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x90,0x8C,0xA4,0xA4,0xA4,0xA5,0xA6,0xA4,0xA4,0xA4,0xA4,0x94,0x8C,0x04,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x70,0x00,0x00
};
char code bi[]={
/*-- 文字: 毕 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFF,0x88,0x48,0x28,0x08,0x80,0x7F,0x88,0x88,0x88,0x84,0x84,0xE0,0x00,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00
};
//-----------------延时子程序-----------------------------
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
//----------------写命令到LCD------------------------------
void write_com(unsigned char cmdcode)//RS=0、RW=0、E=“1—》0”
{
Di=0;
RW=0;
Lcd_Bus=cmdcode;
delay(0);
Enable=1;
delay(0);
Enable=0;
}
//------------------写数据到LCD----------------------------
void write_data(unsigned char Dispdata)//RS=1、RW=0、E=“1—》0”
{
Di=1;
RW=0;
Lcd_Bus=Dispdata;
delay(0);
Enable=1;
delay(0);
Enable=0;
}
//------------------读LCD数据----------------------------
unsigned char read_data()//RS=1、RW=1、E=1
{
unsigned char tmpin;
Di=1;
RW=1;
delay(0);
Enable=1;
delay(0);
Enable=0;
tmpin=Lcd_Bus;
return tmpin;
}
//-----------------清除内存---------------
void Clr_Scr()
{
unsigned char j,k;
Mcs=1;Scs=1;

 write_com(Page_Add+0);
 write_com(Col_Add+0);

 for(k=0;k<8;k++)//8页
 {
  write_com(Page_Add+k);//0-8
  for(j=0;j<64;j++)//64列
      write_data(0x00);
 }
}
//--------------------位置显示汉字16*16-----------------------
void hz_disp16(unsigned char pag,unsigned char col, unsigned char code *hzk)
{
unsigned char j=0,i=0;
for(j=0;j<2;j++)
{
write_com(Page_Add+pag+j);
write_com(Col_Add+col);
for(i=0;i<16;i++) write_data(hzk[16*j+i]);
}
}
//-----------------初始化LCD屏--------------------------
void init_lcd()
{
Lcd_Rst=0;delay(100);
Lcd_Rst=1;delay(100);
Mcs=1;Scs=1;delay(100);
write_com(Disp_Off);
write_com(Page_Add+0);
write_com(Start_Line+0);
write_com(Col_Add+0);
write_com(Disp_On);
}
//---------------------------信息显示---------------------
void Msg(int flg)
{
Clr_Scr();
if(flg==0)//显示“测试开始”
{
Mcs=1;Scs=0;
hz_disp16(3,32,ce);delay(2000);
hz_disp16(3,48,shi);delay(2000);
Mcs=0;Scs=1;
hz_disp16(3,0,kai);delay(2000);
hz_disp16(3,16,shi3);delay(2000);
}
else if(flg==1)//显示“测试完毕”
{
Mcs=1;Scs=0;
hz_disp16(3,32,ce);
hz_disp16(3,48,shi);
Mcs=0;Scs=1;
hz_disp16(3,0,wan);
hz_disp16(3,16,bi);
}
}
//-------------------主程序--------------------------------
main()
{
unsigned char i=0;
init_lcd();
while(1)
 {
Msg(0);delay(10000);
Msg(1);delay(10000);
 }
}

关键词:计数器
全年征稿/资讯合作 联系邮箱:1271141964@qq.com

免责声明

  • 凡本网注明"来源:智能制造网"的所有作品,版权均属于智能制造网,转载请必须注明智能制造网,https://www.testerchina.com。违反者本网将追究相关法律责任。
  • 企业发布的公司新闻、技术文章、资料下载等内容,如涉及侵权、违规遭投诉的,一律由发布企业自行承担责任,本网有权删除内容并追溯责任。
  • 本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
  • 如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

<
更多 >

工控网机器人仪器仪表物联网3D打印工业软件金属加工机械包装机械印刷机械农业机械食品加工设备制药设备仓储物流环保设备造纸机械工程机械纺织机械化工设备电子加工设备水泥设备海洋水利装备矿冶设备新能源设备服装机械印染机械制鞋机械玻璃机械陶瓷设备橡塑设备船舶设备电子元器件电气设备


我要投稿
  • 投稿请发送邮件至:(邮件标题请备注“投稿”)1271141964.qq.com
  • 联系电话0571-89719789
工业4.0时代智能制造领域“互联网+”服务平台
智能制造网APP

功能丰富 实时交流

智能制造网小程序

订阅获取更多服务

微信公众号

关注我们

抖音

智能制造网

抖音号:gkzhan

打开抖音 搜索页扫一扫

视频号

智能制造网

公众号:智能制造网

打开微信扫码关注视频号

快手

智能制造网

快手ID:gkzhan2006

打开快手 扫一扫关注
意见反馈
关闭
企业未开通此功能
详询客服 : 0571-87858618