久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
帶漢字庫128x64液晶串行方式C51驅(qū)動程序及LCD.h頭文件下載
[打印本頁]
作者:
niuniu
時(shí)間:
2015-3-25 00:49
標(biāo)題:
帶漢字庫128x64液晶串行方式C51驅(qū)動程序及LCD.h頭文件下載
//******************************************************************************
// 用于河北北方學(xué)院宣化教學(xué)部2005級單片機(jī)課程實(shí)驗(yàn)的
// 128x64點(diǎn)陣帶漢字庫串行接口液晶顯示器C51驅(qū)動代碼
//
// 代碼沿革
// 創(chuàng)建: 2015年4月1日,
// 修改: 2015年4月4日,代碼優(yōu)化
// 2015年4月9日,注釋
// 2015年4月13日,修改一處錯(cuò)誤,LCD_Write(...)函數(shù)中有一處需要加一點(diǎn)延時(shí)
// 版權(quán)聲明
// 1.版權(quán)擁有者是河北北方學(xué)院宣化教學(xué)部2005級單片機(jī)課程全體學(xué)生及該課程任課
// 教師.
// 2.任何團(tuán)體或個(gè)人均可無條件使用本代碼, 但版權(quán)擁有者不對由此引起的任何直接
// 或間接后果負(fù)擔(dān)任何法律責(zé)任
// 3.一旦部分或全部使用本代碼,則必須在源程序文檔中無條件包含本版權(quán)聲明
//******************************************************************************
#include "LCD.h"
#include "reg52.h"
//******************************************************************************
// LCD復(fù)位函數(shù):LCD_Reset(void)
//******************************************************************************
void LCD_Reset(void)
{
uint ns=1000;
LCD_CS = 1;
LCD_CLK = 1;
LCD_RST = 0;
while(ns--);
LCD_RST = 1; ns=1000,while(ns--);
LCD_CS = 1; }
//******************************************************************************
// LCD寫字節(jié)函數(shù):LCD_Write(char inst, uchar x)
// 入口參數(shù) inst=1/0: 命令/數(shù)據(jù)標(biāo)志
// x : 命令/數(shù)據(jù)字節(jié)
//******************************************************************************
void LCD_Write(char inst, uchar x)
{
uchar i;
long int q;
if(!inst) q = 0x00fa0000; //數(shù)據(jù):0000 0000 1111 1010 0000 0000 0000 0000
else q = 0x00f80000; //命令:0000 0000 1111 1000 0000 0000 0000 0000
q += (((x)&0xf0)<<8) + ((x<<4)&0xf0);//0000 0000 1111 10?0 hofx 0000 lofx 0000
q <<= 8; //1111 10?0 hofx 0000 lofx 0000 0000 0000
LCD_CS = 1; //選中LCD模塊
for(i=0;i<24;i++) //串行傳送24個(gè)二進(jìn)制位
{ //從最高位開始傳送
if(q & 0x80000000) LCD_SID = 1; //最高位為1時(shí)
else LCD_SID = 0; //最高位為0時(shí)
LCD_CLK = 0; //拉低CLK引腳,準(zhǔn)備產(chǎn)生上升沿
LCD_CLK = 1; //拉高CLK引腳,產(chǎn)生一個(gè)上升沿,最高位被傳送到LCD模塊中
LCD_CLK = 1; //延長CLK高電平持續(xù)時(shí)間,不這樣搞一下,就不行,大家注意了!
LCD_CLK = 1; //進(jìn)一步延長CLK高電平持續(xù)時(shí)間,更保險(xiǎn)了
q <<= 1; //左移一位,準(zhǔn)備下一個(gè)待傳送的位 }
LCD_CS = 0; //撤消LCD模塊選中,防止干擾
}
//******************************************************************************
// LCD清除屏幕函數(shù):ClearScreen(void)
//******************************************************************************
void ClearScreen(void)
{
LCD_Write(1, 0x01);
}
//******************************************************************************
// LCD打開顯示函數(shù):DisplayOn(void)
//******************************************************************************
void DisplayOn(void)
{
LCD_Write(1, 0x0c);
}
//******************************************************************************
// LCD字符串顯示函數(shù):Disp_Str(uchar x, uchar y, char *str)
// 入口參數(shù) x: 字符串起始顯示位置的x坐標(biāo)
// y: 字符串起始顯示位置的y坐標(biāo)
// str: 指向待顯示字符串的字符指針,字符串以'\0'結(jié)尾
//
// 關(guān)于行定義的特別說明:
// 按照數(shù)據(jù)手冊介紹,本LCD模塊的行由上到下依次為0,1,2,3行,但對應(yīng)的行顯示緩沖區(qū)地
// 址不是按行序排列的,其中
// 0行的顯示緩沖區(qū)為:80H~87H
// 2行的顯示緩沖區(qū)為:88H~8FH
// 1行的顯示緩沖區(qū)為:90H~87H
// 3行的顯示緩沖區(qū)為:98H~9FH
// 從視覺觀看的角度說, 自上而下的行順序依次為0,1,2,3行
// 從顯示緩沖區(qū)地址連續(xù)的角度說,自上而下的行順序依次為0,2,1,3行
// 考慮到顯示字符串的長度是不定的,可能出現(xiàn)換行,程序中對此必須加以考慮調(diào)整
//
// 關(guān)于顯示起始位置的說明:漢字顯示時(shí), 顯示位置x坐標(biāo)為0~7,顯示西文字符時(shí)顯示位置
// x坐標(biāo)也是0~7,但每個(gè)顯示位置可以顯示兩個(gè)西文字符,當(dāng)中西文混合顯示時(shí), 注意西文
// 子串應(yīng)包含偶數(shù)個(gè)西文字符.
//******************************************************************************
void Disp_Str(uchar x, uchar y, char *str)
{
uchar addr, i = 0;
if(x>7) x = 7;
if(y>3) y = 3;
switch(y) //根據(jù)x,y坐標(biāo)確定顯示緩沖區(qū)地址
{
case 0: addr = 0x80 + x; break;
case 1: addr = 0x90 + x; break;
case 2: addr = 0x88 + x; break;
case 3: addr = 0x98 + x; break;
}
LCD_Write(1, addr); //設(shè)置DDRAM地址
while(*str)
{ //下一行:從設(shè)置好的DDRAM地址開始寫字符并準(zhǔn)備好指向下一個(gè)字符的指針
LCD_Write(0, *str++);
i++;
if(i==2)
{
i = 0;
addr++; //每寫倆字節(jié)DDRAM地址會自動增量,跟蹤DDRAM的地址變化,以便換行調(diào)整
if( (addr&0x07) == 0 ) //當(dāng)addr=88H,90H,98H,a0H時(shí),說明DRAM地址需要重新指定
{
switch(addr)
{
case 0x88: addr = 0x90; break;
case 0x98: addr = 0x88; break;
case 0x90: addr = 0x98; break;
case 0xa0: addr = 0x80; break;
}
LCD_Write(1, addr); //設(shè)置被重新指定了的DDRAM地址
}
}
}
}
//******************************************************************************
// LCD十進(jìn)制整數(shù)顯示函數(shù):Disp_Digital_Str(uchar x, uchar y, uint val,uchar len)
// 入口參數(shù) x: 顯示位置x坐標(biāo)
// y: 顯示位置y坐標(biāo)
// val: 待顯示的整數(shù)
// len: 顯示位數(shù)
//******************************************************************************
void Disp_Digital_Str(uchar x, uchar y, uint val, uchar len)
{
char i, temp[11];
if( len > 10 ) len = 10;
if(len == 0) len = 1;
temp[10] = 0;
for(i=0; i<10; i++)
{
temp[9-i] = (val%10) + '0';
val /= 10;
}
Disp_Str(x, y, &temp[10-len]);
}
//******************************************************************************
// LCD十進(jìn)制小數(shù)顯示函數(shù):
// Disp_Digital_Str_Dec(uchar x, uchar y, uint val, uchar len, uchar dotpos)
// 入口參數(shù) x: 顯示位置x坐標(biāo)
// y: 顯示位置y坐標(biāo)
// val: 待顯示的數(shù)
// len: 顯示位數(shù),包括小數(shù)點(diǎn)
// dotpos: 小數(shù)點(diǎn)位置
//******************************************************************************
void Disp_Digital_Str_Dec(uchar x, uchar y, uint val, uchar len, uchar dotpos)
{
char i, temp[12];
if(len > 10) len = 10;
if(len < 1) len = 1;
if(dotpos > (len-1)) dotpos = len-1;
temp[11] = 0;
for(i=0; i<11; i++)
{
if(i == dotpos) temp[10-i] ='.'; else
{
if(i < dotpos) temp[10-i] = (val%10) + '0'; else
temp[10-i] = (val%10) + '0';
val /= 10;
}
}
Disp_Str(x, y, &temp[10-len]);
}
//******************************************************************************
// LCD十六進(jìn)制長整數(shù)顯示函數(shù):Disp_Hex_StrL(uchar x,uchar y, ulong val,uchar len)
// 入口參數(shù) x: 顯示位置x坐標(biāo)
// y: 顯示位置y坐標(biāo)
// val: 待顯示的數(shù)
// len: 顯示位數(shù)
//******************************************************************************
void Disp_Hex_StrL(uchar x, uchar y, ulong val, uchar len)
{
char i, temp[9];
if(len > 8) len = 8;
if(len == 0) len = 1;
temp[len] = 0;
for(i=0; i<len; i++)
{
temp[len-1-i] = (val&0x0f);
if( (temp[len-1-i]) < 0x0a ) temp[len-1-i] += 0x30;
else temp[len-1-i] += 0x37;
val >>= 4;
}
Disp_Str(x, y, temp);
}
//******************************************************************************
// LCD十六進(jìn)制整數(shù)顯示函數(shù):Disp_Hex_StrI(uchar x, uchar y, uint val, uchar len)
// 入口參數(shù) x: 顯示位置x坐標(biāo)
// y: 顯示位置y坐標(biāo)
// val: 待顯示的數(shù)
// len: 顯示位數(shù)
//******************************************************************************
void Disp_Hex_StrI(uchar x, uchar y, uint val, uchar len)
{
char i, temp[5];
if(len > 4) len = 4;
if(len == 0) len = 1;
temp[len] = 0;
for(i=0; i<4; i++)
{
temp[len-1-i] = (val&0x0f);
val >>= 4;
if( (temp[len-1-i]) < 0x0a ) temp[len-1-i] += 0x30;
else temp[len-1-i] += 0x37;
}
Disp_Str(x, y, temp);
}
//******************************************************************************
// LCD十六進(jìn)制短整數(shù)顯示函數(shù):Disp_Hex_StrC(uchar x,uchar y, uint val,uchar len)
// 入口參數(shù) x: 顯示位置x坐標(biāo)
// y: 顯示位置y坐標(biāo)
// val: 待顯示的數(shù)
// len: 顯示位數(shù)
//******************************************************************************
void Disp_Hex_StrC(uchar x, uchar y, uchar val, uchar len)
{
char i, temp[3];
if(len > 2) len = 2;
if(len == 0) len = 1;
temp[2] = 0;
for(i=0; i<2; i++)
{
temp[len-1-i] = (val&0x0f);
val >>= 4;
if( (temp[len-1-i]) < 0x0a ) temp[len-1-i] += 0x30;
else temp[len-1-i] += 0x37;
}
Disp_Str(x, y, temp);
}
//******************************************************************************
// 字符串中填十進(jìn)制數(shù)函數(shù):
// Fill_Dec_Str(char * str,int v,unsigned char len,unsigned char pos, char sig)
// 入口參數(shù)str: 原始字符串
// v: 待填的數(shù)
// len: 數(shù)的位數(shù)
// pos: 填的位置
// sig: 符號位0+/1-
//******************************************************************************
void Fill_Dec_Str(char * str,int v,unsigned char len,unsigned char pos,char sig)
{
char i;
int x = 1;
if(sig)
{
if(v>=0) str[pos]='+';
else { str[pos]='-'; v = -v;}
pos++; len--;
}
for(i=1; i<len; i++)
x = (x<<3) + (x<<1);
for(i=pos; i<pos+len; i++)
{
str[ i]=v/x + '0';
v %= x;
x /= 10;
}
}
//******************************************************************************
// LCD初始化函數(shù):LCD_Init()
//******************************************************************************
void LCD_Init()
{
LCD_Reset(); //LED顯示器復(fù)位
DisplayOn();
}
作者:
niuniu
時(shí)間:
2015-3-25 00:50
LCD.H頭文件下載:(復(fù)制下列代表后用記事本保存為lcd.h即可)
#ifndef LCD_H
#define LCD_H
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
//*******************************LCD控制引腳定義********************************
sbit LCD_RST = P2^4; // LCD復(fù)位
sbit LCD_CLK = P2^5; //LCD串行時(shí)鐘
sbit LCD_SID = P2^6; //LCD串行數(shù)據(jù)
sbit LCD_CS = P2^7; // LCD片選
//*****************************LCD.C中公用函數(shù)聲明******************************
void ClearScreen(void);
void DisplayOn(void);
void Disp_Str(uchar x, uchar y, char *str);
void Disp_Digital_Str(uchar x, uchar y, uint val, uchar len);
void Disp_Digital_Str_Dec(uchar x, uchar y, uint val, uchar len, uchar dotpos);
void Disp_Hex_StrL(uchar x, uchar y, ulong val, uchar len);
void Disp_Hex_StrI(uchar x, uchar y, uint val, uchar len);
void Disp_Hex_StrC(uchar x, uchar y, uchar val, uchar len);
void Fill_Dec_Str(char* str,int v,unsigned char len,unsigned char pos,char sig);
void LCD_Init(void);
#endif
復(fù)制代碼
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品亚洲一区二区
|
亚洲一区二区三区久久久
|
亚洲乱码一区二区三区在线观看
|
黄色大全免费看
|
中文字幕亚洲一区
|
中文在线日韩
|
91网站在线观看视频
|
成人在线视频观看
|
www国产亚洲精品
|
a级毛片国产
|
国产在线观看一区二区三区
|
中文字幕成人av
|
亚洲电影专区
|
中文字幕国产视频
|
91成人在线视频
|
亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月
|
日韩精品一区二区三区
|
狠狠躁18三区二区一区
|
国产精品久久久久久一区二区三区
|
亚洲成人999
|
免费午夜电影
|
欧美一级精品片在线看
|
av首页在线
|
精品中文在线
|
欧美色综合
|
亚洲精品68久久久一区
|
精品1区2区3区4区
|
久久精品综合
|
五月激情婷婷六月
|
国产欧美在线
|
国产精品免费av
|
一区二区三区四区日韩
|
久久i
|
精品一区二区久久久久久久网站
|
特级毛片爽www免费版
|
天天影视色综合
|
91九色porny首页最多播放
|
欧美一级在线
|
九九久视频
|
亚洲高清在线观看
|
一区二区不卡视频
|