test.c
来自「SMC1602字符液晶的显示程序」· C语言 代码 · 共 240 行
C
240 行
#include"reg51.h"
#define SELECT_LCD() CS0=0; CS1=1; CS2=0
#define SELECT_NONE() CS0=1; CS1=1; CS2=1
sbit CS0 = P2^5 ;
sbit CS1 = P2^6 ;
sbit CS2 = P2^7 ;
sbit Lcd_RW = P2^4 ;
sbit Lcd_RS = P2^3 ;
sbit P11=P1^1;
sbit P10=P1^0;
/******************* 函数声明 ********************/
void LcdWrite(unsigned char value , bit RS);
unsigned char LcdRead(bit RS);
void LcdWriteCmd(unsigned char value , unsigned char attrib);
void LcdWriteData(unsigned char value);
unsigned char LcdReadData();
void delay(unsigned int time);
void LcdInit(void);
void LocateXY(char x , char y);
void PutChar(char x , char y , char value);
void PutStr(char x , char y , char* str);
void display(unsigned char next);
void LcdWrite(unsigned char value , bit RS)
{
/* 1. 设置RS信号线 */
Lcd_RS = RS ;
/* 2. 设置RW信号线为读 */
Lcd_RW = 0 ;
/* 3. 设置LCD片选 */
SELECT_LCD();
/* 4. 通过P0端口写值 */
P0 = value ;
/* 5. 锁存 */
SELECT_NONE();
}
/***************************************
说明: LCD读函数,完成LCD读操作的物理时序
RS: 0 - 写指令
1 - 写数据
return: 读出的具体值
*****************************************/
unsigned char LcdRead(bit RS)
{
unsigned char rt ;
/* 1. 设置RS信号线 */
Lcd_RS = RS ;
/* 2. 设置RW信号线为读 */
Lcd_RW = 1 ;
/* 3. 释放P0口 */
P0 = 0xff ;
/* 4. 设置LCD片选 */
SELECT_LCD();
SELECT_LCD();
SELECT_LCD();
SELECT_LCD();
/* 5. 通过P0端口读值 */
rt = P0 ;
/* 6. 锁存 */
SELECT_NONE();
return rt ;
}
/***************************************
说明: LCD写指令
value: 写的具体值
attrib: 0 - 不检测忙信号
1 - 监测忙信号
*****************************************/
void LcdWriteCmd(unsigned char value , unsigned char attrib)
{
/* 监测忙状态 */
if(attrib)
while( LcdRead(0)&0x80 ) ;
LcdWrite(value , 0);
}
/***************************************
说明: LCD写数据
*****************************************/
void LcdWriteData(unsigned char value)
{
/* 监测忙状态 */
while( LcdRead(0)&0x80 ) ;
LcdWrite(value , 1);
}
/***************************************
说明: LCD读数据
*****************************************/
unsigned char LcdReadData()
{
/* 监测忙状态 */
while( LcdRead(0)&0x80 ) ;
return LcdRead(1);
}
/***************************************
说明: LCD初始化函数,需要按照产品
说明书完成
*****************************************/
void LcdInit(void)
{
delay(800);
/* 写指令0x38连续3次, 不检测忙信号*/
LcdWriteCmd(0x38 , 0 );
delay(10);
LcdWriteCmd(0x38 , 0 );
delay(10);
LcdWriteCmd(0x38 , 0 );
delay(10);
/* 以后的读写操作均要判断忙信号 */
LcdWriteCmd(0x38 , 1 );
/* 先设置关屏 */
LcdWriteCmd(0x08 , 1 );
/* 清屏 */
LcdWriteCmd(0x01 , 1 );
/* 设置光标显示模式 */
LcdWriteCmd(0x06 , 1 );
/* 开屏并显示光标 */
LcdWriteCmd(0x0c , 1 );
}
/***************************************
说明: 设置光标定位
*****************************************/
void LocateXY(char x , char y)
{
unsigned char temp;
temp = x & 0xf;
y &= 0x1;
if ( y )temp |= 0x40;
temp |= 0x80;
LcdWriteCmd(temp,1);
}
/***************************************
说明: 显示字符
x: 横坐标 y: 纵坐标
value: 显示的字符
*****************************************/
void PutChar(char x , char y , char value)
{
LocateXY(x,y);
LcdWriteData(value);
}
/***************************************
说明: 显示字符串
*****************************************/
void PutStr(char x , char y , char* str)
{
unsigned char i,len=0;
/* 计算字符串长度 */
while (str[len] >31)
len++;
/* 显示字符串 */
for (i=0;i<len;i++)
{
PutChar(x++,y,str[i]);
if ( x == 16 )
{
x = 0; y ^= 1;
}
}
}
void display(unsigned char next)
{
unsigned char i;
for(i=0;i<16;i++)
{
PutChar(i,1,next);
next&=0x7f;
if(next<32)next=32;
}
}
void delay(unsigned int time) // time*0.5ms延时
{
unsigned int i,j;
P10=0;
for(j=0;j<time;j++)
{
for(i=0;i<60;i++)
{;}
}
}
void main()
{
char i = 0 ;
unsigned char second=32;
delay(800);
LcdInit();
PutStr(0,0," YE JIAN DONG ");
display(second);
delay(2000);
while(1)
{
second&=0x7f;
if(second<32)second=32;
display(second++);
delay(800);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?