/**************************************
*液晶控制函數(shù)
***************************************/
#include<reg52.H>
#include<intrins.h>
typedefunsigned char BYTE;
typedefbit BOOL;
sbitLCD_RS = P2^5;
sbitLCD_RW = P2^6;
sbitLCD_EP = P2^7;
/*******************************************
*函數(shù)名稱:delay1() 延時函數(shù)
*函數(shù)作用:延時 t ms
*********************************************/
voidDelay_ms(int ms)
{
int i,j;
for (i=ms;i>0; i--)
for (j=110; j>0; j--);
}
voidDelay_us(int ms)
{
int i;
for (i=ms;i>0; i--);
}
/*******************************************
*函數(shù)名稱:lcd_bz() 液晶忙信號檢測
*函數(shù)作用:讀取液晶是否處于忙狀態(tài)
*********************************************/
BOOLlcd_bz()
{ //測試LCD忙碌狀態(tài)
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1; //E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令
Delay_us(4);
result = (BOOL)(P0 & 0x80);//高電平表示忙狀態(tài)
LCD_EP = 0;
return result;
}
/*******************************************
*函數(shù)名稱:lcd_wcmd() 液晶寫指令字函數(shù)
*函數(shù)作用:向液晶寫控制指令字
*********************************************/
voidlcd_wcmd(BYTE cmd)// 寫入指令數(shù)據(jù)到LCD
{
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
Delay_us(2);
P0 = cmd; //此處要模仿時序狀態(tài)
Delay_us(4);
LCD_EP = 1;//高電平到低電平轉(zhuǎn)變時開始寫入數(shù)據(jù)
Delay_us(4);
LCD_EP = 0;
}
/*******************************************
*函數(shù)名稱:lcd_pos() 液晶數(shù)據(jù)地址函數(shù)
*函數(shù)作用:確定寫入液晶的數(shù)據(jù)的地址
*********************************************/
voidlcd_pos(BYTE pos)
{
lcd_wcmd(pos | 0x80); //設(shè)定顯示位置
}
/*******************************************
*函數(shù)名稱:lcd_wdat() 液晶寫數(shù)據(jù)函數(shù)
*函數(shù)作用:向液晶中寫入數(shù)據(jù)
*********************************************/
void lcd_wdat(BYTE dat)
{ //寫入字符顯示數(shù)據(jù)到LCD
while(lcd_bz());
LCD_RS = 1; //寫數(shù)據(jù)到ddram
LCD_RW = 0;
LCD_EP = 0;
P0 = dat; //要送的數(shù)據(jù)
Delay_us(4);
LCD_EP = 1; //執(zhí)行
Delay_us(4);
LCD_EP = 0;
}
/*******************************************
*函數(shù)名稱:lcd_init() 液晶初始化配置函數(shù)
*函數(shù)作用:配置液晶的工作狀態(tài)
*********************************************/
voidlcd_init()
{ //LCD初始化設(shè)定,命令字
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數(shù)據(jù)
Delay_ms(1);
lcd_wcmd(0x0c); //顯示開,關(guān)光標(biāo)
Delay_ms(1);
lcd_wcmd(0x06); //移動光標(biāo)
Delay_ms(1);
lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
Delay_ms(100);
}
voidlcd_str(unsigned char* dis,unsigned char N,unsigned char t,unsigned char st)
{
unsigned char i=0;
for(i=0;i<N;i++)
{
lcd_pos(64*t+i+st);
lcd_wdat(*(dis+i));
Delay_ms(1);
}
}
voidlcd_string(bit bRow, unsigned char btColumn, unsigned char *pData)
{
while (*pData != '\0')
{
if (bRow)
{
lcd_wcmd(0xc0 + btColumn);//顯示在第1行
}
else
{
lcd_wcmd(0x80 + btColumn); //顯示在第0行
}
lcd_wdat(*(pData++)); //要顯示的數(shù)據(jù)
btColumn++; //列數(shù)加一
Delay_ms(1);
}
}
voiddelay1(int );
voidlcd_wcmd(unsigned char );
voidlcd_pos(unsigned char );
voidlcd_wdat(unsigned char );
voidlcd_init();
voidlcd_str(unsigned char* dis,unsigned char N,unsigned char t,unsigned char st);
voidDelay_ms(int ms);
voidlcd_string(bit bRow, unsigned char btColumn, unsigned char *pData);
/****************************************************************
#include<reg52.h>
#include"lcd.h"
#defineuint unsigned int
#defineuchar unsigned char
/******數(shù)模轉(zhuǎn)換器接口定義********/
sbitclk=P3^1;
sbitcs=P3^0;
sbitdin=P3^2;
// 粗調(diào)參數(shù)
uintcode vol[10]={0,145,250,315,365,430,465,492,508,549};//
// 細(xì)調(diào)參數(shù)
uintcode small_vol[52]={0,30,56,95,120,145,168,183,203,230,250,270,288,300,307,
315,325,335,349,359,365,385,400,410,423,430,438,443,449,452,465,468,472,476,486,492,
495,498,501,504,508,516,524,532,540,549};//
sbitadd=P1^0; // 增加按鍵
sbitsub=P1^1; // 減小按鍵
sbitk0=P1^2; // 模式按鍵
unsignedint vol_n=0; //對應(yīng)數(shù)組中的位置
unsignedchar mode=0; //模式變量
voiddelay();
voidDAconver(uint DAValue); //數(shù)模轉(zhuǎn)換器
/******************************************************
函數(shù)名稱:delayms
輸入?yún)?shù):t
函數(shù)說明:延時t毫秒
*******************************************************/
voiddelayms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++);
}
/******************************************************
函數(shù)名稱:scan
輸入?yún)?shù):無
函數(shù)說明:鍵盤掃描函數(shù)
*******************************************************/
voidscan()
{
uint t=0;
if(k0==0) //模式切換鍵按下
{
delayms(20);
if(k0==0)
{
if(mode==0)
{
mode=1;
lcd_pos(15);
lcd_wdat('B'); // 模式字符
}
else
{
mode=0;
lcd_pos(15);
lcd_wdat('A');
}
vol_n=0;//
delayms(800);
}
}
if(add==0) //增加按鍵按下
{
delayms(20);
if(add==0)
{
if(mode==0) //粗調(diào)模式,總共有10種情況
{
if(vol_n<9) vol_n=vol_n+1;
}
else //細(xì)調(diào)模式
{
if(vol_n<45) vol_n=vol_n+1;
}
}
delayms(800);
}
else if(sub==0)
{
delayms(20);
if(sub==0)
{
if(vol_n>0)vol_n=vol_n-1;
}
delayms(800);
} //顯示的功能
if(mode==0)
{
t=50+vol_n*50;
}
else
{
t=50+10*vol_n;
}
lcd_pos(4);
lcd_wdat(t/100+48);
lcd_pos(5);
lcd_wdat('.');
lcd_pos(6);
lcd_wdat(t%100/10+48);
lcd_pos(7);
lcd_wdat(t%10+48);
lcd_pos(8);
lcd_wdat('V');
}
/******************************************************
函數(shù)名稱:main
輸入?yún)?shù):無
函數(shù)說明:系統(tǒng)主函數(shù)
*******************************************************/
voidmain()
{vol_n=0; lcd_init(); // 液晶初始化
lcd_string(0,4,"Welcome");
lcd_string(1,0,"fengzhengliang");
delayms(2000);
lcd_wcmd(0x01);
delayms(100);
lcd_string(0,0,"VPP:0.5V");
lcd_pos(15);
lcd_wdat('A');
while(1)
{
scan();
if(mode==0)
{
DAconver(vol[vol_n]);
}
else
{
DAconver(small_vol[vol_n]); //不斷地輸出數(shù)據(jù)
}
delayms(500);
}
}
/******************************************************
函數(shù)名稱:delay
輸入?yún)?shù):無
函數(shù)說明:延時10us左右
*******************************************************/
voiddelay()
{
char i = 5;
while(i--);
}
/******************************************************
函數(shù)名稱:DAconver
輸入?yún)?shù):無
函數(shù)說明:這個是用了12個時鐘的驅(qū)動,根據(jù)PDF的數(shù)據(jù)格式,十位數(shù)據(jù)在12位的前面,后面兩位沒有用,所以要先把16位數(shù)據(jù)DAValue先左移6位,使到剩下的十位是有效數(shù)據(jù)
*******************************************************/
voidDAconver(uint DAValue)
{
uchar i;
DAValue <<= 6;
cs = 0;
clk = 0;
for(i = 0; i < 12; i++) //內(nèi)輸入的是10位DA數(shù)據(jù),后兩個時鐘周期為填充字節(jié)
{
din = (bit)(DAValue &0x8000);
clk = 1;
DAValue <<= 1;
clk = 0;
}
cs = 1; // CS的上升沿和下降沿只有在CLK為低的時候才有效
clk = 0;
}
|