最近想做一件东西,却想到一个一直没有直视的问题,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();
- }
- }
复制代码
|