📄 lcd.c
字号:
/*------------------------------------------------------------------------------------------------------------
液晶模块OCM4X8C DB0-DB7连接至实验板DP0-DP7(4/8位并行接口方式)
E(sclk)连接至实验板DL7;
RS连接到DL6;
R/W(SID)固定接地;
外加一条连线:DK6,DK7接到VCC(+5V);
本程序功能:实现自动换行,汉字不能正常显示出自动补空,及无乱码显示(单字节于双字节字符混合)
实现方式:检测汉字前的字母(单字节)个数,若为奇数,字母后一位补以空字符,以后的字符全部往后退一个字符位
测试字符串:3嵌G入1式C21工4作8式03届
变量说明:
LCD_cn 字符写入地址或液晶要显示的数据
line 对应于液晶的显示行数,从的0行开始
3G1C embedded studio design
------------------------------------------------------------------------------------------------------------*/
#include <reg52.h>
#include <absacc.h> //片外地址定义
#define uchar unsigned char
#define led_data XBYTE[0xe000] /*端口地址,对应实验板的DP0-DP7,数据*/
#define led_sel XBYTE[0xc000] /*端口地址,对应实验板的DL*/
void changeAddr(uchar lin); //地址转换子程序
void insert(uchar p); //插入空字符子程序
void changeArr(void); //数组调整子程序
void show(void); //液晶显示子程序
void wcom(void); //液晶写指令子程序
void wdat(void); //液晶写数据子程序
void delayms(uchar ms); //ms级延时子程序
void init(void); //初始化子程序
uchar LCD_cn;
uchar buffer[100]={"3嵌G入1式C21工4作8式03届"};
/*---------------------------------------------------------------------------------------------
主函数
---------------------------------------------------------------------------------------------*/
main(void)
{
init(); //液晶模块初始化
led_data=0;
led_sel=0xff;
changeArr(); //调用字符数组排列子程序
show(); //调用液晶显示子程序
while(1)
{
}
}
/*-----------------------------------------------------------------------------------------------
液晶初始化子程序
-----------------------------------------------------------------------------------------------*/
void init(void)
{
LCD_cn=0x30; //功能设定
wcom();
//delayms(2);
LCD_cn=0x01; //清除显示
wcom();
//delayms(2);
LCD_cn=0x06; //光标右移
wcom();
//delayms(2);
LCD_cn=0x0c; //开显示器
wcom();
//delayms(2);
LCD_cn=0x01; //清除显示
wcom();
//delayms(2);
}
/*----------------------------------------------------------------------------------------------
延时子程序
确保上一指令/数据已经接受、处理完。
----------------------------------------------------------------------------------------------*/
void delayms(uchar ms)
{
uchar i;
while(ms--)
{
for(i=0; i<125; i++);
}
}
/*----------------------------------------------------------------------------------------------
液晶写指令子程序
----------------------------------------------------------------------------------------------*/
void wcom(void) //写指令
{
led_sel=0xbf; //RW=0,RS=0,E=1 指令写
//delayms(2);
led_data=LCD_cn;
//delayms(2);
led_sel=0x3f; //RW=0,RS=0,E=0 恢复
delayms(2);
}
/*-----------------------------------------------------------------------------------------------
液晶写数据子程序
-----------------------------------------------------------------------------------------------*/
void wdat(void) //写数据
{
led_sel=0xff; //RW=0,RS=1,E=1 写
//delayms(2);
led_data=LCD_cn;
//delayms(2);
led_sel=0x7f; //写脉冲Rs=1,wr=0;e=0 恢复
//led_sel=0x3f; //RW=0,RS=0,E=0 恢复 这句代替上句的话,RS=0,无法显示数据
delayms(2);
}
/*--------------------------------------------------------------------
地址转换子程序
第一行: 80H ———87H ,第二行: 90H ———97H 第三行:88H ———8FH 第四行:9
--------------------------------------------------------------------*/
void changeAddr(uchar lin)
{
switch(lin)
{
case 0:
LCD_cn=0x80; //LINE 1
break;
case 1:
LCD_cn=0x90; //LINE 2
break;
case 2:
LCD_cn=0x88; //LINE 3
break;
case 3:
LCD_cn=0x98; //LINE 4
break;
}
}
/*------------------------------------------------------------------------------------------
插入字符子程序
相应位插入空字符,同时该位以后的所有字符逐位往后退一位
------------------------------------------------------------------------------------------*/
void insert(uchar p)
{
uchar p1;
p1=p;
while(buffer[p]!='\0') //将数组指针移到数组末尾第一个\0处
{
p++;
}
for(;p>p1;p--) //从第p1+1位开始,逐位往后退一位
buffer[p]=buffer[p-1];
buffer[p1]=' '; //p1位补空字符
}
/*----------------------------------------------------------------------------------------
数组重排列子程序
----------------------------------------------------------------------------------------*/
void changeArr(void)
{
uchar count; //用于计算字母(单字符)个数
uchar j=0;
while(buffer[j]!='\0')
{
if(buffer[j]<127) //判断是否位字母
{
count++;
j++;
}
if(buffer[j]>127) //判断是否位汉字
{
if(count%2!=0) //若汉字前字母个数为奇数则调用子函数insert(),作相应的处理
{
insert(j);
j=j+2; //跳到汉字后的字符(一个汉字占用2个字节位置)
count=0;
}
else
{
count=0;
j++;
}
}
}
}
/*---------------------------------------------------------------------------------------------------
液晶显示子程序
---------------------------------------------------------------------------------------------------*/
void show(void)
{
uchar j=0;
uchar line;
LCD_cn=0x80;
wcom();
while(buffer[j]!='\0')
{
if(j%16==0) //每行智能显示16个字符,到达字符个数自动换行
{
line=j/16;
if(line>4) break;
changeAddr(line); //改变地址
wcom();
}
LCD_cn=buffer[j];
wdat();
j++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -