?? lcd.c
字號:
//控制器:SED1335
//LCD:大連東顯EDM320240
//設計者:李晶皎
//MCU:MC68HC908GP32
//接口:PTC0-A0,PTC1-WR,PTC2-RD,PTB-DB
#include "gp32.h"
/*開中斷*/
#define cli() _asm("cli\n")
/*關中斷*/
#define sei() _asm("sei\n")
#define nop() _asm("nop\n")
typedef struct bits {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
} BITS;
typedef union bit_char {
unsigned char byte;
BITS b;
} BIT_CHAR;
#define BSET(x, y) ((x).b.b ## y = 1)
#define BCLR(x, y) ((x).b.b ## y = 0)
#define CLRBYTE(x) ((x).byte = 0)
@tiny volatile BIT_CHAR PTC @0x02;
unsigned char command,data;
unsigned int i,k;
const unsigned char KeyValue[4]={0xfe,0xfd,0xfb,0xf7};
const unsigned char KeyTable[16]={0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
const unsigned char SysTab[8]={0x32,0x87,0x07,0x27,0x42,0xf0,0x28,0x00};
const unsigned char ScrTab[10]={0x00,0x00,0xf0,0x00,0x28,0xf0,0x00,0x50,0x00,0x00};
const char displaystring[19]={"WELCOME USE SED1335"};
const unsigned char EXPRT[44]={
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,
0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8f,0x91,0x93,0x95,0x97,0x99,0x9b,0x9d,0x9f,0xe1,0xe3,0xe5,0xe7,0xe9,0xeb,};
const CLength=352; //11*32
const unsigned char CTable[]={
0x01,0x3F,0x24,0x3F,0x26,0x2D,0x34,0x25,0x2F,0x20,0x2F,0x20,0x5F,0x40,0x82,0x01,
0x00,0xFE,0x20,0xFC,0x30,0x68,0xA6,0x20,0xF8,0x80,0xFC,0x80,0xFE,0x80,0x80,0x00,//摩
0x20,0x20,0x23,0xF8,0x20,0x20,0x28,0x37,0xE0,0x20,0x20,0x20,0x20,0x20,0xA0,0x40,
0x00,0x3C,0xC0,0x40,0x40,0x40,0x40,0xFE,0x40,0x40,0x40,0x40,0x42,0x42,0x3E,0x00,//托
0x00,0x3F,0x22,0x22,0x22,0x3F,0x22,0x03,0x06,0x0C,0x12,0x61,0x00,0x03,0x0C,0xF0,
0x00,0xFC,0x44,0x44,0x44,0xFC,0x00,0xFC,0x08,0x08,0x10,0x20,0xC0,0x00,0x00,0x00,//羅
0x10,0x10,0x10,0x11,0xFC,0x10,0x15,0x18,0x30,0xD0,0x10,0x10,0x10,0x17,0x50,0x20,
0x80,0x60,0x20,0xFE,0x00,0x08,0x0C,0x88,0x88,0x48,0x50,0x50,0x50,0xFE,0x00,0x00,//拉
0x08,0x06,0x04,0x3F,0x21,0x3F,0x21,0x21,0x3F,0x21,0x01,0xFF,0x01,0x01,0x01,0x01,
0x20,0x30,0x40,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x08,0x00,0xFE,0x00,0x00,0x00,0x00,//單
0x00,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x20,0x20,0x40,0x80,
0x40,0x40,0x40,0x44,0xFE,0x00,0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,//片
0x10,0x10,0x10,0xFE,0x10,0x10,0x38,0x34,0x54,0x50,0x91,0x11,0x12,0x12,0x14,0x10,
0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x08,0x0A,0x0A,0x0A,0x06,0x00,//機
0x20,0x13,0x10,0x40,0x47,0x44,0x44,0x47,0x44,0x44,0x47,0x40,0x40,0x40,0x40,0x40,
0x00,0xFC,0x04,0x04,0xE4,0x24,0x24,0xE4,0x24,0x24,0xE4,0x04,0x04,0x04,0x14,0x08,//間
0x10,0x10,0x13,0xFD,0x10,0x17,0x14,0x18,0x30,0xDF,0x11,0x13,0x10,0x10,0x51,0x26,
0x40,0x20,0xFC,0x08,0x90,0xFE,0x00,0x80,0x80,0xFE,0x10,0x10,0xE0,0x50,0x8C,0x04,//接
0x10,0x10,0x10,0xFD,0x11,0x10,0x14,0x19,0x30,0xD1,0x10,0x10,0x10,0x10,0x53,0x20,
0x00,0x20,0x10,0xFE,0x04,0x50,0x8C,0x04,0x00,0xFC,0x20,0x20,0x20,0x20,0xFE,0x00,//控
0x24,0x34,0x24,0x3F,0x44,0x04,0x7F,0x04,0x3F,0x24,0x24,0x24,0x24,0x27,0x05,0x04,
0x04,0x04,0x24,0xA4,0x24,0x24,0xA4,0x24,0xA4,0xA4,0xA4,0xA4,0x84,0x84,0x14,0x08,//制
};
const int cnt=8;
const int ptr[8]={10,15,20,25,30,35,40,45};
/*等待1s子程序*/
static void Wait1ms(void) {
int cnt = 0;
while (cnt <80) cnt++;
}
/*等待n ms子程序*/
void WaitNms(int n){
int i;
for(i=1;i<=n;i++) Wait1ms();
}
/* read state bit */
void BFRead(void){
unsigned char temp;
BSET(PTC,1); //WR=1
while(1){
DDRB=0x00;
BCLR(PTC,0); //A0=0
BCLR(PTC,2); //RD=0
temp=PTB;
BSET(PTC,2); //RD=1
if ((temp&0x40)==0) break; //BF為第6位,BF=0顯示存儲器空閑
}
}
/*write Command */
void WRCommand(unsigned command){
DDRB=0xff;
BSET(PTC,2); //RD=1
PTB=command;
BSET(PTC,0); //A0=1
BCLR(PTC,1); //WR=0
BSET(PTC,1); //WR=1
}
/* write data */
void WRData(unsigned char data){
DDRB=0xff;
BSET(PTC,2);
PTB=data;
BCLR(PTC,0); //A0=0
BCLR(PTC,1); //WR=0
BSET(PTC,1); //WR=1
}
/*讀參數和顯示數據*/
unsigned char RDData(void){
unsigned char temp;
DDRB=0x00;
BSET(PTC,0); //A0=1
BCLR(PTC,2); //RD=0
temp=PTB;
BSET(PTC,2); //RD=1
return(temp);
}
/* open dispaly */
void DisOn(void){
WRCommand(0x59);
WRData(0x54);//畫面顯示但不閃爍 光標顯示關閉
}
/* Off dispaly */
void DisOff(void){
WRCommand(0x58);
WRData(0x56);
}
/*清顯示RAM*/
void CLRDisplay(void){
WRCommand(0x4c); //光標右移
WRCommand(0x46); //設置光標指針0x0000
WRData(0x00);
WRData(0x00);
WRCommand(0x42); //設置數據寫入
for(i=0;i<65000;i++){
WRData(0x00);
}
}
/* Initialisation of the EPSON SED1335 LCD display.
SysTab[8]={0x30,0x87,0x07,0x27,0x31,0xf0,0x28,0x00};
ScrTab[10]={0x00,0x00,0xf0,0x00,0x28,0xf0,0x00,0x50,0x00,0x00};*/
void Init_LCD(void){
WRCommand(0x40); //設置SYSTEM SET參數
for(i=0;i<8;i++){
WRData(SysTab[i]);
}
WRCommand(0x44); //設置SYSTEM SET Scroll參數
for(i=0;i<10;i++){
WRData(ScrTab[i]);
}
WRCommand(0x5b); //設置顯示合成方式
WRData(0x00);
CLRDisplay();
DisOn();
}
/* 顯示西文字符*/
void DisplayChar(void){
WRCommand(0x5d); //CSRFORM代碼
WRData(0x07); //設置光標水平點為CSX=8
WRData(0x87); //設置光標為塊狀形式,CSY=8
WRCommand(0x5b); //設置顯示合成方式,OVLAY代碼
WRData(0x01); //顯示一、三區為文本方式
WRCommand(0x59); //設置顯示狀態開
WRData(0x54); //畫面顯示但不閃爍 光標顯示關閉
WRCommand(0x46); //設置光標指針0x0000-第一顯示區,CSRW代碼
WRData(0x0b);
WRData(0x00);
WRCommand(0x4c); //光標右移,CSRDIR代碼
WRCommand(0x42); //設置數據寫入,MWRITE代碼
for (k=0;k<19;k++){
WRData(displaystring[k]);
}
}
/*文本方式下顯示漢字*/
/*建立CGRAM*/
void SetCGRAM(void){
// unsigned int cursor;
WRCommand(0x5c); //設置CGRAM首地址
WRData(0x00); //首地址為0xc000
WRData(0xc0);
// cursor=0xc000+0x80*8;
WRCommand(0x46); //設置光標指針
WRData(0x00); //首地址為0xc000-代碼0x80
WRData(0xc4);
WRCommand(0x4c); //光標右移
WRCommand(0x42); //設置數據寫入
for(i=0;i<CLength;i++){
WRData(CTable[i]);
}
}
/*文本方式下顯示漢字*/
void CCDisplay(unsigned char row,unsigned char col){//row(0~29),col(0~39)
unsigned int cursor,tempaddress,addl,addh;
SetCGRAM();
WRCommand(0x4c); //光標右移
cursor=0x0000+row*40+col; //第一顯示區
tempaddress=cursor;
addl=tempaddress&0x00ff;
addh=((cursor&0xff00)>>8);
WRCommand(0x46); //設置光標指針
WRData(addl);
WRData(addh);
WRCommand(0x42);
for (k=0;k<22;k++){
WRData(EXPRT[k]);
}
row+=1;
cursor=0x0000+row*40+col;
tempaddress=cursor;
addl=tempaddress&0x00ff;
addh=((cursor&0xff00)>>8);
WRCommand(0x46); //設置光標指針
WRData(addl);
WRData(addh);
WRCommand(0x42);
for (k=22;k<44;k++){
WRData(EXPRT[k]);
}
}
/*圖形方式下顯示漢字*/
void GCDisplay(unsigned int row,unsigned int col){ //row(0~319)col(0~29)
unsigned int cursor,tempaddress;
unsigned int temprow,tempcol;
unsigned char addl,addh;
WRCommand(0x4f); //光標下移
for(i=0;i<11;i++) /*11個漢字*/
{
tempcol=col+i*2;
for(k=0;k<16;k++)
{
temprow=row+k;
cursor=0x2800+temprow*40+tempcol;//加上顯示二區的起始地址
tempaddress=cursor;
addl=tempaddress&0x00ff;
addh=((cursor&0xff00)>>8);
WRCommand(0x46); //設置光標指針
WRData(addl);
WRData(addh);
WRCommand(0x42);
WRData(CTable[i*32+k]);
}
for(k=0;k<16;k++)
{
temprow=row+k;
cursor=0x2800+temprow*40+tempcol+1;//加上顯示二區的起始地址
tempaddress=cursor;
addl=tempaddress&0x00ff;
addh=((cursor&0xff00)>>8);
WRCommand(0x46); //設置光標指針
WRData(addl);
WRData(addh);
WRCommand(0x42);
WRData(CTable[i*32+k+16]);
}
}
}
/*滾動演示程序—————左右上下*/
/*第一顯示區向左滾動顯示子程序*/
void LeftScroll(void){
unsigned char l=0;
char addrl,addrh;
char addr=0,tempaddr;
CCDisplay(5,5);
while(1){
while(l<8){
WRCommand(0x5a); //設置點位移
WRData(l);
l+=1;
WaitNms(500);
}
addr+=1;
tempaddr=addr;
addrl=(tempaddr&0x00ff);
addrh=((addr&0xff00)>>8);
WRCommand(0x44); //設置顯示域
WRData(addrl);
WRData(addrh);
l=0;
WRCommand(0x5a); //設置點位移
WRData(l);
}
}
/*第二顯示區向右滾動顯示子程序*/
void RightScroll(void){
unsigned char l=7;
unsigned char addrl,addrh;
unsigned char addr=0x2800,tempaddr;
GCDisplay(50,10);
while(1){
while(l>=0){
WRCommand(0x5a); //設置點位移
WRData(l);
l-=1;
WaitNms(500);
}
addr-=1;
tempaddr=addr;
addrl=(tempaddr&0x00ff);
addrh=((addr&0xff00)>>8);
WRCommand(0x44); //設置顯示域
WRData(addrl);
WRData(addrh);
l=7;
WRCommand(0x5a); //恢復HDOT SET
WRData(l);
}
}
/*第一顯示區向下滾動顯示子程序
文本方式下上下滾動以字符為單位*/
void DownScroll(void){
unsigned char addr,tempaddr;
unsigned char addrl,addrh;
unsigned char AP=0x0028;
CCDisplay(5,5);
while(1){
addr=0x0000;
while(addr<1200){
addr+=AP;
tempaddr=addr;
addrl=(tempaddr&0x00ff);
addrh=((addr&0xff00)>>8);
WRCommand(0x44);
WRData(addrl);
WRData(addrh);
WaitNms(500);
}
}
}
/*第二顯示區向上滾動顯示子程序*/
void UpScroll(void){
unsigned char addr,tempaddr;
unsigned char addrl,addrh;
unsigned char AP=0x0028;
GCDisplay(50,10);
while(1){
addr=0x2800;
while(addr>320){
addr-=320;
tempaddr=addr;
addrl=(tempaddr&0x00ff);
addrh=((addr&0xff00)>>8);
WRCommand(0x44);
WRData(addrl);
WRData(addrh);
WaitNms(500);
}
}
}
/*在圖形方式下,繪點子程序*/
void DrawDot(int row,int col) /*行坐標以點為單位,列坐標以點為單位*/
{
int addr,tempaddr,addrl,addrh;
int bitset=0x01;
unsigned char data0;
/*設置顯示地址*/
addr=0x2800+row*0x28+col/8;
tempaddr=addr;
addrl=tempaddr&0x00ff;
addrh=((addr&0xff00)>>8);
WRCommand(0x46); //設置光標地址
WRData(addrl);
WRData(addrh);
WRCommand(0x43); //讀取該位置的原始數據
data0=RDData();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -