欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機LCD128x64顯示如何用C語言結構體封裝起來?
[打印本頁]
作者:
先來個小目標
時間:
2018-12-7 09:27
標題:
單片機LCD128x64顯示如何用C語言結構體封裝起來?
顯示的程序如何用結構體封裝起來呢?
//==========================================================================
//程序功能: 1Lcd初始化
// 2Lcd清屏
// 3Lcd滿屏
// 4Lcd顯示一行
// 5Lcd畫一個點
// 6lcd指定位置顯示一個字
// 7Lcd指定位置顯示一串漢字
// 8Lcd指定位置寫一串英文字符串,每行最多可寫21個字符
// 9lcd指定位置顯示特定大小的圖片
// 10lcd整屏顯示128x64點陣圖片,要求圖片長128、寬64個像素點
// 11lcd指定位置寫一串英文字符串,每行最多可寫21個字符
//void Disp_Img(unsigned char code *img)
// 程序接口:void Lcd_Init(void);
// void Lcd_Clr(void);
// void Lcd_Full(void);
// void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len);
// void DrawDot_12864(unsigned char y,unsigned char x,unsigned char type);
// void Lcd_WriteChinese(unsigned char x, unsigned char y, unsigned char *img)
// void Lcd_WriteChineseString(unsigned char x, unsigned char y, unsigned char *img, unsigned char len);
// void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
// void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)
// void Disp_Img(unsigned char code *img)/void Lcd_DispFullImg(unsigned char *img)
// void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
// 編寫時間: 2015-07-26
//==========================================================================
/**************************************************************************
1. void Lcd_DispFullImg(unsigned char *img);//顯示一幅全屏圖像,圖像像素點滿足128x64,單位:像素點
2. void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char lon, unsigned char wid, unsigned char *img); //指定位置顯示特定大小的圖片
(2)屏蔽了未使用到的接口函數。
****************************************************************************/
#include "Global.h"
//#include "lcd595.h"
#include "LCD12864.h"
#include "english_8x16_ASCII.h"
#include "intrins.h"
//==========================================================================
// 函數功能: Lcd的接02口信號(邏輯管腳與物理管腳的對應表)
//==========================================================================
sbit LCD_BL = P0^0;
sbit LCD_RST = P0^1;
sbit LCD_CS2 = P0^2;
sbit LCD_CS1 = P0^3;
sbit LCD_E = P0^4;
sbit LCD_RW = P0^5;
sbit LCD_RS = P0^6;
#define LCD_DATA P2
//==========================================================================
// 函數功能: 本地變量及常量的定義
//==========================================================================
#ifdef FREQ_24M
#define NOP Delay_uS(4)
#else
#define NOP Delay_uS(1)
#endif
/*100us延時*/
void delay100us(void) //誤差 -0.234375us
{
unsigned char i;
_nop_();
i = 43;
while (--i);
}
//==========================================================================
// 函數功能: 1微秒延時函數
//==========================================================================
//void Delay_uS(unsigned char us_value)
//{
// unsigned char i;
//
// while(us_value--)
// {
// for(i=0; i<16; i++);
// }
//}
//==========================================================================
// 函數功能: 1毫秒延時函數
//==========================================================================
extern void Delay_mS(unsigned int ms_value)
{
unsigned int k;
#ifdef FREQ_24M
for(k=0; k<(4*ms_value); k++)
#else
for(k=0; k<(ms_value); k++)
#endif
{
Delay_uS(200);
}
}
//==========================================================================
// 函數功能: 檢測是否空閑
//==========================================================================
void BusycChk_12864(void)
{
unsigned int timeout = 0;
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
while((LCD_DATA & 0x80) && ++timeout != 0); //忙狀態檢測, 等待超時時間為60ms
LCD_E = 0;
}
//==========================================================================
// 函數功能: 往12864讀數據
//==========================================================================
unsigned char LCD_RdData(void)
{
unsigned char temp;
BusycChk_12864();
LCD_E = 0;
LCD_DATA = 0xFF; //IO口置高電平, 以便讀引腳
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 1;
NOP; //使能延時, 如果是較快的CPU應該延時久一些
NOP;
NOP;
temp = LCD_DATA ;
return temp;
}
//==========================================================================
// 函數功能: 往12864寫命令
//==========================================================================
void Lcd_WrCmd(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
//lcdhc595(cmd);
LCD_DATA =cmd;
LCD_E = 1;
NOP;
LCD_E = 0;
}
//==========================================================================
// 函數功能: 往12864寫數據
//==========================================================================
void Lcd_WrData(unsigned char wdata)
{
LCD_RS = 1;
LCD_RW = 0;
//lcdhc595(wata);
LCD_DATA=wdata;
LCD_E = 1;
NOP;
LCD_E = 0;
}
//==========================================================================
// 函數功能: 地址轉換
//==========================================================================
void Lcd_Select(unsigned char x, unsigned char y)
{
if( y>=64 )
{
LCD_CS2 = 1; //選中左屏
LCD_CS1 = 0;
}
else
{
LCD_CS1 = 1; //選中右屏
LCD_CS2 = 0;
}
Lcd_WrCmd(0xC0);
Lcd_WrCmd(0x40 + (y&0x3F)); //列地址
Lcd_WrCmd(0xB8 + (x&7)); //行
}
//==========================================================================
// 函數功能: Lcd清屏
// 函數接口: void Lcd_Clr(void);
//==========================================================================
void Lcd_Clr(void)
{
unsigned char i, x=0;
for(x=0; x<8; x++)
{
Lcd_Select(x, 0); //選中左屏
for(i=0; i<64; i++)
{
Lcd_WrData(0);
}
Lcd_Select(x, 64); //選中右屏
for(i=0; i<64; i++)
{
Lcd_WrData(0);
}
}
}
//==========================================================================
// 函數功能: Lcd初始化
// 函數接口: void Lcd_Init(void);
//==========================================================================
void Lcd_Init (void)
{
LCD_BL = 0; //打開背光
LCD_RST = 0;
Delay_mS(100);
LCD_RST = 1;
Delay_mS(1);
LCD_CS1 = 1;
LCD_CS2 = 1;
Lcd_WrCmd(0xC0); //設置顯示起始行
Lcd_WrCmd(0x3F); //顯示打開
Lcd_Clr(); //清屏
}
//==========================================================================
// 函數功能: Lcd滿屏
// 函數接口: void Lcd_Full(void);
//==========================================================================
//void Lcd_Full(void)
//{
// unsigned char i, x=0;
//
// for(x=0; x<8; x++)
// {
// Lcd_Select(x, 0); //選中左屏
// for(i=0; i<64; i++)
// {
// Lcd_WrData(0xFF);
// }
//
// Lcd_Select(x, 64); //選中右屏
// for(i=0; i<64; i++)
// {
// Lcd_WrData(0xFF);
// }
// }
//}
//==========================================================================
// 函數功能: Lcd顯示一行
// 函數接口: void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len);
// 入口參數: unsigned char x, unsigned char y, unsigned char *buf, unsigned char len
// x-顯示行, 0~7(一行寬度為8個點)
// y-顯示起始列, 0~127, 超過列顯示無效
// buf-指向要顯示的數組
// len-要顯示的數據長度
//==========================================================================
/*void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len)
{
x = x&7;
Lcd_Select(x, y);
while(len--)
{
Lcd_WrData(*buf);
buf++;
y++;
if( y == 64 )
{
Lcd_Select(x, y); //選中右屏
}
}
}*/
/*****************************************************************************
* 函數功能: 整屏顯示128x64點陣圖片,要求圖片長128、寬64個像素點
* 函數接口: void Disp_Img(unsigned char code *img)
* 入口參數: unsigned char code *img
* img-指向待顯示的圖片
*****************************************************************************/
void Lcd_DispFullImg(unsigned char *img) //顯示圖片
{
unsigned char i=0,j=0;
for(i=0;i<8;i++)
{
Lcd_Select(i, 0);
for(j=0;j<128;j++)
{
if( j == 64 )
{
Lcd_Select(i, j); //選中右屏
}
Lcd_WrData(*img);
img++;
}
}
}
/*****************************************************************************
* 函數功能:指定位置顯示特定大小的圖片
* 函數接口: void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)
* 入口參數: unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img
* x-顯示起始行, 0~7(一行寬度為8個點)
* y-顯示起始列, 0~127, 超過列顯示無效
* wid-圖片寬度,單位:像素點,最大值64
* lon-圖片長度,單位:像素點,最大值128
* img-指針,指向待顯示的圖片
*****************************************************************************/
void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char *img) //指定位置顯示特定大小的圖片
{
unsigned char i=0,j=0,k;
k=wid/8;//16/8=2
for(i=x;i<(k+x);i++)
{
Lcd_Select(i, y);
for(j=y;j<(lon+y);j++)
{
if( j == 64 )
{
Lcd_Select(i, j); //選中右屏
}
Lcd_WrData(*img);
img++;
}
}
}
/*****************************************************************************
* 函數功能:在x行寫一個字符,輸入列計數初值,返回最終列計數的最后值,
* 該列計數用于確定選中左OR右半屏幕
* 函數接口: unsigned char Lcd_WriteCharData(unsigned char c,unsigned char x, unsigned char lineCount)
* 入口參數: unsigned char c,unsigned char x, unsigned char lineCount
* unsigned char c,要寫入的字符
* unsigned char x,要寫入的行
* unsigned char lineCount,列計數,用于確定選中左或右半屏幕
*****************************************************************************/
void Lcd_WriteEnglish(unsigned char x,unsigned char y, unsigned char c)
{
unsigned char i,line,temp;
c -= 32;
for(i=0;i<2;i++)
{
Lcd_Select(x+i,y);
temp=i<<3;
for(line=0; line<8; line++)
{
if((y+line)==64)
{Lcd_Select(x+i,y+line);}//選中右半屏幕
Lcd_WrData(font8x16[c][line+temp]);//此處的temp用于存放i*8的結果,
}
}
}
/*****************************************************************************
* 函數功能:指定位置寫一串英文字符串,每行最多可寫21個字符
* 函數接口: void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
* 入口參數: unsigned char x,unsigned char y,unsigned char *s
* unsigned char x,行值,取值范圍0~7
* unsigned char y,列值,取值范圍0~127
* unsigned char *s,s指向待寫入的字符串
*****************************************************************************/
void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
{
unsigned char lineCount=0;
while(*s)
{
Lcd_WriteEnglish( x, y+lineCount, *s);
lineCount+=8;//每個英文字符占用8列
s++;
}
}
/*****************************************************************************
* 函數功能:指定位置顯示一串漢字
* 函數接口: void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)
* 入口參數: unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img
* x-顯示起始行, 0~7(一行寬度為8個點)
* y-顯示起始列, 0~127, 超過列顯示無效
* wid-圖片寬度,單位:像素點,最大值64
* lon-圖片長度,單位:像素點,最大值128
* img-指針,指向待顯示的圖片
*****************************************************************************/
void Lcd_WriteChinese(unsigned char x, unsigned char y, unsigned char *img) //顯示1個漢字
{
Lcd_DispImg( x, y, 16, 16, (unsigned char *)img);
}
void Lcd_WriteChineseString(unsigned char x, unsigned char y, unsigned char *img, unsigned char len) //顯示一串漢字
{
unsigned char i;
for(i=0;i<len;i++)
{
Lcd_WriteChinese(x, y, (unsigned char *)img);
y += 16;
img += 32;
}
}
//==========================================================================
// 函數功能: Lcd畫點
// 函數接口: void DrawDot_12864(unsigned char x, unsigned char y, unsigned char type);
// 出口參數: unsigned char x, unsigned char y, unsigned char type
// x-顯示行, 0~63
// y-顯示起始列, 0~127, 超過列顯示無效
//==========================================================================
/*void DrawDot_12864(unsigned char x, unsigned char y, unsigned char type)
{
unsigned char X, Y; //X存儲行地址, Y存儲列地址
unsigned char dat, temp;
if( x >= 0 && x < 64 )
{
X = x/8;
Y = y;
}
Lcd_Select(X, Y); //地址轉換
dat = LCD_RdData(); //假讀
dat = LCD_RdData();
temp = x % 8; //余數為點在字中的位置
switch(type) //畫點類型, 0白, 1黑, 2取反
{
case 0:
dat &= ~(0x01 << temp);; //修改該點同時保持其他位不變
break;
case 1:
dat |= (0x01 << temp); //修改該點同時保持其他位不變
break;
case 2:
dat ^= (0x01 << temp);; //修改該點同時保持其他位不變
break;
default:
break;
}
Lcd_Select(X, Y);
Lcd_WrData(dat); //將字節數據寫回
}*/
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1