0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

LCD

怎么用LCD1602显示特殊字符

显示特殊字符时候(天线形式)其他区域也回出现乱点,不知道怎么解决???

源程序如下(主函数):

#include

#include "derivative.h"

#include "LLD_LCD.h"

#include "LLD_KEY.h"

void PerphInit()

{

  SOPT1 = 0x00;       //关闭看门狗

  MCGC1 = 0xB8;

  MCGC1_IRCLKEN = 1;  //开启参考时钟,TRIM微调量没有设置                                   

  MCGC2 = 0x36;

  MCGC3 = 0x00;       //PLLS=0  

  while(!(MCGSC&0x02));

}

   void tianxian(void)//显示天线形

  {              

        LcdCommand(0x36);   

       LcdCommand(0x80);//垂直地址范围

     LcdCommand(0x80);//水平地址范围

     LcdDataWrite(0x80);  

                       

        LcdCommand(0x81);//垂直地址范围

     LcdCommand(0x80);//水平地址范围

     LcdDataWrite(0x2a);

                        

        LcdCommand(0x82);//垂直地址范围

        LcdCommand(0x80);//水平地址范围

        LcdDataWrite(0x1c);

                        

        LcdCommand(0x83);//垂直地址范围

        LcdCommand(0x80);//水平地址范围

        LcdDataWrite(0x08);   

                        

        LcdCommand(0x84);//垂直地址范围

        LcdCommand(0x80);//水平地址范围

        LcdDataWrite(0x08);  

                        

        LcdCommand(0x85);//垂直地址范围

        LcdCommand(0x80);//水平地址范围

        LcdDataWrite(0x08);  

                        

        LcdCommand(0x86);//垂直地址范围

        LcdCommand(0x80);//水平地址范围

        LcdDataWrite(0x08);  

                        

        LcdCommand(0x87);//垂直地址范围

        LcdCommand(0x80);//水平地址范围

        LcdDataWrite(0x08);

                        

        LcdCommand(0x88);//垂直地址范围

        LcdCommand(0x80);//水平地址范围

        LcdDataWrite(0x08);

                    

        LcdCommand(0x88);//垂直地址范围

        LcdCommand(0x70);//水平地址范围

        LcdDataWrite(0x07);*/

        }

//======主函数=====

void main(void)

{   

        PerphInit();   //外围初始化        

       LCD_Init();     //液晶...        

     EnableInterrupts;

       CLR_Screen();

      while(1)

      {    uchar key = 0x00;  //按键标志符赋初值

        do {

                        key = Get_Key();    //读取按键

            }while(!key);

              switch(key)

             {

               case UP:

                 CLR_Screen();

                 DisplayChar(0,0,"发送中...");

                 break;

               case DOWN:

                 CLR_Screen();

                 DisplayChar(0,0,"接收中...");

                    break;

               case BACK:        

                 tianxian();     //天线字形

             Delay(1000);

                  break;

                default:

                         break;

              } //end switch

       }//end while      

}

提问者:想再看钻石冰尘 地点:- 浏览次数:10082 提问时间:04-08 05:57
我有更好的答案
提 交
1条回答
andrewxuda 10-12 09:46 回答数:1 被采纳数:0

要让LCD1602显示自定义字符,就得用到CGRAM指令,CGROM字码表中最左边16字节是自定义CGRAM,实际只有8个字节可用.它的字符码是00H---07H这8个地址,从指令表看可以看到RS=0;RW=0;DB7与DB6分别为01,只有DB0--DB6 六位为地址为,DB6 DB5 DB4都为0代表这8个自定义字符,后3位是8个字模数据的地址;     
             CGRAM地址:  01000000 0x40   首地址,代表字模数据从第一行开放入
                           01000001 0x41 从第二行开始,上一行空出来                
                           01000010 0x42                 
                           01000011    0x43                   
                           01000100 0x44                 
                              01000101   0x45                
                           01000110 0x46               
                           01000111 0x47   


举例说明:我们向这8个字节写入字模数据,显示个"日"字;如果CGRAM地址设置为0x40:则"日"字的第一行就是从8行最上面开始写,即0x1f就是放到了最上面
如果开始设置CGRAM地址写入0x41:这样的话"日"字的第一行就放在了8行的第二行

//LCD1602显示自定义字符测试程序
//STC89C52RC 12MHz
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^5;//1602数据命令选择线
//sbit rw=P3^6;rw=0;rw直接接GND 一直写不读
sbit en=P3^4;//1602使能控制线/*P0口接1602的D0-D7********************/
uchar code table[]={
    0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,            //℃,代码 0x00
    0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,             //一,代码 0x01
    0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,            //二,代码 0x02
    0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,             //三,代码 0x03
    0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,               //四,代码 0x04
    0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,            //五,代码 0x05
    0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x06
    0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,        //日,代码 0x07
};
void delay(uint t) //延时函数 用延时函数代替忙检测
{
uint x,y;
for(x=t;x>0;x--)
  for(y=110;y>0;y--);
}/*********************************************/
void lcd_wcom(uchar com) //1602写命令函数
{
rs=0;
  //rw=0;
P0=com;
delay(5);
en=1;
en=0;
}
void lcd_wdat(uchar dat)//1602写数据函数
{
rs=1;
//rw=0;
P0=dat;
delay(5);
en=1;
en=0;
}void lcd_init()
{
lcd_wcom(0x38);//8位数据,5*8字形
lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01);//清屏
}
void main()
{
uchar i;
lcd_init();
lcd_wcom(0x40);//设置CGRAM地址,设置为00处,从8行中第一行开始  ①第一步设置CGRAM地址
for(i=0;i<64;i++)//写入数组中数据                                                     ②装入数组里要显示的数据
{
  lcd_wdat(table);
}  
lcd_wcom(0x80);    //设置字符显示位置 第一行第一个位置                ③设置显示地址,然后发送数据 lcd_wdat(0x00);     //给1602发送字符数据  显示℃
delay(5);
lcd_wcom(0x81);   
lcd_wdat(0x01);     // 显示"一"
delay(5);
lcd_wcom(0x82);    lcd_wdat(0x02);     //显示"二"
delay(5);
lcd_wcom(0x83);
lcd_wdat(0x03);    //显示"三"
delay(5);
lcd_wcom(0x84);
lcd_wdat(0x04);    //显示"四"
delay(5);
lcd_wcom(0x85);
lcd_wdat(0x05);   //显示"五"
delay(5);
lcd_wcom(0x86);
lcd_wdat(0x06);   //显示"六"
delay(5);  
lcd_wcom(0x87);
lcd_wdat(0x07);   //显示"日"
delay(5);
while(1);
}

撰写答案
提 交
1 / 3
1 / 3
相关LCD
力信LCD开关电源电路
LCD背光闪烁
请教LCD背光引脚
LCD12864程序无法显示
关于LCD信号传输接口的资料