?? main.c
字號(hào):
/*------------------------------------------------------------------------------------------------------------
液晶模塊OCM4X8C DB0-DB7連接至實(shí)驗(yàn)板DP0-DP7(4/8位并行接口方式)
E(sclk)連接至實(shí)驗(yàn)板DL7;
RS連接到DL6;
R/W(SID)固定接地;
外加一條連線:DK6,DK7接到VCC(+5V);
本程序功能:PC機(jī)通過串口向單片機(jī)傳輸數(shù)據(jù),單片機(jī)經(jīng)過處理后再送到液晶上顯示
液晶能自動(dòng)換行,漢字不能正常顯示的位置自動(dòng)補(bǔ)空,及無亂碼顯示(單字節(jié)于雙字節(jié)字符混合)
實(shí)現(xiàn)方式:檢測(cè)漢字前的字母(單字節(jié))個(gè)數(shù),若為奇數(shù),字母后一位補(bǔ)以空字符,以后的字符全部往后退一個(gè)字符位
變量說明:
LCD_cn 字符寫入地址或液晶要顯示的數(shù)據(jù)
line 對(duì)應(yīng)于液晶的顯示行數(shù),從的0行開始
3G1C embedded studio design
------------------------------------------------------------------------------------------------------------*/
#include <reg52.h>
#include <absacc.h> //片外地址定義
#define uchar unsigned char
#define led_data XBYTE[0xe000] /*端口地址,對(duì)應(yīng)實(shí)驗(yàn)板的DP0-DP7,數(shù)據(jù)*/
#define led_sel XBYTE[0xc000] /*端口地址,對(duì)應(yīng)實(shí)驗(yàn)板的DL*/
void changeAddr(uchar lin); //地址轉(zhuǎn)換子程序
void insert(uchar p); //插入空字符子程序
void changeArr(void); //數(shù)組調(diào)整子程序
void show(void); //液晶顯示子程序
void wcom(void); //液晶寫指令子程序
void wdat(void); //液晶寫數(shù)據(jù)子程序
void delayms(uchar ms); //ms級(jí)延時(shí)子程序
void init(void); //初始化子程序
void init_serial(void);
uchar LCD_cn;
uchar data buffer[100]; //直接訪問的內(nèi)部數(shù)據(jù)存儲(chǔ)器,訪問速度最快
uchar i=0;
uchar k;
uchar flag;
sbit LED=P1^0;
/*---------------------------------------------------------------------------------------------
主函數(shù)
---------------------------------------------------------------------------------------------*/
main(void)
{
init(); //液晶模塊初始化
init_serial();
led_data=0;
led_sel=0xff;
TR1=1;
while(1)
{
if(flag==1)
{
flag=0;
LCD_cn=0x01; //清除顯示
wcom();
delayms(2);
changeArr(); //調(diào)用字符數(shù)組排列子程序
LED=0;
show(); //調(diào)用液晶顯示子程序
}
}
}
/*-----------------------------------------------------------------------------------------------
液晶初始化子程序
-----------------------------------------------------------------------------------------------*/
void init(void)
{
LCD_cn=0x30; //功能設(shè)定
wcom();
//delayms(2);
LCD_cn=0x01; //清除顯示
wcom();
//delayms(2);
LCD_cn=0x06; //光標(biāo)右移
wcom();
//delayms(2);
LCD_cn=0x0c; //開顯示器
wcom();
//delayms(2);
LCD_cn=0x01; //清除顯示
wcom();
//delayms(2);
}
/*----------------------------------------------------------------------------------------------
延時(shí)子程序
確保上一指令/數(shù)據(jù)已經(jīng)接受、處理完。
----------------------------------------------------------------------------------------------*/
void delayms(uchar ms)
{
uchar i;
while(ms--)
{
for(i=0; i<125; i++);
}
}
/*----------------------------------------------------------------------------------------------
串口初始化
----------------------------------------------------------------------------------------------*/
void init_serial(void)
{
TMOD=0x20; //設(shè)置波特率9600bps
TL1=0xfd;
TH1=0xfd;
SCON=0x50;
EA=1;
ES=1;
}
/*----------------------------------------------------------------------------------------------
液晶寫指令子程序
----------------------------------------------------------------------------------------------*/
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 恢復(fù)
delayms(2);
}
/*-----------------------------------------------------------------------------------------------
液晶寫數(shù)據(jù)子程序
-----------------------------------------------------------------------------------------------*/
void wdat(void) //寫數(shù)據(jù)
{
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 恢復(fù)
//led_sel=0x3f; //RW=0,RS=0,E=0 恢復(fù) 這句代替上句的話,RS=0,無法顯示數(shù)據(jù)
delayms(2);
}
/*--------------------------------------------------------------------
地址轉(zhuǎn)換子程序
第一行: 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;
}
}
/*------------------------------------------------------------------------------------------
插入字符子程序
相應(yīng)位插入空字符,同時(shí)該位以后的所有字符逐位往后退一位
------------------------------------------------------------------------------------------*/
void insert(uchar p)
{
uchar p1;
p1=p;
while(buffer[p]!='\0') //將數(shù)組指針移到數(shù)組末尾第一個(gè)\0處
{
p++;
}
for(;p>p1;p--) //從第p1+1位開始,逐位往后退一位
buffer[p]=buffer[p-1];
buffer[p1]=' '; //p1位補(bǔ)空字符
}
/*----------------------------------------------------------------------------------------
數(shù)組重排列子程序
----------------------------------------------------------------------------------------*/
void changeArr(void)
{
uchar count; //用于計(jì)算字母(單字符)個(gè)數(shù)
uchar j=0;
while(buffer[j]!='\0')
{
if(buffer[j]<127) //判斷是否位字母
{
count++;
j++;
}
if(buffer[j]>127) //判斷是否位漢字
{
if(count%2!=0) //若漢字前字母?jìng)€(gè)數(shù)為奇數(shù)則調(diào)用子函數(shù)insert(),作相應(yīng)的處理
{
insert(j);
j=j+2; //跳到漢字后的字符(一個(gè)漢字占用2個(gè)字節(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個(gè)字符,到達(dá)字符個(gè)數(shù)自動(dòng)換行
{
line=j/16;
if(line>4) break;
changeAddr(line); //改變地址
wcom();
}
LCD_cn=buffer[j];
wdat();
j++;
}
}
/*----------------------------------------------------------------------------------------------
串口中斷子程序
----------------------------------------------------------------------------------------------*/
serial()interrupt 4 using 1
{
RI=0;
buffer[i]=SBUF;
i++;
if(SBUF=='*')
{
for(k=i-1;k<100;k++)
buffer[k]='\0';
flag=1;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -