?? lcd-ad.c
字號:
/***********************************************************************************************
** 文件名稱:_LCD_C
** 功能說明:ST7920驅動LCD顯示軟件包
** 使用說明:軟件包用到LPC213x的二個引腳,默認為P1.24,P1.25,如需修改,請修改頭文件中的宏定義數據即可
(接觸一天,時間不足,理解不深,代碼有待優化,鑒諒)
***********************************************************************************************/
#include "config.h"
#include "lad.h"
uint8 chartab4[1024] ={0x00 };
/***********************************************************************************************
** 函數名稱:LCD_Init()
** 函數功能:LCD初始化
** 入口參數:無
** 出口參數:無
***********************************************************************************************/
void LCD_Init(void)
{
PIN_INITI;
LCD_Dly(50); //啟動等待,等LCD進入工作狀態
LCD_Write(0,0x30); //8 位介面,基本指令集
LCD_Write(0,0x0c); //顯示打開,光標關,反白關
LCD_Write(0,0x01); //清屏,將DDRAM的地址計數器歸零
}
/***********************************************************************************************
** 函數名稱:LCD_Write()
** 函數功能:LCD寫指令或數據
** 入口參數:control_flow 數據控制流,0 為寫指令 1 為寫數據
ddata 數據
** 出口參數:無
***********************************************************************************************/
void LCD_Write(unsigned char control_flow, unsigned char ddata)
{
unsigned char start_data,Hdata,Ldata;
if(0==control_flow) start_data=0xf8; //寫指令
else start_data=0xfa; //寫數據
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
LCD_SendByte(start_data); //發送起始信號
LCD_Dly(1); //延時是必須的
LCD_SendByte(Hdata); //發送高四位
LCD_Dly(1); //延時是必須的
LCD_SendByte(Ldata); //發送低四位
LCD_Dly(1); //延時是必須的
}
/***********************************************************************************************
** 函數名稱:LCD_SendByte()
** 函數功能:發送一個字節
** 入口參數:bbyte 字節數據
** 出口參數:無
***********************************************************************************************/
void LCD_SendByte(unsigned char bbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if( (bbyte&0x80)!=0 ) SID_1;
else
{
SID_0 ; //SID=bbyte&0x80;取出最高位
}
SCKL_1; //SCLK=1;
__asm
{
nop
}
SCKL_0; //SCLK=0;
bbyte<<=1; //左移
}
}
/***********************************************************************************************
** 函數名稱:LCD_Dly()
** 函數功能://延時
** 入口參數:dly 延時參數,值越大,延時時間越長
** 出口參數:無
***********************************************************************************************/
void LCD_Dly(unsigned int dly)
{
unsigned int i,j;
for(i=dly;i>0;i--)
for(j=500;j>0;j--);
}
/***********************************************************************************************
** 函數名稱:LCD_Point()
** 函數功能:寫LCD畫點數據
** 入口參數:uint16 x 橫坐標
uint16 y 縱坐標
uint8 disp_onoff 0:清零某一點;1:點亮某一點
** 出口參數:無
***********************************************************************************************/
void LCD_Point(uint16 x, uint16 y, uint8 disp_onoff)
{
uint16 z=0;
z = (63-x) * 16 + (y/8);
if (disp_onoff == 0)
chartab4[z] = (chartab4[z] & (~(0x80 >> (y%8))));
else
chartab4[z] = (chartab4[z] | (0x80 >> (y%8)));
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函數名稱:Modify_Point()
** 函數功能:修改chartab4數組函數
** 入口參數:uint16 x 橫坐標
uint16 y 縱坐標
** 出口參數:無
***********************************************************************************************/
void Modify_Point(uint16 x, uint16 y)
{
uint16 z=0;
z = (63-x) * 16 + (y/8);
chartab4[z] |= (0x80 >> (y%8));
}
void Draw_Point(uint16 x, uint16 y)
{
uint16 z=0;
z = (63-x) * 16 + (y/8);
chartab4[z] |= (0x80 >> (y%8));
}
/***********************************************************************************************
** 函數名稱:Draw_HLine()
** 函數功能:在第row(0~63)行畫從最左端至最右端的直線
** 入口參數:uint8 row ;LCD行參數,取值范圍0~63
** 出口參數:無
***********************************************************************************************/
void Draw_HLine(uint8 row)
{
uint8 x,y;
for(x=row,y=0;y<128;y++)
Modify_Point(x,y);
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函數名稱:Draw_HLine2()
** 函數功能:在第row(0~63)行畫從starty至endy的直線
** 入口參數:uint8 row ;LCD行參數,取值范圍0~63;starty和endy在0~127之間
** 出口參數:無
***********************************************************************************************/
void Draw_HLine2(uint8 starty,uint8 endy,uint8 row)
{
uint8 x,y;
for(x=row,y=starty;y<endy;y++)
Modify_Point(x,y);
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函數名稱:Draw_VLine()
** 函數功能:在第colm(0~127)列畫從最下端至最上端的直線
** 入口參數:uint8 row ;LCD行參數,取值范圍0~63
** 出口參數:無
***********************************************************************************************/
void Draw_VLine(uint8 colm)
{
uint8 x,y;
for(x=0,y=colm;x<64;x++)
Modify_Point(x,y);
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函數名稱:Draw_HLine()
** 函數功能:修改chartab4數組函數
** 入口參數:uint16 x 橫坐標
uint16 y 縱坐標
uint8 disp_onoff 畫點
** 出口參數:無
***********************************************************************************************/
void Draw_VLine2(uint8 startx,uint8 endx,uint8 colm)
{
uint8 x,y;
for(x=startx,y=colm;x<endx;x++)
Modify_Point(x,y);
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函數名稱:Draw_HArrow()
** 函數功能:在LCD水平方向上畫直線末端的箭頭
** 入口參數:(x,y)需要箭頭的水平直線末端點坐標
** 出口參數:無
***********************************************************************************************/
void Draw_HArrow(uint8 x,uint8 y)
{
Modify_Point(x,y+1);
Modify_Point(x,y+2);
Modify_Point(x,y+3);
Modify_Point(x,y+4);
Modify_Point(x,y+5);
Modify_Point(x+2,y+3);
Modify_Point(x-2,y+3);
Modify_Point(x+1,y+4);
Modify_Point(x-1,y+4);
LCD_GRP(chartab4); //取數組數據來繪圖
}
/***********************************************************************************************
** 函數名稱:LCD_HLine()
** 函數功能:在LCD垂直方向上畫直線末端的箭頭
** 入口參數:(x,y)需要箭頭的垂直直線末端點坐標
** 出口參數:無
***********************************************************************************************/
void Draw_VArrow(uint8 x,uint8 y)
{
uint8 i;//i<4決定箭頭大小
Draw_VLine2(x,x+6,y);//先延長原直線3個像素點
for(i=1;i<3;i++)
{
Modify_Point(x+6-i,y+i);//右側
Modify_Point(x+6-i,y-i);//左側
}
LCD_GRP(chartab4); //取數組數據來繪圖
}
/***********************************************************************************************
** 函數名稱:LCD_GRP()
** 函數功能:繪圖函數
** 入口參數:string_num 液晶點陣數組
** 出口參數:無
***********************************************************************************************/
void LCD_GRP(uint8 const *string_num)
{
uint8 i,j,k;
k = 0x80;
LCD_Write(0,0x32); // 功能設定
LCD_Dly(2);
LCD_Write(0,0x36);
LCD_Dly(2);
// 上半屏
for (i = 0; i<32; i++)
{
LCD_Write(0,k);
LCD_Dly(2);
k++;
LCD_Write(0,0x80);
LCD_Dly(2);
for (j = 0;j <16;j++)
{
LCD_Write(1,*string_num);
string_num++;
LCD_Dly(1);
}
}
// 下半屏
k = 0x80;
for (i = 0;i < 32;i++)
{
LCD_Write(0,k);
LCD_Dly(2);
k++;
LCD_Write(0,0x88);
LCD_Dly(2);
for (j = 0;j < 16;j++)
{
LCD_Write(1,*string_num);
string_num++;
LCD_Dly(1);
}
}
}
void DrawX(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x+1,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x+2,y-2);
Modify_Point(x+2,y+2);
Modify_Point(x-1,y-1);
Modify_Point(x-1,y+1);
Modify_Point(x-2,y-2);
Modify_Point(x-2,y+2);
LCD_GRP(chartab4); //取數組數據來繪圖
}
void DrawY(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x-1,y);
Modify_Point(x-2,y);
Modify_Point(x+1,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x+2,y-2);
Modify_Point(x+2,y+2);
LCD_GRP(chartab4); //取數組數據來繪圖
}
void Draw0(uint8 x,uint8 y)
{
Modify_Point(x,y-1);
Modify_Point(x,y+1);
Modify_Point(x-2,y);
Modify_Point(x-2,y-1);
Modify_Point(x-2,y+1);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y+1);
Modify_Point(x+1,y-1);
Modify_Point(x-1,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x-1,y+1);
LCD_GRP(chartab4);
}
void Draw1(uint8 x,uint8 y)
{ uint8 i;
for(i=1;i<3;i++)
{
Modify_Point(x+i,y);
Modify_Point(x-i,y);
}
Modify_Point(x,y);
LCD_GRP(chartab4);
}
void Draw2(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x+1,y+1);
Modify_Point(x,y+1);
Modify_Point(x,y-1);
Modify_Point(x+2,y);
Modify_Point(x+2,y+1);
Modify_Point(x+2,y-1);
Modify_Point(x-2,y);
Modify_Point(x-2,y+1);
Modify_Point(x-2,y-1);
Modify_Point(x-1,y-1);
LCD_GRP(chartab4);
}
void Draw3(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y+1);
Modify_Point(x,y-1);
Modify_Point(x+2,y);
Modify_Point(x+2,y+1);
Modify_Point(x+2,y-1);
Modify_Point(x-2,y);
Modify_Point(x-2,y+1);
Modify_Point(x-2,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x-1,y+1);
LCD_GRP(chartab4);
}
void Draw4(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y+1);
Modify_Point(x,y-1);
Modify_Point(x,y-2);
Modify_Point(x+1,y-2);
Modify_Point(x+2,y-2);
Modify_Point(x-2,y);
Modify_Point(x+1,y);
Modify_Point(x+2,y);
Modify_Point(x-1,y);
LCD_GRP(chartab4);
}
void Draw5(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y+1);
Modify_Point(x,y-1);
Modify_Point(x+1,y-1);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y);
Modify_Point(x+2,y+1);
Modify_Point(x-1,y+1);
Modify_Point(x-2,y);
Modify_Point(x-2,y);
Modify_Point(x-2,y-1);
Modify_Point(x-2,y+1);
LCD_GRP(chartab4);
}
void Draw6(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y-1);
Modify_Point(x,y+1);
Modify_Point(x-1,y+1);
Modify_Point(x-1,y-1);
Modify_Point(x-2,y);
Modify_Point(x-2,y-1);
Modify_Point(x-2,y+1);
Modify_Point(x+1,y-1);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y+1);
LCD_GRP(chartab4);
}
void Draw7(uint8 x,uint8 y)
{
Modify_Point(x+2,y+1);
Modify_Point(x+1,y+1);
Modify_Point(x,y+1);
Modify_Point(x-1,y+1);
Modify_Point(x-2,y+1);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
LCD_GRP(chartab4);
}
void Draw8(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y-1);
Modify_Point(x,y+1);
Modify_Point(x-2,y);
Modify_Point(x-2,y-1);
Modify_Point(x-2,y+1);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y+1);
Modify_Point(x+1,y-1);
Modify_Point(x-1,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x-1,y+1);
LCD_GRP(chartab4);
}
void Draw9(uint8 x,uint8 y)
{
Modify_Point(x-1,y);
Modify_Point(x-2,y);
Modify_Point(x,y);
Modify_Point(x+1,y);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y-2);
Modify_Point(x+1,y-2);
Modify_Point(x,y-2);
Modify_Point(x,y-1);
LCD_GRP(chartab4);
}
void drawquxian(void)
{ uint8 dangwei;
uint8 x;
uint8 i;
uint8 k=0;
for(i=3;i<127;i++)
{ dangwei=((i-4)%20)/10;
switch(dangwei)
{ case 0:
i=i-20*k;
x=63+13*i/5-(i*i)/10-379/10;
i=i+20*k; //還原i
Modify_Point(x,i);
LCD_GRP(chartab4);
break;
case 1:
i=i-20*k;
x=63+13*i/5-(i*i)/10-379/10;
i=i+20*k; //還原i
Modify_Point(x,i);
LCD_GRP(chartab4);
break;
}
if(i==3+20*(k+1))
{
k++;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -