?? lcd6963.asm
字號:
/* This file is designed for the LCD display.*/
/* It is designed by Lijingjiao*/
#include "gp32.h"
/* Authorize interrupts*/
#define cli() _asm("cli\n")
/* disable interrupts*/
#define sei() _asm("sei\n")
#define nop() _asm("nop\n")
/*數據類型定義部分*/
typedef unsigned int Uint; /*無符號整型數據類型的定義*/
typedef unsigned char Uchar; /*無符號整型數據類型的定義*/
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 BIT0 (unsigned char)0x01
#define BIT1 (unsigned char)0x02
#define BIT2 (unsigned char)0x04
#define BIT3 (unsigned char)0x08
#define BIT4 (unsigned char)0x10
#define BIT5 (unsigned char)0x20
#define BIT6 (unsigned char)0x40
#define BIT7 (unsigned char)0x80
#define BSET(x, y) ((x).b.b ## y = 1)
#define BCLR(x, y) ((x).b.b ## y = 0)
@tiny volatile BIT_CHAR PTC @0x02;
Uchar command,data;
Uchar temp;
Uint i,k;
Uint data1,data2;
const Uint start=0x0800;
const Uchar KeyValue[]={0xfe,0xfd,0xfb,0xf7};/*逐行掃描*/
const Uchar KeyTable[16]={0xEE,0xDE,0xBE,0x7E,
0xED,0xDD,0xBD,0x7D,
0xEB,0xDB,0xBB,0x7B,
0xE7,0xD7,0xB7,0x77,
};
const Uint ELength=21;
const Uchar ETable[21]={0x37,0x25,0x2c,0x23,0x2f,0x2d,0x25,0X00,0x34,0x2f,0X00,//"WELCOME TO "
0x35,0x33,0x25,0x00,0x34,0x16,0x19,0x16,0x13,0x23};//"USE T6963C"
const Uint CCLength=352;
const Uchar EXPRT1[22]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xa0,0xa2,0xa4,0xa6,0xa8,0xaa};
const Uchar EXPRT2[22]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8f,0x91,0x93,0x95,0x97,0x99,0x9b,0x9d,0x9f,0xa1,0xa3,0xa5,0xa7,0xa9,0xab};
const Uchar CCTable[352]={
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 Uint ptr[]={10,12,20,35,40,15,18,50};
/*延遲1ms*/
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();
}
/*讀狀態位0和1 */
void ST01Read(void){
PTB=0x00;
DDRB=0x00; //設置PTB口為輸入方向
while(1){
BSET(PTC,2); //C/D=1
BCLR(PTC,1); ///RD=0
temp=PTB; //將PTB口數據送給變量temp
BSET(PTC,1); ///RD=1
if ((temp&0x03)==0x03) break; /*判斷指令、數據讀寫狀態是否準備好*/
}
}
/*讀狀態位3 */
void ST3Read(void){
PTB=0x00;
DDRB=0x00; //設置PTB口為輸入方向
while(1){
BSET(PTC,2); //C/D=1
BCLR(PTC,1); // /RD=0
temp=PTB;
BSET(PTC,1); // /RD=1
if ((temp&8)!=0) {break;} //判斷數據自動寫狀態是否準備好
}
}
/*讀狀態位6*/
void ST6Read(void){
PTB=0x00;
DDRB=0x00; //設置PTB口為輸入方向
while(1){
BSET(PTC,2); //C/D=1
BCLR(PTC,1); // /RD=0
temp=PTB;
BSET(PTC,1); // /RD=1
if ((temp&0x40)==0) {break;} // 判斷屏讀或屏拷貝出錯狀態
}
}
/*寫數據*/
void WRData(Uchar data){
DDRB=0xff; //設置PTB口為輸出方向
BCLR(PTC,2); // C/D=0
BCLR(PTC,0); // /WR=0
PTB=data;
BSET(PTC,0); // /WR=1
}
/*讀數據*/
void RDData(void){
ST01Read(); //讀狀態位0和1
BCLR(PTC,2); // C/D=0
BCLR(PTC,1); // RD=0
data2=PTB; // 讀取數據
BSET(PTC,1); // RD=1
}
/*寫命令*/
void WRCommand(Uchar command){
DDRB=0xff; //設置PTB口為輸出方向
BCLR(PTC,0); // /WR=0
PTB=command; //將命令送PTB口
BSET(PTC,0); // /WR=1
}
/*無參數指令*/
void WRCommandOne(void){
ST01Read(); //讀狀態位0和1
WRCommand(command); /*寫命令*/
}
/*單參數指令*/
void WRCommandTwo(void){
ST01Read();
WRData(data2); /*寫數據*/
ST01Read();
WRCommand(command); /*寫命令*/
}
/*雙參數指令*/
void WRCommandMany(void){
ST01Read();
WRData(data1); /*寫數據*/
ST01Read();
WRData(data2); /*寫數據*/
ST01Read();
WRCommand(command); /*寫命令*/
}
/*初始化T6963 LCD 顯示.*/
void Init_LCD_Graphic(void){
/*設置文本顯示首地址*/
data1=0x00;
data2=0x00;
command=0x40;
WRCommandMany();
/*設置文本顯示區寬度*/
data1=0x28; /*40字節*/
data2=0x00;
command=0x41;
WRCommandMany();
/*設置圖形顯示區首地址*/
data1=0x00;
data2=0x08; /*首地址0x0800*/
command=0x42;
WRCommandMany();
/*設置圖形顯示區寬度*/
data1=0x28; /*40字節*/
data2=0x00;
command=0x43;
WRCommandMany();
/*設置顯示方式*/
command=0x80; /*啟用內部字符發生器,顯示方式是文本與圖形邏輯或*/
WRCommandOne();
/*設置顯示狀態*/
command=0x9f; /*啟用光標閃爍、光標顯示、文本顯示、圖形顯示*/
WRCommandOne();
}
/*清顯示RAM*/
void ClrGraphic(void){
/*設置顯示地址*/
data1=0x00; /*低字節*/
data2=0x00; /*高字節*/
command=0x24;
WRCommandMany();
/*進入自動寫方式*/
command=0xb0;
WRCommandOne();
/*清8KRAM*/
data1=0x00;
for(i=0;i<0x2000;i++){
ST3Read();
WRData(data1);
}
/*退出自動寫方式*/
command=0xb2;
WRCommandOne();
}
void TextDisplay(void){
/*設置顯示地址*/
data1=84; //在第3行第4列顯示文本字符
data2=0x00;
command=0x24;
WRCommandMany();
/*進入自動寫方式*/
command=0xb0;
WRCommandOne();
/*“WELCOME”*/
for (k=0;k<ELength;k++){
ST3Read();
data1=ETable[k];
WRData(data1);
}
/*退出自動寫方式*/
command=0xb2;
WRCommandOne();
}
/*建立CGRAM*/
void SETCGRAM(void){
/*設置CGRAM偏移地址*/
data1=0x03; /*首地址為0x1c00*/
data2=0x00;
command=0x22;
WRCommandMany();
/*設置顯示地址*/
data1=0x00;
data2=0x1c; /*0x1c00*/
command=0x24;
WRCommandMany();
/*進入自動寫方式*/
command=0xb0;
WRCommandOne();
/*寫“摩托羅拉單片機間接控制”*/
for (k=0;k<CCLength;k++){
ST3Read();
data1=CCTable[k];
WRData(data1);
}
/*退出自動寫方式*/
command=0xb2;
WRCommandOne();
}
/*文本方式下顯示漢字*/
void CCDisplay(Uchar row,Uchar col){
Uint cursor,tempaddress;
SETCGRAM();
cursor=row*40+col;
tempaddress=cursor;
/*設置顯示地址*/
data1=tempaddress&0x00ff;
data2=cursor&0xff00;
command=0x24;
WRCommandMany();
command=0xb0; /*進入自動寫方式*/
WRCommandOne();
for (k=0;k<22;k++){
ST3Read();
data1=EXPRT1[k];
WRData(data1);
}
command=0xb2; /*退出自動寫方式*/
WRCommandOne();
row+=1;
cursor=row*40+col;
tempaddress=cursor;
/*設置顯示地址*/
data1=tempaddress&0x00ff;
data2=cursor&0xff00;
command=0x24;
WRCommandMany();
/*進入自動寫方式*/
command=0xb0;
WRCommandOne();
for (k=0;k<22;k++){
ST3Read();
data1=EXPRT2[k];
WRData(data1);
}
/*退出自動寫方式*/
command=0xb2;
WRCommandOne();
}
/*在圖形方式下顯示漢字*/
void GCDisplay(Uint row,Uint col){ //row(0~127)col(0~29)
Uint cursor,tempaddress;
Uint temprow,tempcol;
for(i=0;i<11;i++) /*11個漢字*/
{
tempcol=col+i*2;
for(k=0;k<16;k++)
{
temprow=row+k;
cursor=0x0800+temprow*40+tempcol;
tempaddress=cursor;
data1=tempaddress&0x00ff; /*設置顯示地址*/
data2=(cursor&0xff00)>>8;
command=0x24;
WRCommandMany();
data2=CCTable[i*32+k];
command=0xc0; /*設置一次寫數據,地址加一*/
WRCommandTwo();
data2=CCTable[i*32+k+16];
WRCommandTwo();
}
WaitNms(50);
}
WaitNms(50);
}
void LeftScroll(void)
{
Uint Num,cursor0,tempaddr;
while(1){
for(Num=0;Num<40;Num++) {
cursor0=start+Num;/*設置文本顯示首地址*/
tempaddr=cursor0;
data1=tempaddr&0x00ff;
data2=cursor0&0xff00;
command=0x40;
WRCommandMany();
TextDisplay(); //""
WaitNms(500);
}
}
}
/*滾動顯示-向右*/
void RightScroll(void)
{
Uint Num,cursor0,tempaddr;
while(1){
for(Num=0;Num<30;Num++) {
cursor0=start-Num;/*修改文本或圖形顯示區首地址*/
tempaddr=cursor0;
data1=tempaddr&0x00ff;
data2=cursor0&0xff00;
command=0x40;
WRCommandMany();
GCDisplay(1,3);
TextDisplay(); //""
CCDisplay(1,3);
WaitNms(500);
}
}
}
/*滾動顯示—向上*/
void UpScroll(void)
{
Uint Num,cursor0,tempaddr;
while(1){
for(Num=0;Num<16;Num++) {
cursor0=start+Num*40;/*設置文本顯示區首地址*/
tempaddr=cursor0;
data1=tempaddr&0x00ff;
data2=cursor0&0xff00;
command=0x40;
WRCommandMany();
TextDisplay(); //""
WaitNms(50);
}
}
}
/*滾動顯示—向下*/
void DownScroll(void)
{
Uint Num,cursor0,tempaddr;
while(1){
for(Num=0;Num<16;Num++){
cursor0=start-Num*40; /*設置文本顯示首地址*/
tempaddr=cursor0;
data1=tempaddr&0x00ff;
data2=cursor0&0xff00;
command=0x40;
WRCommandMany();
TextDisplay(); //""
WaitNms(500);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -