📄 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 + -