找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1830|回复: 3
收起左侧

带字库的12864显示字母中间为什么会空一个再显示?怎么解决呢?

[复制链接]
ID:429204 发表于 2020-3-18 20:36 | 显示全部楼层 |阅读模式
如图,K和M之间会空格,这样就不够显示了啊,导致后面都不能正常显示了,请问这怎么解决呢?
IMG_20200318_191224.jpg


回复

使用道具 举报

ID:429204 发表于 2020-3-18 22:48 | 显示全部楼层
代码:
#include <reg52.h>         
#include <intrins.h>typedef unsigned char u8;
typedef unsigned int u16;
sbit LCD_RS = P3^6;         //定义LCD12864使用的IO口
sbit LCD_RW = P3^7;
sbit LCD_EN = P3^4;
sbit hall = P1^5;u16 v;                                         //速度
u16 km;                                         //里程
u16 re;                                         //热量
u16 k;                                 //霍尔电平
u8 cnt1;
u8 cnt2;
u8 time[3];
u8 s = 207;                          //车轮周长
void delayms(u16 ms)                //LCD12864延时函数
{
        u16 i;
        for(i = 0; i < ms; i++){; }
}

void Init_LCD(void)                           //初始化LCD控制端口函数
{
    LCD_RS=1;                                  //输出数据LCD_RS和LCD_EN清零
    LCD_RW=0;
    LCD_EN=0;
}

void LCD_write_cmd(u8 cmd)          //LCD12864写指令函数
{
        LCD_EN=0;
        LCD_RS=0;         //写指令
        LCD_RW=0;         //写入
        P2=cmd;//赋值给D0-D7对应的IO引脚
        delayms(50);
        LCD_EN=1;          //允许
        delayms(50);  
        LCD_EN=0;
}

void LCD_write_data(u8 dat)                        //LCD12864写数据函数
{
        LCD_EN=0;
        LCD_RS=1;          //写数据
        LCD_RW=0;          //写入
        P2=dat;//赋值给D0-D7对应的IO引脚
        delayms(50);
        LCD_EN=1;           //允许
        delayms(50);
        LCD_EN=0;
}

void LCD_init(void)                                //初始化LCD12864显示设置函数
{
        delayms(10000);
        LCD_write_cmd(0x30);
        delayms(20);
        LCD_write_cmd(0x30);//功能设置
        delayms(20);
        LCD_write_cmd(0x0c);//显示开关控制
        delayms(20);
        LCD_write_cmd(0x01);//显示清除
        delayms(1200);
        LCD_write_cmd(0x06);//显示清除
        delayms(50);
}

void LCD_Display()                                  //LCD显示函数
{
     Init_LCD();                              //初始化LCD控制端口
     LCD_init();                          //初始化LCD显示设置
     LCD_write_cmd(0x80);        //第一行数据指针地址
//-------------第一行显示内容-------------//
     LCD_write_data(0xCB); //速   
     LCD_write_data(0xD9);
     LCD_write_data(0xB6); //度          
     LCD_write_data(0xC8);
     LCD_write_data(0xA1); //:
     LCD_write_data(0xC3);
     LCD_write_data(v/10%10+'0'); //速度十位
     LCD_write_data(v%10+'0'); //速度个位
     LCD_write_data(0xA3);      //.
     LCD_write_data(0xAE);
     LCD_write_data(v*10%10+'0'); //速度十分位
     LCD_write_data(0xA3); //k
     LCD_write_data(0xEB);                                                                                                                                                
         LCD_write_data(0xA3); //m
     LCD_write_data(0xED);
         LCD_write_data(0xA3); ///
     LCD_write_data(0xAF);
         LCD_write_data(0xA3); //h
     LCD_write_data(0xA8);
         delayms(10);   
}

void main()                        //主函数
{
        TMOD = 0x01;                                                //设置定时器1工作方式2,定时器工作方式3
        TH0 = (65536-922)/256;                                //高8位设初值1ms
        TL0 = (65536-922)%256;                                //低8位设初值1ms
        EA = 1;                                                            //开总中断
        ET0 = 1;                                                    //开T1定时器0中断
        TR0 = 1;                                                       //开定时器0
    while(1)               
    {   
                v = (s/cnt1*10)*3600;                    //计算速度,单位km/h
                LCD_Display();                //LCD12864进行显示
    }  
}
void EX0_INT(void) interrupt 1                    //计数中断
{
        TL0 = (65536-922)%256;                                //重装初值1ms
        TH0 = (65536-922)/256;
        cnt2++;
        if(hall == 0)
        {
                cnt1++;                                                        //记录1ms的次数
        }
        else
        {
                cnt1 = 0;                                                //清空计数次数
        }                          
}
回复

使用道具 举报

ID:452950 发表于 2020-3-18 23:41 | 显示全部楼层
你这个k和m是用的带字库12864字符表里面的特殊字符吧,占用两个字节。直接输出字符串,汉字占用两个字节,字母和数字只占用一个字节。
回复

使用道具 举报

ID:452950 发表于 2020-3-19 11:01 | 显示全部楼层
unsigned char code AC_TABLE[]={                                           //坐标编码
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};
/************************************************************************************
                      显示字符串
************************************************************************************/
void PutStr(unsigned char row,unsigned char col,unsigned char *puts)
{   
         LCD_write_cmd(0x30);
         LCD_write_cmd(AC_TABLE[8*row+col]);
        while(*puts != '\0')
        {
                if(col==8)
                {
                        col=0;
                        row++;
                }
                if(row==4) row=0;
                 LCD_write_cmd(AC_TABLE[8*row+col]);
                LCD_write_data(*puts);
                puts++;
                if(*puts != '\0')
                {
                        LCD_write_data(*puts);
                        puts++;
                        col++;
                }  
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表