?? lcd6963.c
字號:
#include<stdio.h>
#include<intrins.h>
#include <reg51.h>
#include <math.h>
#include <absacc.h>
#include <string.h>
//內(nèi)部函數(shù)
#define cli() _asm("cli\n")
/* disable interrupts*/
#define sei() _asm("sei\n")
#define nop() _asm("nop\n")
/*數(shù)據(jù)類型定義部分*/
#define uint unsigned int
#define uchar unsigned char
#define Uint unsigned int
#define Uchar unsigned char
#define rdcommand XBYTE[0x0ff00]
#define rdshuju XBYTE[0x0fe00]
#define command DBYTE[0x30]
#define shuju1 DBYTE[0x31]
#define shuju2 DBYTE[0x32]
#define shuju DBYTE[0x33]
uchar data temp;
uint data i,k;
uint data start=0x0800;
sbit p1_2=P1^2;
sbit ret=P1^0;
sbit fs=P1^1;
uint data ELength=21;
uchar code 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"
uint data CCLength=352;
uchar code EXPRT1[22]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xa0,0xa2,0xa4,0xa6,0xa8,0xaa};
uchar code EXPRT2[22]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8f,0x91,0x93,0x95,0x97,0x99,0x9b,0x9d,0x9f,0xa1,0xa3,0xa5,0xa7,0xa9,0xab};
uchar code 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,//制
};
Uint data 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();
}
/*讀狀態(tài)位0和1 */
void ST01Read(void){
while(1){
temp=rdcommand;
if ((temp&0x03)==0x03) break; /*判斷指令、數(shù)據(jù)讀寫狀態(tài)是否準備好*/
}
}
/*讀狀態(tài)位3 */
void ST3Read(void){
P0=0x00;
while(1){
temp=rdcommand;
if ((temp&0x08)==0x08) break; //判斷數(shù)據(jù)自動寫狀態(tài)是否準備好
}
}
/*寫數(shù)據(jù)*/
void WRshuju(Uchar shuju){
rdshuju=shuju;
}
/*寫命令*/
void WRCommand(Uchar command){
rdcommand=command;
}
/*無參數(shù)指令*/
void WRCommandOne(void){
ST01Read(); //讀狀態(tài)位0和1
WRCommand(command); /*寫命令*/
}
/*單參數(shù)指令*/
void WRCommandTwo(void){
ST01Read();
WRshuju(shuju2); /*寫數(shù)據(jù)*/
ST01Read();
WRCommand(command); /*寫命令*/
}
/*雙參數(shù)指令*/
void WRCommandMany(void){
ST01Read();
WRshuju(shuju1); /*寫數(shù)據(jù)*/
ST01Read();
WRshuju(shuju2); /*寫數(shù)據(jù)*/
ST01Read();
WRCommand(command); /*寫命令*/
}
/*初始化T6963 LCD 顯示.*/
void Init_LCD_Graphic(void){
/*設置文本顯示首地址*/
shuju1=0x00;
shuju2=0x00;
command=0x40;
WRCommandMany();
/*設置文本顯示區(qū)寬度*/
shuju1=0x28; /*40字節(jié)*/
shuju2=0x00;
command=0x41;
WRCommandMany();
/*設置圖形顯示區(qū)首地址*/
shuju1=0x00;
shuju2=0x08; /*首地址0x0800*/
command=0x42;
WRCommandMany();
/*設置圖形顯示區(qū)寬度*/
shuju1=0x28; /*40字節(jié)*/
shuju2=0x00;
command=0x43;
WRCommandMany();
/*設置顯示方式*/
command=0x80; /*啟用內(nèi)部字符發(fā)生器,顯示方式是文本與圖形邏輯或*/
WRCommandOne();
/*設置顯示狀態(tài)*/
command=0x9f; /*啟用光標閃爍、光標顯示、文本顯示、圖形顯示*/
WRCommandOne();
}
/*清顯示RAM*/
void ClrGraphic(void){
/*設置顯示地址*/
shuju1=0x00; /*低字節(jié)*/
shuju2=0x00; /*高字節(jié)*/
command=0x24;
WRCommandMany();
/*進入自動寫方式*/
command=0xb0;
WRCommandOne();
/*清8KRAM*/
shuju1=0x00;
for(i=0;i<0x2000;i++){
ST3Read();
WRshuju(shuju1);
}
/*退出自動寫方式*/
command=0xb2;
WRCommandOne();
}
void TextDisplay(void){
/*設置顯示地址*/
shuju1=84; //在第3行第4列顯示文本字符
shuju2=0x00;
command=0x24;
WRCommandMany();
/*進入自動寫方式*/
command=0xb0;
WRCommandOne();
/*“WELCOME”*/
for (k=0;k<ELength;k++){
ST3Read();
shuju1=ETable[k];
WRshuju(shuju1);
}
/*退出自動寫方式*/
command=0xb2;
WRCommandOne();
}
/*建立CGRAM*/
void SETCGRAM(void){
/*設置CGRAM偏移地址*/
shuju1=0x03; /*首地址為0x1c00*/
shuju2=0x00;
command=0x22;
WRCommandMany();
/*設置顯示地址*/
shuju1=0x00;
shuju2=0x1c; /*0x1c00*/
command=0x24;
WRCommandMany();
/*進入自動寫方式*/
command=0xb0;
WRCommandOne();
/*寫“摩托羅拉單片機間接控制”*/
for (k=0;k<CCLength;k++){
ST3Read();
shuju1=CCTable[k];
WRshuju(shuju1);
}
/*退出自動寫方式*/
command=0xb2;
WRCommandOne();
}
/*文本方式下顯示漢字*/
void CCDisplay(Uchar row,Uchar col){
Uint cursor,tempaddress;
SETCGRAM();
cursor=row*40+col;
tempaddress=cursor;
/*設置顯示地址*/
shuju1=tempaddress&0x00ff;
shuju2=cursor&0xff00;
command=0x24;
WRCommandMany();
command=0xb0; /*進入自動寫方式*/
WRCommandOne();
for (k=0;k<22;k++){
ST3Read();
shuju1=EXPRT1[k];
WRshuju(shuju1);
}
command=0xb2; /*退出自動寫方式*/
WRCommandOne();
row+=1;
cursor=row*40+col;
tempaddress=cursor;
/*設置顯示地址*/
shuju1=tempaddress&0x00ff;
shuju2=cursor&0xff00;
command=0x24;
WRCommandMany();
/*進入自動寫方式*/
command=0xb0;
WRCommandOne();
for (k=0;k<22;k++){
ST3Read();
shuju1=EXPRT2[k];
WRshuju(shuju1);
}
/*退出自動寫方式*/
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;
shuju1=tempaddress&0x00ff; /*設置顯示地址*/
shuju2=(cursor&0xff00)>>8;
command=0x24;
WRCommandMany();
shuju2=CCTable[i*32+k];
command=0xc0; /*設置一次寫數(shù)據(jù),地址加一*/
WRCommandTwo();
shuju2=CCTable[i*32+k+16];
WRCommandTwo();
}
WaitNms(50);
}
WaitNms(50);
}
/*滾動顯示-向右*/
void RightScroll(void)
{
Uint Num,cursor0,tempaddr;
while(1){
for(Num=0;Num<30;Num++) {
cursor0=start-Num;/*修改文本或圖形顯示區(qū)首地址*/
tempaddr=cursor0;
shuju1=tempaddr&0x00ff;
shuju2=cursor0&0xff00;
command=0x40;
WRCommandMany();
GCDisplay(1,3);
TextDisplay(); //""
CCDisplay(1,3);
WaitNms(500);
}
}
}
/*滾動顯示—向下*/
void DownScroll(void)
{
Uint Num,cursor0,tempaddr;
while(1){
for(Num=0;Num<16;Num++){
cursor0=start-Num*40; /*設置文本顯示首地址*/
tempaddr=cursor0;
shuju1=tempaddr&0x00ff;
shuju2=cursor0&0xff00;
command=0x40;
WRCommandMany();
TextDisplay(); //""
WaitNms(500);
}
}
}
main()
{ p1_2=1;
fs=0; //FS=0,8×8字體
ret=0;
WaitNms(1000);
ret=1;
p1_2=0;
Init_LCD_Graphic(); //初始化屏幕
ClrGraphic(); //清屏
// TextDisplay(); //文本顯示
// GCDisplay(40,4);
for(;;);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -