單片機源程序如下:
#include "lcd12864.h"
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#if 1 //TX_OSC
sbit pinLCD_CSA = P2^6;
sbit pinLCD_CSB = P2^7;
sbit pinLCD_DI = P1^7; // 寄存器操作
sbit pinLCD_RW = P2^4; // 寫寄存器操作
sbit pinLCD_E = P2^5;
#define LCD_DataPort P0
#endif
#if 0 //Test
sbit pinLCD_CSA = P2^4;
sbit pinLCD_CSB = P2^3;
sbit pinLCD_DI = P2^2; // 寄存器操作
sbit pinLCD_RW = P2^1; // 寫寄存器操作
sbit pinLCD_E = P2^0;
#define LCD_DataPort P1
#endif
#define LCDField_NULL 4
#define c_LCD_MaxColNumber 16
//uchar ucDotData;
//----------------------------------------------------------------------------
// 函 數 名:void LCD_DrvFieldSelect(uchar ucField)
// 用 途:選擇液晶的區域,共1#?三個區域
// 入口參數:uchar ucField 第幾個區域,區域為 1 、 2 、3 , 三個區域
// 返 回: 無
// ----------------------------------------------------------------------------
void LCD_DrvFieldSelect(uchar ucField)
{
switch(ucField)
{
case 0:
pinLCD_CSA = 0;
pinLCD_CSB = 1;
break;
case 1:
pinLCD_CSA = 1;
pinLCD_CSB = 0;
break;
default:
pinLCD_CSA = 1;
pinLCD_CSB = 1;
break;
}
}
//----------------------------------------------------------------------------
// 函 數 名:void LCD_DrvWriteREG(uchar ucIndicate)
// 用 途:寫液晶寄存器
// 入口參數:ucField 寄存器所在的通道
// ucIndicate 指令
// 返 回: 無
//----------------------------------------------------------------------------
void LCD_DrvWriteREG(uchar ucField,uchar ucIndicate)
{
pinLCD_DI = 0; // 寄存器操作
pinLCD_RW = 0; // 寫寄存器操作
LCD_DrvFieldSelect(ucField); // 液晶片選
LCD_DataPort = ucIndicate; // 向液晶寄存器寫入數據
pinLCD_E = 1;
pinLCD_E = 0;
pinLCD_RW = 1; // 寫寄存器操作
pinLCD_DI = 0; // 寄存器操作
LCD_DrvFieldSelect(LCDField_NULL); // 關閉液晶片選
}
//----------------------------------------------------------------------------
// 函 數 名:uchar LCD_DrvReadREG(uchar ucField)
// 用 途:讀液晶寄存器
// 入口參數:無
// 返 回: 液晶寄存器中的內容
//----------------------------------------------------------------------------
uchar LCD_DrvReadREG(uchar ucField)
{
uchar ucResult;
pinLCD_E = 0;
pinLCD_DI = 0; // 寄存器操作
pinLCD_RW = 1; // 寫寄存器操作
_nop_();
LCD_DrvFieldSelect(ucField); // 液晶片選
LCD_DataPort = 0xFF; // 向液晶寄存器寫入數據
pinLCD_E = 1;
pinLCD_E = 0;
ucResult = LCD_DataPort ; // 從液晶寄存器讀出數據
LCD_DrvFieldSelect(LCDField_NULL); // 關閉液晶片選
return ucResult;
}
//----------------------------------------------------------------------------
// 函 數 名:void LCD_DrvWriteData(uchar ucData)
// 用 途:向液晶寫入數據
// 入口參數:ucField 寄存器所在的通道
// ucData 待寫入的數據
// 返 回: 無
//----------------------------------------------------------------------------
void LCD_DrvWriteData(uchar ucField,uchar ucData)
{
pinLCD_DI = 1; // 數據操作
pinLCD_RW = 0;
LCD_DrvFieldSelect(ucField); // 液晶片選
LCD_DataPort = ucData; // 向液晶寄存器寫入數據
pinLCD_E = 1;
pinLCD_E = 0;
pinLCD_RW = 1;
pinLCD_DI = 1; // 數據操作
LCD_DrvFieldSelect(LCDField_NULL); // 關閉液晶片選
}
//----------------------------------------------------------------------------
// 函 數 名:uchar LCD_DrvReadData(unsigned char ucField)
// 用 途:自液晶讀出數據
// 入口參數:ucField 第幾個區域 , 區域為 1 、 2 、3 , 三個區域
// 返 回: 液晶數據的內容
//----------------------------------------------------------------------------
/*
uchar LCD_DrvReadData(uchar ucField)
{
uchar ucResult;
pinLCD_DI = 0; // 數據操作
pinLCD_RW = 0; // 讀數據操作
Delay(10);
LCD_DrvFieldSelect(ucField); // 液晶片選
ucResult = LCD_DataPort; // 向液晶數據寫入數據
Delay(10);
pinLCD_RW = 1;
Delay(10);
LCD_DrvFieldSelect(LCDField_NULL); // 關閉液晶片選
return ucResult;
}
*/
/*
void loop_lcd_is_busy(unsigned char right)
{
unsigned char tmp,counter=0;
do {
if(right) tmp = LCD_RCR;
else tmp = LCD_LCR;
if(counter++>50) break;//超時跳出
}
while ((tmp|0x7f)==0xff);
}
*/
void loop_lcd_is_busy(unsigned char right)
{
unsigned char tmp,counter=0;
do {
tmp = LCD_DrvReadREG(right);
if(counter++>50) break;//超時跳出
}
while ((tmp|0x7f)==0xff);
}
void lcd_cmd_wr(unsigned char cmdcode,unsigned char right)
{
loop_lcd_is_busy(right);
// if(right) LCD_RCW = cmdcode;
// else LCD_LCW = cmdcode;
LCD_DrvWriteREG(right,cmdcode);
}
void lcd_data_wr(unsigned char ldata,unsigned char right)
{
loop_lcd_is_busy(right);
// if(right) LCD_RDW = ldata;
// else LCD_LDW = ldata;
LCD_DrvWriteData(right,ldata);
}
void lcd12864_clr(void)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
lcd_cmd_wr(SETY+i,0);
lcd_cmd_wr(SETX,0);
lcd_cmd_wr(SETY+i,1);
lcd_cmd_wr(SETX,1);
for(j=0;j<64;j++)
{
lcd_data_wr(0,0);
lcd_data_wr(0,1);
}
}
}
void lcd12864_init(void)
{
lcd_cmd_wr(DISPON,0);
lcd_cmd_wr(DISPFIRST,0);
lcd_cmd_wr(SETY,0);
lcd_cmd_wr(SETX,0);
lcd_cmd_wr(DISPON,1);
lcd_cmd_wr(DISPFIRST,1);
lcd_cmd_wr(SETY,1);
lcd_cmd_wr(SETX,1);
lcd12864_clr();
}
/*圖片寫入函數*/
void lcd12864_put_xywhb(unsigned char x,y,w,h,unsigned char *bmp)
{
unsigned char i,j;
h = h/8;
for(i=0;i<h;i++)
{
lcd_cmd_wr(SETY+y+i,0);
lcd_cmd_wr(SETX+x,0);
for(j=0;j<w-64;j++)
lcd_data_wr(bmp[128*i+j],0);
lcd_cmd_wr(SETY+y+i,1);
lcd_cmd_wr(SETX+x,1);
for(j=64;j<w;j++)
lcd_data_wr(bmp[128*i+j],1);
}
}//*
/*8x8點陣asci字符顯示*/
void lcd12864_put_xystr(unsigned char x,y,n,unsigned char *str)
{
unsigned char i;
for(i=0;i<n;i++) {
if((x+i)>63) {
lcd_cmd_wr(SETY+y,1);
lcd_cmd_wr(SETX+x+i-64,1);
lcd_data_wr(str[ i],1);
}
else {
lcd_cmd_wr(SETY+y,0);
lcd_cmd_wr(SETX+x+i,0);
lcd_data_wr(str[ i],0);
}
}
}//*/
/*8x8點陣asci字符顯示*/
void lcd12864_put_clr(unsigned char x,y,n)
{
unsigned char i;
for(i=0;i<n;i++) {
if((x+i)>63) {
lcd_cmd_wr(SETY+y,1);
lcd_cmd_wr(SETX+x+i-64,1);
lcd_data_wr(0,1);
}
else {
lcd_cmd_wr(SETY+y,0);
lcd_cmd_wr(SETX+x+i,0);
lcd_data_wr(0,0);
}
}
}//*/
#ifndef __LCD_12864_H__
#define __LCD_12864_H__
#include <reg52.h>
#include <absacc.h>
#include "Mini51b.h"
/************常用操作命令和參數定義********/
#define DISPON 0x3f //display on
#define DISPOFF 0x3e //display off
#define DISPFIRST 0xc0 //define the first row
#define SETY 0xb8 //define page address
#define SETX 0x40 //define column address
extern void lcd12864_init(void);
/*圖片寫入函數*/
extern void lcd12864_put_xywhb(unsigned char x,y,w,h,unsigned char *bmp);
/*8x8點陣asci字符顯示*/
extern void lcd12864_put_xystr(unsigned char x,y,n,unsigned char *str);
/*指定快清零*/
extern void lcd12864_put_clr(unsigned char x,y,n);
extern void lcd_cmd_wr(unsigned char cmdcode,unsigned char right);
extern void lcd_data_wr(unsigned char ldata,unsigned char right);
extern void lcd12864_clr(void);
#endif
|