?? pwmdac.c
字號:
//=======================1602常用指令集============================
// LcdWriteCommand(0x01); //清顯示
// LcdWriteCommand(0x02); //光標復位
// LcdWriteCommand(0x0E); //光標開顯示,不閃爍.
// LcdWriteCommand(0x0F); //光標開顯示,并閃爍.
// LcdWriteCommand(0x10); //光標左移一個位置.
// LcdWriteCommand(0x14); //光標右移一個位置.
// LcdWriteCommand(0x18); //字符和光標一起左移一個位置
// LcdWriteCommand(0x1c); //字符和光標一起右移一個位置
// LcdWriteCommand(0x0c); // 顯示開及關光標顯示
//=============================================================================
//================= LCM1602A端口地址定義 =======================
//#define RS 0x00000400 // P0.10引腳控制,低電平點亮
//#define RW 0x00000800 // P0.11引腳控制,低電平點亮
//#define E 0x00001000 // P0.12引腳控制,低電平點亮
//#define Lcd1602Port 0x00003c00 //
#include "lcd1602.h"
#include"chengnong.h"
#define Lcd1602_E 0x00001000
#define Lcd1602Cmd 0x00001000 //E=1 RS=0 RW=0 向lcd1602寫入指令,
#define Lcd1602Wdata 0x00001400 //E =1 RS=1 RW=0 向lcd1602寫入數據,
//#define Lcd1602Cmd 0x00000c00 //E=1 RS=0 RW=0 向lcd1602寫入指令,現已經取反
//#define Lcd1602Wdata 0x00000400 //E =1 RS=1 RW=0 向lcd1602寫入數據,現已經取反
//#define Lcd1602Status 0x00001400 //E=1 RS=0 RW=1 讀取lcd1602狀態,現已經取反
/****************************************************************************
* 名稱:DelayNS()
* 功能:長軟件延時
* 入口參數:dly 延時參數,值越大,延時越久
* 出口參數:無
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
/****************************************************************************
* 名稱:HC595_SendDat()
* 功能:向74HC595發送一字節數據
* 入口參數:dat 要發送的數據
* 出口參數:無
* 說明:發送數據時,高位先發送。
****************************************************************************/
void HC595_SendDat(uint8 dat)
{ uint8 i;
IOCLR = SPI_CS; // SPI_CS = 0
for(i=0; i<8; i++) // 發送8位數據
{ IOCLR = SPI_CLK; // SPI_CLK = 0
/* 設置SPI的DATA輸出值 */
if( (dat&0x80)!=0 ) IOSET = SPI_DATA;
else IOCLR = SPI_DATA;
dat <<= 1;
IOSET = SPI_CLK; // SPI_CLK = 1
}
IOSET = SPI_CS; // SPI_CS = 1,輸出顯示數據
}
//==============================================================
// 液晶寫使能函數,使能位E由高到低電平1602才寫入數據
//==============================================================
void Lcd_En_write(void)
{
IOSET = Lcd1602_E;
IOSET = Lcd1602_E;
IOSET = Lcd1602_E;
IOSET = Lcd1602_E;
IOSET = Lcd1602_E;
IOSET = Lcd1602_E;
IOCLR = Lcd1602_E;
IOCLR = Lcd1602_E;
IOCLR = Lcd1602_E;
IOCLR = Lcd1602_E;
IOCLR = Lcd1602_E;
IOCLR = Lcd1602_E;
}
//=======================================================
// 寫顯示數據函數
//=======================================================
void LcdWriteData( uint8 dataW )
{
IOCLR = Lcd1602Port;
IOSET = Lcd1602Wdata; //E =1 RS=1 RW=0 向lcd1602寫入數據
HC595_SendDat(dataW);
Lcd_En_write(); //寫使能
}
//=======================================================
// 寫控制字函數
//=======================================================
void LcdWriteCommand( uint8 CMD )
{
IOCLR = Lcd1602Port;
IOSET = Lcd1602Cmd; //E =1 RS=1 RW=0 向lcd1602寫入數據
HC595_SendDat(CMD);
Lcd_En_write(); //寫使能
}
//=======================================================
// 顯示光標定位
//=======================================================
void LocateXY( int8 posx,int8 posy)// posy只能取1,2
{
uint8 temp;
temp = posx & 0x0f;//posx與上00001111
if(posy == 1) //顯示在第一行
{
temp |= 0x80;
}
else if(posy == 2) //顯示在第二行
{
temp |= 0xC0; // 相當于 temp |= 0x40; temp |= 0x80;
}
LcdWriteCommand(temp);
}
//=======================================================
// 按指定位置顯示數出一個字符
//=======================================================
void DisplayOneChar(uint8 x,uint8 y,uint8 Wdata)
{
LocateXY( x, y );//定位顯示地址
DelayMs(5); //**************要注意延時*************
LcdWriteData( Wdata );//寫字符
}
//=======================================================
// 顯示字符串
//=======================================================
void ePutstr(uint8 x,uint8 y, uint8 *ptr)
{
uint8 i,l=0;
while (ptr[l]>31)
{
l++;
};
for(i=0;i<l;i++)
{
DisplayOneChar(x++,y,ptr[i]);
DelayMs(5); //要延時
if( x == 16 )
{
x = 0;
y ^= 1;
}
}
}
//=======================================================
// 顯示無符號整數
//=======================================================
void ePutUint(uint8 x,uint8 y, uint32 z)
{uint8 i;
while(z)
{i=z%10;
z=z/10;
DisplayOneChar(x--,y,i+0x30);
DelayNS(5); //要延時,否則會反向顯示
}
}
//=======================================================
// 初始化程序, 必須按照產品資料介紹的初始化過程進行
//=======================================================
void LcdReset( void )
{
LcdWriteCommand( 0x38); // 顯示模式設置(不檢測忙信號)
DelayNS(5);
LcdWriteCommand( 0x38); // 共三次
DelayNS(5);
LcdWriteCommand( 0x38);
DelayNS(5);
LcdWriteCommand( 0x38); // 顯示模式設置(以后均檢測忙信號)
DelayNS(5); //要延時,否則會不顯示
LcdWriteCommand( 0x08); // 顯示關閉
DelayNS(5); //要延時,否則會不顯示
LcdWriteCommand( 0x01); // 顯示清屏
DelayNS(5); //要延時,否則會不顯示
LcdWriteCommand( 0x06); // 顯示光標移動設置
DelayNS(5); //要延時,否則會不顯示
LcdWriteCommand( 0x0c); // 顯示開及光標設置
}
/****************************************************************************
* 名稱:main()
* 功能:控制LED數碼管顯示,并控制LED1、LED2、LED3、LED4顯示。
****************************************************************************/
int main(void)
{
PINSEL0 = 0x00080008; // 設置PWM6連接到P0.9管腳,置PWM3連接到P0.1管腳,其余所有管腳連接GPIO
PINSEL1 = 0x00000000;
//IODIR = SPI_IOCON|CarDirection; // 設置SPI控制口,車方向控制接口
IODIR = SPI_IOCON|Lcd1602Port; // 設置SPI控制口,液晶1602控制口為輸出
//**********************************************************************
// TargetInit(); //PWM初始化, 定時器0初始化(target.c文件)
//**********************************************************************
//**********************************************************************
LcdReset( ); //1602初始化
//**********************************************************************
DelayNS(50);
DisplayOneChar(6,2,'m');
DelayNS(5);
DisplayOneChar(6,2,'a');
DelayNS(5);
DisplayOneChar(6,2,'t');
DelayNS(5);
DisplayOneChar(6,2,'o');
DelayNS(5);
DisplayOneChar(6,2,'u');
DelayNS(5);
// ePutstr(5,1, "12345");
//ePutUint(5,1, 12345);
//IOCLR = Lcd1602Port;
//IOSET = 0x30000000; //E =1 RS=1 RW=0 向lcd1602寫入數據
while(1)
{
/*HC595_SendDat(DISP_TAB[Speed]); //用于指示作用
SpeedTest();
Carmode();*/
}
return(0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -