打印
[菜农助学交流]

【第四批】入门笔记第二帖—LCD显示

[复制链接]
2380|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxcscm|  楼主 | 2012-1-31 22:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
新年新气象,决定全力学习菜农的助学板,那么首先得给助学板做个人机界面。串口显示不可行,俺的电脑没串口(都怪俺当初配电脑是不懂啥是单片机),用USB转的虚拟串口,连接STC的单片机没问题,可是死活连不上菜农的助学板,无奈,只好另想其他方法。尝试用已有的四位数码管,可接口与助学板不好直接配对,需用杜邦线,显得太乱。翻箱倒柜,找出一块LCD液晶屏,是诺基亚511048*84的,大小正合适,于是想办法点亮它。

该屏总共8个引脚,自左至有分别是:VCCGNDSCERESDCSDINSCLKBackLED
首先是电源问题:助学板引出的电源VBUS5V的,而LCDVCC=3.3V,园地里有位网友用M0的引脚作为LCD的地,受之启发,用M0GPC6GPC7分别作为LCD屏的电源和地。

接下来开始改造程序,在原单片机的程序上更改端口和驱动方式后直接移植,尝试若干次后,LCD屏顺利点亮!
 
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "DrvTIMER.h"
#include "LCD4884.h"
//---------------------------------------
//函数名称: LCD_init
//函数功能:5110LCD初始化函数
//输    入:无
//输    出:无
//作    者:zxcscm
//日期版本:20120131-01  
//-----------------------------------------
void LCD_init(void)
{
unsigned char k;
CLR_RES;               //LCD复位
for(k=0;k<250;k++);
SET_RES;         
    LCD_write_byte(0x21,0);//LCD功能设置:芯片活动,水平寻址,使用扩展指令
LCD_write_byte(0xd0,0);//设置VOP值,室温下的编程范围为3.00-10.68
//Vlcd=3.06+(VOP)*0.06,本例VOP为0B0101 0000为十进制的80,Vlcd=7.86V
LCD_write_byte(0x20,0);//LCD功能设置:芯片活动,水平寻址,使用基本指令
LCD_write_byte(0x0C,0);//设定显示配置:普通模式
}
//---------------------------------------
//函数名称: LCD_clear
//函数功能:LCD清屏函数
//输    入:无
//输    出:无
//作    者:zxcscm
//日期版本:20120131-01  
//-----------------------------------------
void LCD_clear(void)
{
unsigned char t;
unsigned char k;   
for(t=0;t<6;t++)
{
  for(k=0;k<84;k++)
  {
   LCD_write_byte(0,1);   
  }
}
}
//---------------------------------------
//函数名称: LCD_write_byte
//函数功能:使用SPI接口写数据到LCD
//输    入:dat:写入的数据 command: 1-数据/0-命令
//输    出:无
//作    者:zxcscm
//日期版本:20120131-01  
//-----------------------------------------
void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned char i;
CLR_SCE;              //使能LCD
    if(command==1)
        DATE_DC;           //DC=1写数据
    else
        COMMEND_DC;           //DC=0写指令
for(i=0;i<8;i++)
{
  if(dat&(0x80>>i))
   SET_SDIN;     //写1
  else
   CLR_SDIN;       //写0
  CLR_SCLK;
        SET_SCLK;        //时钟上升沿写入数据到LCD

}
DATE_DC;
SET_SCE;
SET_SDIN;
}
//---------------------------------------
//函数名称: LCD_write_char
//函数功能:显示英文字符
//输    入:c:显示的字符在font6x8表格中的位置
//输    出:无
//作    者:zxcscm
//日期版本:20120131-01  
//-----------------------------------------   
void LCD_write_char(unsigned char c)
{
unsigned char line;
c-= 32;
for (line=0; line<6; line++)
LCD_write_byte(font6x8[c][line], 1);
}
//---------------------------------------
//函数名称: LCD_set_XY
//函数功能:设置坐标函数
//输    入:X:0-83 Y:0-5
//输    出:无
//作    者:zxcscm
//日期版本:20120131-01  
//-----------------------------------------   
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x40 | Y, 0);
LCD_write_byte(0x80 | X, 0);
}
//---------------------------------------
//函数名称: LCD_write_String
//函数功能:显示英文字符串
//输    入:XY:设置坐标(X:0-83 Y:0-5) *s:英文字符串指针(带双引号的英文字符串)
//输    出:无
//作    者:zxcscm
//日期版本:20120131-01  
//-----------------------------------------
void LCD_write_String(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while (*s)
{
  LCD_write_char(*s);
  s++;
}
}
//---------------------------------------
//函数名称: LCD_Disp16_16
//函数功能:写一个16*16的汉字到LCD
//输    入:x,y:写入汉字的地址 index: 写入汉字在han表格中的位置
//输    出:无
//作    者:zxcscm
//日期版本:20120131-01
//---------------------------------------  
void LCD_Disp16_16(unsigned char x,unsigned char y,unsigned char index)
{
unsigned char c;
LCD_set_XY(x*8, y);
for(c=0;c<16;c++)
{   
  LCD_write_byte(han[index*32+c],1);
}
    LCD_set_XY(x*8, y+1);
for(c=16;c<32;c++)
{   
  LCD_write_byte(han[index*32+c],1);
}
}
void GPIOInit()
{
    DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );//设置GPA.2~GPA.9为输出模式
    DrvGPIO_Open( E_GPA, 3, E_IO_OUTPUT );
    DrvGPIO_Open( E_GPA, 4, E_IO_OUTPUT );
    DrvGPIO_Open( E_GPA, 5, E_IO_OUTPUT );
    DrvGPIO_Open( E_GPA, 6, E_IO_OUTPUT );
    DrvGPIO_Open( E_GPA, 7, E_IO_OUTPUT );
    DrvGPIO_Open( E_GPA, 8, E_IO_INPUT );
    DrvGPIO_Open( E_GPA, 9, E_IO_INPUT );
    DrvGPIO_Open( E_GPC,14, E_IO_OUTPUT );//设置GPC为输出模式
    DrvGPIO_Open( E_GPC,15, E_IO_OUTPUT );
    DrvGPIO_Open( E_GPC, 6, E_IO_OUTPUT );
    DrvGPIO_Open( E_GPC, 7, E_IO_OUTPUT );
}

int main()
{
GPIOInit();
    DrvGPIO_SetBit(E_GPC, 6);//作为LCD的电源
    DrvGPIO_ClrBit(E_GPC, 7);//作为LCD的地
LCD_init();   //初始化LCD模块
LCD_clear();   //清屏幕
      
LCD_Disp16_16(0,0,0); //菜
LCD_Disp16_16(2,0,1); //农
LCD_Disp16_16(4,0,2); //助
LCD_Disp16_16(6,0,3); //学
LCD_Disp16_16(8,0,4); //板
   
LCD_Disp16_16(1,2,5); //祝
LCD_Disp16_16(3,2,6); //愿
LCD_Disp16_16(5,2,7); //园
    LCD_Disp16_16(7,2,8); //地
   
    LCD_Disp16_16(0,4,9); //越
    LCD_Disp16_16(2,4,10); //来
    LCD_Disp16_16(4,4,11); //越
    LCD_Disp16_16(6,4,12); //红
    LCD_Disp16_16(8,4,13); //火

SET_BackLed;   //开背光
while(1)
{
     ;
}
}



附艳照






完整工程
03-LCD4884.rar (1.57 MB)


相关帖子

沙发
hotpower| | 2012-1-31 22:37 | 只看该作者
很好!

使用特权

评论回复
板凳
adampan| | 2012-1-31 23:30 | 只看该作者
我也正想弄个小液晶显示,,先学习了

使用特权

评论回复
地板
adampan| | 2012-2-1 09:48 | 只看该作者
楼上这位,,,算是广告么。。。汗。。。。

使用特权

评论回复
5
lixiaoxu2meng| | 2012-2-1 09:53 | 只看该作者

使用特权

评论回复
6
zxcscm|  楼主 | 2012-2-1 10:31 | 只看该作者
汗,广告跑这儿了

使用特权

评论回复
7
outstanding| | 2013-8-13 10:31 | 只看该作者

使用特权

评论回复
8
ceflsh| | 2013-8-15 20:09 | 只看该作者
开眼界,谢谢楼主。

使用特权

评论回复
9
newsoule| | 2013-8-17 15:03 | 只看该作者
谢谢分享,很有帮助

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

628

帖子

1

粉丝