?? lcd_1602_driver._c
字號:
#include <iom8v.h>
#include <macros.h>
#include "discharge.h"
#include "LCD_1602.h"
unsigned char lcd_data[32];//32字節顯存,記錄LCD上顯示的數據
unsigned char data[32];//32字節緩存,保存將要寫入LCD的數據
unsigned char add;//顯存地址標號
unsigned char new=32;//顯存標號
unsigned int num=0;
/**********************************************************
TC1602B LCD DISPLAY
建立時間:2005年12月12號
修改日期:2005年12月12號
LCD_write函數功能:當command=0時,向LCD寫入數據,否則向LCD寫
入命令
LCD第一行顯示寄存器地址:0X80-0X8F
LCD第二行顯示寄存器地址:0XC0-0XCF
**********************************************************/
void LCD_init(void)
{
LCD_EN_DDR|=LCD_EN;//設定該引腳方向為輸出
LCD_RS_DDR|=LCD_RS;//設定該引腳方向為輸出
LCD_D4_DDR|=LCD_D4;//設定數據口為輸出
LCD_D5_DDR|=LCD_D5;//設定數據口為輸出
LCD_D6_DDR|=LCD_D6;//設定數據口為輸出
LCD_D7_DDR|=LCD_D7;//設定數據口為輸出
LCD_EN_PORT&=~LCD_EN;//EN設為低電平
LCD_RS_PORT&=~LCD_RS;//RS設為低電平
LCD_D4_PORT&=~LCD_D4;//數據口置低電平
LCD_D5_PORT&=~LCD_D5;//數據口置低電平
LCD_D6_PORT&=~LCD_D6;//數據口置低電平
LCD_D7_PORT&=~LCD_D7;//數據口置低電平
LCD_write_char(0,0x33); //4bit test
delay_nms(25);
LCD_write_char(0,0x32);
delay_nms(15);
LCD_write_char(0,0x28);
delay_nms(15);
LCD_write_char(0,0x0C); //顯示開
delay_nms(15);
LCD_write_char(0,0x01); //顯示清屏
delay_nms(15);
LCD_write_char(0,0x06); //顯示光標移動設置
LCD_clear();
//LCD_init_CGRAM();
}
/*-----------------------------------------------------------------------
LCD_write_char : 寫一個字節到LCD的函數
編寫日期 :2005-12-12
最后修改日期 :2005-12-12
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned command,unsigned data)
{
if (command == 0)
LCD_RS_PORT &= ~LCD_RS; //RS=0 寫地址
else
LCD_RS_PORT |= LCD_RS; //RS=1 寫數據
LCD_write_DATA_PORT(data);//寫高4位
LCD_write_DATA_PORT(data<<4);//寫低4位
delay_nus(250);
num++;//統計向LCD發送的字節數
}
/*-----------------------------------------------------------------------
LCD_write_DATA_PORT : 寫數據到LCD數據口函數
輸入參數data :要寫入的數據(僅高4位)
編寫日期 :2005-12-12
最后修改日期 :2005-12-12
-----------------------------------------------------------------------*/
void LCD_write_DATA_PORT(unsigned char data)
{
if((data>>4)%2)
LCD_D4_PORT |=LCD_D4;
else
LCD_D4_PORT &=~LCD_D4;
if((data>>5)%2)
LCD_D5_PORT |=LCD_D5;
else
LCD_D5_PORT &=~LCD_D5;
if((data>>6)%2)
LCD_D6_PORT |=LCD_D6;
else
LCD_D6_PORT &=~LCD_D6;
if((data>>7)%2)
LCD_D7_PORT |=LCD_D7;
else
LCD_D7_PORT &=~LCD_D7;
LCD_EN_PORT |= LCD_EN; //EN端產生一個由低電平變高電平,寫LCD
delay_nus(25);
LCD_EN_PORT &= ~LCD_EN; //EN端產生一個由高電平變低電平,寫LCD
delay_nus(25);
}
/*-----------------------------------------------------------------------
LCD_clear : 清除屏幕的函數
輸入參數 :無
編寫日期 :2005/10/18
說明 : lcd_data[]也會被清0
-----------------------------------------------------------------------*/
void LCD_clear(void)
{
unsigned char i;
LCD_write_char(0,0x01);//顯示清屏
for(i=0;i<32;i++)
{
lcd_data[i]=0;
}
delay_nus(500);
}
/*-----------------------------------------------------------------------
LCD_check : 統計發送數據到LCD次數的函數
輸入參數 :x,y 顯示結果的座標
編寫日期 :2005/10/18
說明 :如果每秒調用一次,就是統計每秒的次數
-----------------------------------------------------------------------
void LCD_check(unsigned char x,unsigned char y) //檢測每秒鐘寫LCD
//次數的函數
{
unsigned char i;
unsigned char lcd[2]={0};
add=y*16+x;//設置起始座標
lcd[0]=num/10+48;
lcd[1]=num%10+48;
num=0;
for (i=0;i<2;i++)
{
if(lcd_data[add]==lcd[i]){}
else
{data[add]=lcd[i];}
add++;
}
LCD_updata;
}*/
/*-----------------------------------------------------------------------
LCD_write_string : 英文字符串顯示函數
輸入參數:*s :英文字符串指針;
X、Y : 顯示字符串的位置
e : 把從最后一個字符到x=e之間的內容刪除
編寫日期 :2005/10/18
-----------------------------------------------------------------------*/
void LCD_write_string(unsigned char x,unsigned char y, const unsigned char *s,unsigned char e)
{
if(y<2)
add=y*16+x;//設置起始座標
while (*s)
{
if(lcd_data[add]==*s)//如果LCD上顯示的數和
{} //待寫入的數相同的話
else{data[add]=*s;}//要顯示的數據存入顯存
s ++;//指針加1
add++;//顯存地址加1
}
if(y==1)
e+=16;
for(;e>=add;add++)
{data[add]=' ';}
LCD_updata;
}
/*-----------------------------------------------------------------------
LCD_write_number : 數字顯示函數
輸入參數:
X、Y : 顯示字符串的位置
d :在第d位插入小數點
data :要顯示的數據 長整形
*s :數據的單位
e : 把從最后一個字符到x=e之間的內容刪除
編寫日期 :2005/10/18
-----------------------------------------------------------------------*/
void LCD_write_number(unsigned char x,unsigned char y,unsigned char d,unsigned long dat,const unsigned char *s,unsigned char e)
{
unsigned char i;
unsigned char b=0;
unsigned char c='.';
unsigned char lcd[10]={0};
if(y<2)//如果Y>1則不重新計算地址
add=y*16+x;//設置起始座標
for (i=10;i>0;i--)
{
lcd[i]=dat%10+48;
dat=dat/10;
}
for(i=1;i<11;i++)
{
if(i==11-d)
{
if(lcd_data[add]==c)
{}
else
{data[add]=c;}
add++;
}
if((lcd[i]-48+b)==0)
{
if(i>=(10-d))
{
if(lcd_data[add]==lcd[i])
{}
else
{data[add]=lcd[i];}
add++;
}
else
{}
}
else
{
if(lcd_data[add]==lcd[i])
{}
else
{data[add]=lcd[i];}
add++;
b=1;
}
}
while (*s)
{
if(lcd_data[add]==*s)//如果LCD上顯示的數和
{} //待寫入的數相同的話
else{data[add]=*s;}//要顯示的數據存入顯存
s ++;//指針加1
add++;//顯存地址加1
}
if(y==1)
e+=16;
for(;e>=add;add++)
{data[add]=' ';}
LCD_updata;
}
void LCD_writenumber(unsigned char x,unsigned char y,unsigned char d,unsigned long dat,const unsigned char *s,unsigned char e)
{
unsigned char i;
unsigned char b=0;
unsigned char c='.';
unsigned char lcd[10]={0};
if(y<2)//如果Y>1則不重新計算地址
add=y*16+x;//設置起始座標
for (i=10;i>0;i--)
{
lcd[i]=dat%10+48;
dat=dat/10;
}
for(i=1;i<11;i++)
{
if(i==11-d)
{
if(lcd_data[add]==c)
{}
else
{data[add]=c;}
add++;
}
if((lcd[i]-48+b)==0)
{
if(i>=(10-d))
{
if(lcd_data[add]==lcd[i])
{}
else
{data[add]=lcd[i];}
add++;
}
else
{}
}
else
{
if(lcd_data[add]==lcd[i])
{}
else
{data[add]=lcd[i];}
add++;
b=1;
}
}
while (*s)
{
if(lcd_data[add]==*s)//如果LCD上顯示的數和
{} //待寫入的數相同的話
else{data[add]=*s;}//要顯示的數據存入顯存
s ++;//指針加1
add++;//顯存地址加1
}
if(y==1)
e+=16;
for(;e>=add;add++)
{data[add]=' ';}
LCD_updata;
}
/*-----------------------------------------------------------------------
LCD_write_time : 數字顯示函數
輸入參數:
X、Y : 顯示數據的起始的位置
h,m,s :時,分,秒
編寫日期 :2005-10-19
-----------------------------------------------------------------------*/
void LCD_write_time(unsigned char x,unsigned char y,unsigned char h,unsigned char m,unsigned char s,unsigned char z)
{
unsigned char i;
unsigned char lcd[8]={0};
if(y<2)
add=y*16+x;//設置起始座標LCD_set_xy( X, Y );
lcd[0]=h/10+48;
lcd[1]=h%10+48;
lcd[2]=':';
lcd[3]=m/10+48;
lcd[4]=m%10+48;
lcd[5]=':';
lcd[6]=s/10+48;
lcd[7]=s%10+48;
if(z==5){if(lcd[7]%2)
lcd[2]=':';
else
lcd[2]=' ';}
for (i=0;i<z;i++)
{
if(lcd_data[add]==lcd[i])
{}
else
{data[add]=lcd[i];}
add++;
}
LCD_updata;
}
/*----------------------------------------------------
LCD_write_new:寫顯存函數
data[]:32字節的顯存
new:顯存標號
編寫日期:2005/10/18
-----------------------------------------------------*/
void LCD_write_new(void)
{
unsigned char address;
unsigned char new_add=1;//1表示要更新地址
while(new<32)//顯存共32個字節,標號從0--31
{
if(new==16)//換行
new_add=1;
if(data[new])//跳過為0的顯存
{
if(new_add)//當new_add=0時表示無需更新地址
{
if(new>15)
address=0xb0+new;
else
address=0x80+new;
LCD_write_char(0,address);//設置起始地址
}
LCD_write_char(1,data[new]);//寫數據
lcd_data[new]=data[new];
data[new]=0;//寫完數據后,顯存清0
new_add=0;
}
else
new_add=1;
new++;//
}
}
/*----------------------------------------------------
LCD_write_CGRAM:寫CGRAM的函數
輸入參數:
X、Y : 顯示數據的起始的位置
n : 存入LCD的圖案的編號
編寫日期:2005/10/18
-----------------------------------------------------*/
/*
void LCD_write_CGRAM(unsigned char x,unsigned char y,unsigned char n)
{
if(y<2)
add=y*16+x;//設置起始座標
if(n==0)//0表示空數據
n+=8;//所以要加上8 (0>8/1>9/2>10...7>15)
data[add]=n;
LCD_updata;
}*/
/*----------------------------------------------------
LCD_init_CGRAM:初始化CGRAM的函數
編寫日期:2005/10/18
-----------------------------------------------------*/
/*
void LCD_init_CGRAM(void)
{
unsigned char CGRAM[8][8]=//CGRAM圖案的定義
{ //1 2 3 4 5 6 7 x
{0x3F,0x01,0x01,0x01,0x01,0x01,0x3F,0x00},//0
{0x00,0x04,0x02,0x1F,0x02,0x04,0x00,0x00},//1
{0x00,0x04,0x0E,0x15,0x04,0x04,0x04,0x00},//2
{0x00,0x1F,0x15,0x0E,0x04,0x04,0x04,0x00},//3
{0x00,0x1F,0x15,0x0A,0x04,0x04,0x04,0x00},//4
{0x00,0x00,0x02,0x06,0x0E,0x1E,0x1E,0x00},//5
{0x08,0x0C,0x0A,0x09,0x0A,0x0C,0x08,0x00},//6
{0x08,0x0C,0x0E,0x0F,0x0E,0x0C,0x08,0x00},//7
};
unsigned char ads=0x40;
unsigned char x,y;
LCD_write_char(0,ads);//寫地址
for(y=0;y<8;y++)
{
for(x=0;x<8;x++)
{
LCD_write_char(1,CGRAM[y][x]);
}
}
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -