标题:
带字库的12864显示字母中间为什么会空一个再显示?怎么解决呢?
[打印本页]
作者:
孤雪
时间:
2020-3-18 20:36
标题:
带字库的12864显示字母中间为什么会空一个再显示?怎么解决呢?
如图,K和M之间会空格,这样就不够显示了啊,导致后面都不能正常显示了,请问这怎么解决呢?
IMG_20200318_191224.jpg
(1.61 MB, 下载次数: 40)
下载附件
2020-3-18 19:40 上传
作者:
孤雪
时间:
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; //清空计数次数
}
}
作者:
xxpp2011
时间:
2020-3-18 23:41
你这个k和m是用的带字库12864字符表里面的特殊字符吧,占用两个字节。直接输出字符串,汉字占用两个字节,字母和数字只占用一个字节。
作者:
xxpp2011
时间:
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++;
}
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1