功能介绍:
采用51单片机作为主控CPU;LCD12864可显示方波,三角波,锯齿波,正弦波等,可通过光标对波形进行测量,可以调节显示波形的幅度和频率,也可以将波形进行左右拖拉,完美的仿真出一个51单片机示波器,程序采用keil编写,有中文注释,新手容易看懂,仿真采用Proteus,全套仿真资料齐全:文末有资料分享:
227-基于51单片机简易数字示波器Proteus仿真(程序+仿真+全套资料)


程序部分展示,有中文注释,新手容易看懂
sbit pinLCD_CSB = P2^7;
sbit pinLCD_DI = P1^7; // 寄存器操作
sbit pinLCD_RW = P2^4; // 写寄存器操作
sbit pinLCD_E = P2^5;
#define LCD_DataPort P0
#endif
#if 0 //Test
sbit pinLCD_CSA = P2^4;
sbit pinLCD_CSB = P2^3;
sbit pinLCD_DI = P2^2; // 寄存器操作
sbit pinLCD_RW = P2^1; // 写寄存器操作
sbit pinLCD_E = P2^0;
#define LCD_DataPort P1
#endif
#define LCDField_NULL 4
#define c_LCD_MaxColNumber 16
//uchar ucDotData;
//----------------------------------------------------------------------------
// 函 数 名:void LCD_DrvFieldSelect(uchar ucField)
// 用 途:选择液晶的区域,共1#?三个区域
// 入口参数:uchar ucField 第几个区域,区域为 1 、 2 、3 , 三个区域
// 返 回: 无
// ----------------------------------------------------------------------------
void LCD_DrvFieldSelect(uchar ucField)
{
switch(ucField)
{
case 0:
pinLCD_CSA = 0;
pinLCD_CSB = 1;
break;
case 1:
pinLCD_CSA = 1;
pinLCD_CSB = 0;
break;
default:
pinLCD_CSA = 1;
pinLCD_CSB = 1;
break;
}
}
//----------------------------------------------------------------------------
// 函 数 名:void LCD_DrvWriteREG(uchar ucIndicate)
// 用 途:写液晶寄存器
// 入口参数:ucField 寄存器所在的通道
// ucIndicate 指令
// 返 回: 无
//----------------------------------------------------------------------------
void LCD_DrvWriteREG(uchar ucField,uchar ucIndicate)
{
pinLCD_DI = 0; // 寄存器操作
pinLCD_RW = 0; // 写寄存器操作
LCD_DrvFieldSelect(ucField); // 液晶片选
LCD_DataPort = ucIndicate; // 向液晶寄存器写入数据
pinLCD_E = 1;
pinLCD_E = 0;
pinLCD_RW = 1; // 写寄存器操作
pinLCD_DI = 0; // 寄存器操作
LCD_DrvFieldSelect(LCDField_NULL); // 关闭液晶片选
}
//----------------------------------------------------------------------------
// 函 数 名:uchar LCD_DrvReadREG(uchar ucField)
// 用 途:读液晶寄存器
// 入口参数:无
// 返 回: 液晶寄存器中的内容
//----------------------------------------------------------------------------
uchar LCD_DrvReadREG(uchar ucField)
{
uchar ucResult;
pinLCD_E = 0;
pinLCD_DI = 0; // 寄存器操作
pinLCD_RW = 1; // 写寄存器操作
_nop_();
LCD_DrvFieldSelect(ucField); // 液晶片选
LCD_DataPort = 0xFF; // 向液晶寄存器写入数据
pinLCD_E = 1;
pinLCD_E = 0;
ucResult = LCD_DataPort ; // 从液晶寄存器读出数据
LCD_DrvFieldSelect(LCDField_NULL); // 关闭液晶片选
return ucResult;
}
//----------------------------------------------------------------------------
// 函 数 名:void LCD_DrvWriteData(uchar ucData)
// 用 途:向液晶写入数据
// 入口参数:ucField 寄存器所在的通道
// ucData 待写入的数据
// 返 回: 无
//----------------------------------------------------------------------------
void LCD_DrvWriteData(uchar ucField,uchar ucData)
{
pinLCD_DI = 1; // 数据操作
pinLCD_RW = 0;
LCD_DrvFieldSelect(ucField); // 液晶片选
LCD_DataPort = ucData; // 向液晶寄存器写入数据
pinLCD_E = 1;
pinLCD_E = 0;
pinLCD_RW = 1;
pinLCD_DI = 1; // 数据操作
LCD_DrvFieldSelect(LCDField_NULL); // 关闭液晶片选
}


6117

被折叠的 条评论
为什么被折叠?



