?? lcd.c
字號:
/*------------------------------------------------------------------------------------------------------------
液晶模塊OCM4X8C DB0-DB7連接至實驗板DP0-DP7(4/8位并行接口方式)
E(sclk)連接至實驗板DL7;
RS連接到DL6;
R/W(SID)固定接地;
外加一條連線:DK6,DK7接到VCC(+5V);
本程序功能:實現自動換行,漢字不能正常顯示出自動補空,及無亂碼顯示(單字節(jié)于雙字節(jié)字符混合)
實現方式:檢測漢字前的字母(單字節(jié))個數,若為奇數,字母后一位補以空字符,以后的字符全部往后退一個字符位
測試字符串: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個字節(jié)位置)
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 + -