#include "derivative.h" /* derivative-specific definitions */
#include "LCD.h"
unsigned char adress_table[]= //定義液晶點陣的坐標
{
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行漢字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行漢字位置
0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, //第三行漢字位置
0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F //第四行漢字位置
};
/*************************************************************/
/* 初始化液晶接口 */
/*************************************************************/
void INIT_PORT(void)
{
PSB_dir = 1;
RS_dir = 1;
RW_dir = 1;
EN_dir = 1;
DATA_dir = 0xff;
DATA = 0;
PSB = 1;
EN = 0;
RW = 0;
RS = 0;
}
/*************************************************************/
/* 向液晶發送數據 */
/*************************************************************/
void write_Data(unsigned char b)
{
RS = 1;
RW = 0;
EN = 1;
somenop();
DATA = b;
somenop();
EN = 0;
}
/*************************************************************/
/* 向液晶發送命令 */
/*************************************************************/
void write_command(unsigned char b)
{
RS = 0;
RW = 0;
EN = 1;
somenop();
DATA = b;
somenop();
EN = 0;
}
/*************************************************************/
/* 延時函數1 */
/*************************************************************/
void delay20us(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
{
TFLG1_C0F = 1; //清除標志位
TC0 = TCNT + 5; //設置輸出比較時間為20us
while(TFLG1_C0F == 0); //等待,直到發生輸出比較事件
}
}
/*************************************************************/
/* 延時函數2 */
/*************************************************************/
void delay1ms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
{
TFLG1_C0F = 1; //清除標志位
TC0 = TCNT + 250; //設置輸出比較時間為1ms
while(TFLG1_C0F == 0); //等待,直到發生輸出比較事件
}
}
/***************************************************************************/
/* 清屏子程序 */
/***************************************************************************/
void lcd_clear(void)
{
write_command(0x30);//0011,0000 功能設置,一次送8位數據,基本指令集
delay20us(4); //延時80us
write_command(0x03);//AC歸0,不改變DDRAM內容
delay1ms(5); //延時5ms
write_command(0x01);//0000,0001 清DDRAM
delay1ms(5); //延時5ms
write_command(0x06);//寫入時,游標右移動
delay20us(4); //延時80us
write_command(0x0C);//0000,1100 整體顯示,游標off,游標位置off
delay20us(4); //延時80us
}
/***************************************************************************/
/* 向LCD發送字符串 */
/***************************************************************************/
void lcd_string(unsigned char row,unsigned char col,char *data1) //row為寫入數據所在的行數,col為寫入數據所在的列數,*data1為寫入的數據
{
for(;row<4&&(*data1)!=0;row++)
{
for(;col<8&&(*data1)!=0;col++)
{
write_command(adress_table[row*8+col]);
delay20us(4); //延時80us
write_Data(*data1++);
delay20us(4); //延時80us
write_Data(*data1++);
delay20us(4); //延時80us
}
col=0;
}
}
|