原创 【博客大赛】分享一款字符型液晶的使用

2012-11-24 20:40 1201 20 24 分类: MCU/ 嵌入式

笑脸,这里没有介绍12864字符型液晶的使用,我就卖弄一下吧。

我用的是一款字符型的,引脚排序如下,我用单片机的PC口作为总线,显示字符还是可以的,完全可以显出唐诗宋词什么的。。。淘宝上卖屏的一般也会提供例程,但基本都是有些小错误的,毕竟人家只是卖屏的。

qq截图20121124201731.jpg

看看我的例程吧,屏的引脚排序相同的话应该可以套用。
对屏的初始化就不介绍了,这个每个人引脚配置不一样,所以会有细微区别。
/*
*********************************************************************************************************
** 函数名称 :Int_char()
** 函数功能 :字符转换程序
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2009年11月27日13:58:33
*********************************************************************************************************
*/
void Int_char(int data)
{
  if(data/1000)
  {
    Result[0]=data/1000+'0';
    Result[1]=data/100%10+'0';
    Result[2]=data/10%10+'0';
    Result[3]=data%10+'0';
    Result[4]=0;
  }
   else if(data/100)
  {
    Result[0]=data/100+'0';
    Result[1]=data/10%10+'0';
    Result[2]=data%10+'0';
    Result[3]=0;
    Result[4]=0;
  }
   else if(data/10)
  {
    Result[0]=data/10%10+'0';
    Result[1]=data%10+'0';
    Result[2]=0;
    Result[3]=0;
    Result[4]=0;
  }
  else
  {
    Result[0]=data%10+'0';
    Result[1]=0;
    Result[2]=0;
    Result[3]=0;
    Result[4]=0;
  }
}
/*
*********************************************************************************************************
** 函数名称 :chek_busy()
** 函数功能 :测试12864是否忙
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2012年3月22日13:58:33
*********************************************************************************************************
*/
void chek_busy(void)
{
  unsigned char temp1=0x01;  //状态信息(判断是否忙)
   while(temp1)
  {
   PA4=0;                    //245的E脚使能
   PA5=0;                    //245的DIR脚使能,从12864读取
   RS=0;                      // RS = 0;
   RW=1;                      // RW = 1;
   E=0;                       // E = 0;
   delay_nus(1);
   E=1;
   DDRC=0x00;
   PORTC=0xff;
   delay_nus(1);
   temp1=PINC;
   temp1=temp1&0x80;
   delay_nus(100);
   E=0;
   RS=0;                      // RS = 0;
   RW=1;                      // RW = 1;
   PA4=1;                    //245的高阻
  }
}
/*
*********************************************************************************************************
** 函数名称 :chek_busy()
** 函数功能 :测试是否有按键
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2012年3月22日13:58:33
*********************************************************************************************************
*/
void chek_anj(void)
{
   unsigned char temp;
   PA4=1;                    //245的E脚不使能
   PINC=0x00;
   PB4=0;
   DDRC=0x00;
   PORTC=0xff;
   delay_nus(10);
   temp=PINC;
   if(temp==0x7f)
   {
   if(comon>0x00)
    comon--;
   comon1=0x01;
   }
   else if(temp==0xbf)
   {
   if(comon<0x10)
    comon++;
   comon1=0x01;
   }
   else
   {
    comon1=0x00;
   }
   PB4=1;
}
/*
*********************************************************************************************************
** 函数名称 :write_code()
** 函数功能 :写命令子程序
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2012年3月22日13:58:33
*********************************************************************************************************
*/
void write_code(unsigned char cmd)
{
  chek_busy();
  PA4=0;                    //245的E脚使能
  PA5=1;                    //245的DIR脚使能,写12864
  DDRC=0xff;
  delay_nus(1); 
  RS=0;                     // RS = 0;
  RW=0;                     // RW = 0;
  E=0;
  PORTC=cmd;                //写入命令
  delay_nus(1);
  E=1;
  delay_nus(50);
  E=0;
  RS=0;                      // RS = 0;
  RW=0;                      // RW = 1;
  PA4=1;                    //245的高阻
}
/*
*********************************************************************************************************
** 函数名称 :write_data()
** 函数功能 :写命令子程序
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2012年3月22日13:58:33
*********************************************************************************************************
*/
void write_data(unsigned char dat)
{
  chek_busy();
  PA4=0;                    //245的E脚使能
  PA5=1;                    //245的DIR脚使能,写12864
  RS=1;                     // RS = 1;
  RW=0;                     // RW = 0;
  E=0;
  DDRC=0xff;
  delay_nus(1);
  PORTC=dat;                //写入命令  
  E=1;
  delay_nus(50);
  E=0;
  RS=0;                     // RS = 0;
  RW=0;                     // RW = 0;
  PA4=1;                    //245的高阻
}

/*
*********************************************************************************************************
** 函数名称 :Init12864()
** 函数功能 :初始化12864
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2009年11月28日13:24:56
*********************************************************************************************************
*/
void Init12864(void)
{
 write_code(0x01);      //0000,0001 清DDRAM
 delay_nms(2);
 write_code(0x30);      //功能设置,一次送8位数据,基本指令集
 delay_nms(2);
 write_code(0x0c);      //0000,1100 整体显示,游标off,游标位置off
 delay_nms(2);
 write_code(0x01);      //0000,0001 清DDRAM
 delay_nms(2);
 write_code(0x02);      //0000,0010 DDRAM地址归位
 delay_nms(2);
write_code(0x80);      //1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
 delay_nms(2);
}
/*
*********************************************************************************************************
** 函数名称 :set_xy()
** 函数功能 :设置显示位置
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2009年11月28日13:24:56
*********************************************************************************************************
*/
void set_xy(unsigned char xpos,unsigned char ypos)
{
 unsigned char byAddress ;
 switch(ypos)
 {
   case 1:
    byAddress=(0X80|xpos);break;
   case 2:
    byAddress=(0X90|xpos);break;
   case 3:
    byAddress=(0X88|xpos);break;
   case 4:
    byAddress=(0X98|xpos);break;
   default:break;
 }
 write_code(byAddress);
}
/*
*********************************************************************************************************
** 函数名称 :print()
** 函数功能 :在指定位置显示内容
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2009年11月28日13:24:56
*********************************************************************************************************
*/
void print(unsigned char x,unsigned char y,char* str)
{
 unsigned char lcd_temp;
 set_xy(x,y);
 lcd_temp=*str;
 while(lcd_temp != 0x00)
  {
   write_data(lcd_temp);
   lcd_temp=*(++str);
  }
}

/*
*********************************************************************************************************
** 函数名称 :printstr()
** 函数功能 :写字符串子程序
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2009年11月28日13:24:56
*********************************************************************************************************
*/
void printstr( unsigned char x, unsigned char y, unsigned char *pData )
{
set_xy( x, y ) ;
while( *pData != '\0' )
{
write_data( *pData++ ) ;
}
}
/*
*********************************************************************************************************
** 函数名称 :printstr_d()
** 函数功能 :写数字子程序
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2009年11月28日13:24:56
*********************************************************************************************************
*/
void printstr_d( unsigned char x, unsigned char y, unsigned char digit )
{
set_xy( x, y ) ;
}

//主程序显示“书山有路勤为径,学海无涯苦作舟”

/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :主函数
** 入口参数 :无
** 出口参数 :无
** 创建人   :tom
** 创建时间 :2009年11月27日13:58:33
*********************************************************************************************************
*/
void main(void)
{
 PortInit();          //端口初始化
 delay_nms(50);
 PSB=1;
 TargetInit();        //目标函数初始化
 Init12864();     //设定液晶工作方式
 delay_nms(2);
  printstr(1,1,"课堂演示系统");
 printstr(0,2,"设计者:tom");
 printstr(0,3,"书山有路勤为径");//xpos应为偶数
 printstr(0,4,"学海无涯苦作舟");//xpos应为偶数
 delay_nms(500);
 delay_nms(500);
 while(1)
 {
  chek_anj();
  delay_nms(20);

   printstr(1,1,"课堂演示系统");
   printstr(0,2,"设计者:tom");
   printstr(0,3,"书山有路勤为径");//xpos应为偶数
   printstr(0,4,"学海无涯苦作舟");//xpos应为偶

delay_nms(20);
 }
}

 
PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

用户593939 2012-12-28 23:17

分析的很细,学习了,参考了

用户425322 2012-11-30 15:00

能看到图片啊,液晶屏还可以用245驱动吗?

用户403664 2012-11-28 16:06

能看到一个图片啊

用户1632198 2012-11-28 09:43

是我有电脑有问题还是? 图挂了
相关推荐阅读
用户372966 2014-08-20 12:14
如何把E币赠送给好友?
我的E币不够多,如何把E币送给我的好友?...
用户372966 2012-11-24 20:51
【博客大赛】CRC校验资料整理
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 循环冗余校验码(CRC)的基本...
用户372966 2012-11-24 20:16
【博客大赛】串口通讯
串口通讯曾经风靡一时,RS232的传输方式,在很多场合至今仍在沿用。仅仅使用三根线,最长传输距离在30m左右,可以满足大多数的运用。实际中传输距离和导线的好坏和波特率有关。 以前的电脑都...
用户372966 2012-11-24 20:11
【博客大赛】浅谈EEPROM
EEPROM是可用户更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。在一个EEPROM中,当计算机在使用的...
用户372966 2012-11-19 18:42
【博客大赛】嵌入式随想
N年前,我们还在为收录机.电视所痴迷时;在那个年代,网站还鲜有耳闻,《无线电技术》也是当时最火的电子杂志。我最大的爱好就是照着杂志中的图纸,到电子商城买来各种各样的电子零件,搞块面包...
EE直播间
更多
我要评论
4
20
关闭 站长推荐上一条 /3 下一条