?? lcd.c
字號:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#include "lcd.h"
#include "font.h"
sbit LCD_WR =P3^5; //Data Write into T6963C,L有效
sbit LCD_RD =P3^6; //Data Read from T6963C,L有效
sbit LCD_CE =P3^4; //使能信號,L有效
sbit LCD_CD =P3^7; //當wr=L,LCD_CD=H:寫命令,LCD_CD=L:寫數據;當rd=L,LCD_CD=H:讀狀態,LCD_CD=L:讀數據
sbit LCD_RST=P3^3; //Lcm reset,低有效
sbit LCD_FS =P3^2; //字體選擇,H:6*8點陣;L:8*8點陣
sbit bf0 = P1^0;
sbit bf1 = P1^1;
sbit bf3 = P1^3;
uchar code HexTable[]="0123456789ABCEDF";
uchar code Num_Tab[]=
{
/* 48 0x30 '0' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x4c, /* 0 00 00 */
0x54, /* 0 0 0 00 */
0x64, /* 0 00 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 49 0x31 '1' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x08, /* 0000 000 */
0x18, /* 000 000 */
0x08, /* 0000 000 */
0x08, /* 0000 000 */
0x08, /* 0000 000 */
0x08, /* 0000 000 */
0x1c, /* 000 00 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 50 0x32 '2' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x04, /* 00000 00 */
0x08, /* 0000 000 */
0x10, /* 000 0000 */
0x20, /* 00 00000 */
0x7c, /* 0 00 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 51 0x33 '3' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x04, /* 00000 00 */
0x18, /* 000 000 */
0x04, /* 00000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 52 0x34 '4' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x08, /* 0000 000 */
0x18, /* 000 000 */
0x28, /* 00 0 000 */
0x48, /* 0 00 000 */
0x7c, /* 0 00 */
0x08, /* 0000 000 */
0x1c, /* 000 00 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 53 0x35 '5' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x7c, /* 0 00 */
0x40, /* 0 000000 */
0x78, /* 0 000 */
0x04, /* 00000 00 */
0x04, /* 00000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 54 0x36 '6' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x40, /* 0 000000 */
0x78, /* 0 000 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 55 0x37 '7' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x7c, /* 0 00 */
0x04, /* 00000 00 */
0x04, /* 00000 00 */
0x08, /* 0000 000 */
0x10, /* 000 0000 */
0x10, /* 000 0000 */
0x10, /* 000 0000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 56 0x38 '8' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 57 0x39 '9' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x3c, /* 00 00 */
0x04, /* 00000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
};
//6x10的方塊
uchar code BlockTab[]={
/* 57 0x39 '9' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x00, /* 00000000 */
0x00, /* 00000000 */
//empty block
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
};
void LCD_Busy (uchar autowr) //測狀態
{
LCD_CE = 0;
LCD_DATA_BUS=0xff;
LCD_CD=1;
LCD_WR=1;
LCD_RD=0;
if(autowr)
{
while(bf3==0)
;
}
else
{
while((bf0==0)||(bf1==0))
;
}
LCD_RD=1;
}
uchar LCD_BusyStatus () //測狀態
{
uchar dat;
LCD_CE = 0;
LCD_CD=1;
LCD_RD=1;
LCD_WR=1;
LCD_DATA_BUS=0xff;
LCD_RD=0;
dat=LCD_DATA_BUS;
LCD_RD=1;
return dat;
}
/* 數據,指令讀寫判別 */
void LCD_CheckBusy1(void)
{
while ((LCD_BusyStatus()&3)!=3) {}
}
/* 數據自動讀判別 */
/*
void LCD_CheckBusy2(void)
{
while ((LCD_BusyStatus()&4)!=4) {}
}
*/
/* 數據自動寫判別 */
/*
void LCD_CheckBusy3(void)
{
while ((LCD_BusyStatus()&8)!=8) {}
}
*/
/*------------寫命令或數據到LCD--------------*/
void LCD_Write1 (uchar dat,uchar comm) //寫一個數據和一個命令
{
LCD_Data(dat);
LCD_Comm(comm);
}
void LCD_Write2 (uchar datl,uchar dath,uchar comm) //寫兩個數據和一個命令
{
LCD_Data(datl);
LCD_Data(dath);
LCD_Comm(comm);
}
void LCD_WriteInt (uint dat,uchar comm) //寫一個16進制數據和一個命令
{
uchar datl,dath;
datl=dat;
dath=dat>>8;
LCD_Data(datl);
LCD_Data(dath);
LCD_Comm(comm);
}
void LCD_AutoWrite (uchar dat) //自動寫數據
{
LCD_CE = 0;
LCD_Busy (1);
LCD_CD=0;
LCD_RD=1;
LCD_DATA_BUS=dat;
LCD_WR=0;
LCD_WR=1;
}
/* 讀數據 */
uchar LCD_Read(void)
{
uchar dat;
LCD_CE = 0;
LCD_CheckBusy1();
LCD_CD=0;
LCD_DATA_BUS = 0xff;
LCD_RD=0;
dat=LCD_DATA_BUS;
LCD_RD=1;
LCD_CD=1;
return dat;
}
/* 自動讀數據 */
/*
uchar LCD_AutoRead(void)
{
uchar dat;
LCD_CE = 0;
LCD_CheckBusy2();
LCD_CD=0;
LCD_DATA_BUS = 0xff;
LCD_RD=0;
dat=LCD_DATA_BUS;
LCD_RD=1;
LCD_CD=1;
return dat;
}
*/
void LCD_Comm (uchar comm) //寫命令
{
LCD_CE = 0;
LCD_Busy (0);
LCD_CD=1;
LCD_RD=1;
LCD_DATA_BUS=comm;
LCD_WR=0;
LCD_WR=1;
}
void LCD_Data (uchar dat) //寫數據
{
LCD_CE = 0;
LCD_Busy (0);
LCD_CD=0;
LCD_RD=1;
LCD_DATA_BUS=dat;
LCD_WR=0;
LCD_WR=1;
}
/*------------------初始化-----------------*/
void LCD_Init (void)
{
//LCD_RST=0;
//;
//LCD_RST=1;
//LCD_FS=0;
//LCD_CE=0;
//LCD_CE = 0;
LCD_WR=1;
LCD_RD=1;
LCD_WriteInt(LCD_TEXT_HOME_ADDR,0x40); //文本顯示區首地址
LCD_WriteInt(LCD_GRAPH_HOME_ADDR,0x42); //圖形顯示區首地址
LCD_Write2(LCD_WIDTH,0x00,0x41); //文本顯示區寬度
LCD_Write2(LCD_WIDTH,0x00,0x43); //圖形顯示區寬度
LCD_Comm(0x81); //邏輯"異或"
LCD_Write2(0x02,0x00,0x22); //CGRAM偏置地址設置
LCD_Comm(0x9c); //啟用文本顯示,啟用圖形顯示
//LCD_Comm(0x98); //啟用文本顯示,啟用圖形顯示
LCD_Cls();
}
/********************************************************/
/* 清屏 */
/********************************************************/
void LCD_Cls(void)
{
uint i;
//LCD_CE = 0;
//LCD_Write2(0x00,0x00,LC_ADD_POS);// 置地址指針為從零開始
LCD_WriteInt(LCD_TEXT_HOME_ADDR,LC_ADD_POS);
LCD_Comm(LC_AUT_WR); // 自動寫
for(i=0;i< 144*LCD_WIDTH;i++) // 清一屏
{
LCD_Data(0x00); // 寫數據0x00
}
LCD_Comm(LC_AUT_OVR); // 自動寫結束
LCD_Write2(0x00,0x00,LC_ADD_POS);// 重置地址指針
}
void LCD_ClsBlock(uchar x1,uchar y1,uchar x2,uchar y2)
{
uint addr;
uchar h,w;
uchar i,j;
//x坐標要8字節對齊
x1 =(x1 / 8) * 8;
x2 =(x2 / 8) * 8;
h = y2 - y1;
w = (x2 - x1)/8;
addr = LCD_GRAPH_HOME_ADDR + LCD_WIDTH * y1 + x1/8;
for(j=0;j<h;j++)
{
LCD_WriteInt(addr,0x24);
LCD_Comm(0xb0);
for(i=0;i<w;i++)
{
LCD_AutoWrite(0x00);
}
LCD_Comm(0xb2);
addr += LCD_WIDTH;
}
}
/* 設定圖形x,y值*/
/*
void LCD_GraphSetAddr(uchar x,uchar y)
{
uint xy;
xy=y;
xy=xy*16+x+256;
//LCD_CE = 0;
LCD_Write2(xy&0xff,xy/256,0x24);
}
*/
/* 設定文本x,y值 */
/*
void LCD_TextSetAddr(uchar x,uchar y)
{
//LCD_CE = 0;
LCD_Write2(y*16+x,0,0x24);
}
*/
/* 清除一點*/
/*
void LCD_ClrPixel(uchar x,uchar y)
{
uchar b;
uint addr = LCD_GRAPH_HOME_ADDR + y * LCD_WIDTH + x / 8;
b = 7 - (x % 8);
LCD_WriteInt(addr,0x24);
LCD_Comm(0xf0|b);
}
*/
/* 點亮一點 */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -