标题:
51单片机中如何用12864单独显示两个独立数字
[打印本页]
作者:
280570255
时间:
2019-5-21 10:44
标题:
51单片机中如何用12864单独显示两个独立数字
最近想做一件东西,却想到一个一直没有直视的问题,12864只能显示32个汉字,但如何实现在某个位置上写上两个数字呢(不用数组),在网上也很少有这类资料,至少我没有看到,偶然间在调试1602程序时,发现位置可以自动加1,也就是你定了一个位置,写上数据后,可以连续写,如下程序,就实现在在cd_pos(2,0);
//第二行第一列地址上显示45度的字样,你学会了吗?
单片机源程序如下:
#include<reg52.h> //每个程序都 要包含头文件,
typedef unsigned char uint8; //声明定义 ,,同 #define ,但#define要加#号才能使用 ,后不加分号
typedef unsigned int uint16;
sbit rs=P2^6;//数据或命令接口
sbit rw=P2^5; //读写接口
sbit e=P2^7; //使能接口
sbit PSB=P3^2;
uint8 code a[]="今天2019年05月11"; //1602只能显示每行40个字符,多余的无法显示
uint8 code b[]="现在天气真的很热";//为了标示显示位置,两行作为对比 7890
void delay(uint16 i) //1us
{ uint8 t;
while(i--)
{
for(t=0;t<12;t++) ;
}
}
//写指令程序
void write_cmd(uint8 cmd)
{
delay(2);
rs=0; //指令接口
rw=0; //写指令
e=0;
P0=cmd; //指令传给IO口
e=1; //使能端高电平有效,要再拉低结束程序转送,
delay(2);
e=0;
}
//写数据程序
void write_dat(uint8 dat)
{
delay(2);
rs=1; //数据
rw=0; //写
e=0;
P0=dat;
e=1;
delay(10);
e=0;
delay(2); //每写完一个数据, 延时,这样显示慢一点,也决定了移屏的速度
}
void init()
{
delay(1);
PSB=1;
write_cmd(0x30); // 0x30:8位数据总线,基本指令集 设置为位数据总线,单行或双行显示
delay(5); // 0x34:8位数据总线,扩充指令集 可实现翻屏操作
write_cmd(0x0c); //0X0f:光标显示及闪烁 0X0c:光标不显示及不闪烁
delay(5); //0X0e: 光标显示,不闪烁 0x0d:光标不显示闪烁
//同1602
write_cmd(0x01); //清屏显示
delay(5);
}
void lcd_pos(uint8 x,uint8 y) //位置函数,非常重要,显示第几行,几列
{
uint8 pos;
if(x==0)
{
x=0x80;
}
else if(x==1)
{
x=0x90;
}
else if(x==2)
{
x=0x88;
}
else if(x==3)
{
x=0x98;
}
pos=x+y; //第几的第几个位置,,所以要相加,相当于第1行的第Y列的,Y,的位置就要定为X+Y
write_cmd(pos);
}
void display()
{
uint8 i;
lcd_pos(0,0); //第一行第一列地址,若要空降某一地址,写上即可
for(i=0;i<16;i++) //设置 80个字符显示,第一行显示完,自动在第二行显示
{
write_dat(a[i]); //用了数组 ,就要以直接写显示 的字符,否者字符要加单引号''
}
//单独显示某一个字时必须写上对应的十六 进制编码;不要
//不能直接写上
lcd_pos(1,0); //第二行第一列地址
for(i=0;i<16;i++)
{
write_dat(b[i]);
}
lcd_pos(2,0); //第二行第一列地址
write_dat('4') ; //显示45 度
write_dat('5') ;
write_dat(0XA1); // 两个度字节显示0C
write_dat(0xe6); //
}
void main()
{
init();
while(1)
{
display();
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1