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++; } } } |
你这个k和m是用的带字库12864字符表里面的特殊字符吧,占用两个字节。直接输出字符串,汉字占用两个字节,字母和数字只占用一个字节。 |
代码: #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; //清空计数次数 } } |