共享一個 新唐M051驅動LCd1602液晶屏顯示的程序:
#include "LCD1602.h"
/***************************************************
* 大量宏定義,便于代碼移植和閱讀
***************************************************/
#define LCD1602_LINE1 0
#define LCD1602_LINE2 1
#define LCD1602_LINE1_HEAD 0x80
#define LCD1602_LINE2_HEAD 0xC0
#define LCD1602_DATA_MODE 0x38
#define LCD1602_OPEN_SCREEN 0x0C
#define LCD1602_DISP_ADDRESS 0x80
#define LCD1602_RS_PIN 0
#define LCD1602_RW_PIN 1
#define LCD1602_EN_PIN 2
#define LCD1602_RS(x) {if((x))P0_DOUT|= 1UL<<LCD1602_RS_PIN;else P0_DOUT&=~(1UL<<LCD1602_RS_PIN);}//RS引腳控制
#define LCD1602_RW(x) {if((x))P0_DOUT|= 1UL<<LCD1602_RW_PIN;else P0_DOUT&=~(1UL<<LCD1602_RW_PIN);}//RW引腳控制
#define LCD1602_EN(x) {if((x))P0_DOUT|= 1UL<<LCD1602_EN_PIN;else P0_DOUT&=~(1UL<<LCD1602_EN_PIN);}//EN引腳控制
#define LCD1602_PORT(x) LS164Send((x)) //發送數據
/********************************************
*函數名稱:LCD1602WriteByte
*輸 入:ucByte 要寫入的字節
*輸 出:無
*說 明:LCD1602 寫字節
********************************************/
VOID LCD1602WriteByte(UINT8 ucByte)
{
LCD1602_PORT(ucByte);
LCD1602_RS(HIGH);
LCD1602_RW(LOW);
LCD1602_EN(LOW);
Delayus(5000);
LCD1602_EN(HIGH);
}
/********************************************
*函數名稱:LCD1602WriteCommand
*輸 入:ucCmd 要寫入的命令
*輸 出:無
*說 明:LCD1602 寫命令
********************************************/
VOID LCD1602WriteCommand(UINT8 ucCmd)
{
LCD1602_PORT(ucCmd);
LCD1602_RS(LOW);
LCD1602_RW(LOW);
LCD1602_EN(LOW);
Delayus(5000);
LCD1602_EN(HIGH);
}
/********************************************
*函數名稱:LCD1602SetXY
*輸 入:x 橫坐標 y 縱坐標
*輸 出:無
*說 明:LCD1602 設置坐標
********************************************/
VOID LCD1602SetXY(UINT8 x,UINT8 y)
{
UINT8 address;
if(y == LCD1602_LINE1)
{
address=LCD1602_LINE1_HEAD+x;
}
else
{
address=LCD1602_LINE2_HEAD+x;
}
LCD1602WriteCommand(address);
}
/********************************************
*函數名稱:LCD1602PrintfString
*輸 入:x 橫坐標 y 縱坐標 s字符串
*輸 出:無
*說 明:LCD1602 打印字符串
********************************************/
VOID LCD1602PrintfString(UINT8 x,
UINT8 y,
UINT8 *s)
{
LCD1602SetXY(x,y); //設置顯示坐標
while(s && *s)
{
LCD1602WriteByte(*s); //顯示逐個字符
s++;
}
}
/********************************************
*函數名稱:LCD1602ClearScreen
*輸 入:無
*輸 出:無
*說 明:LCD1602 清屏
********************************************/
VOID LCD1602ClearScreen(VOID)
{
LCD1602WriteCommand(0x01);
Delayus(5000);
}
/********************************************
*函數名稱:LCD1602Init
*輸 入:無
*輸 出:無
*說 明:LCD1602 初始化
********************************************/
VOID LCD1602Init(VOID)
{
P0_PMD &= ~(3UL<<(LCD1602_RS_PIN<<1));
P0_PMD &= ~(3UL<<(LCD1602_RW_PIN <<1));
P0_PMD &= ~(3UL<<(LCD1602_EN_PIN <<1));
P0_PMD |= 1UL<<(LCD1602_RS_PIN<<1);
P0_PMD |= 1UL<<(LCD1602_RW_PIN <<1);
P0_PMD |= 1UL<<(LCD1602_EN_PIN <<1);
LCD1602ClearScreen();
LCD1602WriteCommand(LCD1602_DATA_MODE); //顯示模式設置,設置16x2顯示,5x7點陣,
//8位數據接口
LCD1602WriteCommand(LCD1602_OPEN_SCREEN); //開顯示
LCD1602WriteCommand(LCD1602_DISP_ADDRESS);//起始顯示地址
LCD1602ClearScreen();
}
/****************************************
*函數名稱:main
*輸 入:無
*輸 出:無
*功 能:函數主體
******************************************/
INT32 main(VOID)
{
// Un_Lock_Reg(); //ISP下載時保護FLASH存儲器
PROTECT_REG
(
PWRCON |= XTL12M_EN; //默認時鐘源為外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz時鐘穩定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //設置外部晶振為系統時鐘
LS164Init(); //74LS164初始化
LCD1602Init(); //LCD1602初始化
)
LCD1602PrintfString(0,LCD1602_LINE1,"Hello World!"); //打印第一行
LCD1602PrintfString(0,LCD1602_LINE2,"I Love You!"); //打印第二行
while(1);
}