|
发表于 2021-9-11 22:34:57
|
显示全部楼层
本帖最后由 广东梁百万 于 2021-9-11 23:03 编辑
下面这个是我年初针对STC8G1K17 SOP-20 + LCD1602写的程序(部分),就是用不是同一组的I/O口拼成一组8位数据口给LCD1602的D0~D7.
重点留意 bdata 这个数据类型 ,跟着把端口P1^2定义成LCD_D0 , 再在程序里对LCD_D0 进行位操作
那位1065307738大神用的 DA=(bit)(Dat&0x01); 进行位操作比我的更简洁,但下面程序的作法是我自己摸索出来的,所以我还是习惯了用我自己的方法:lol:
sbit LCD_D0 = P1^2;
sbit LCD_D1 = P1^3 ;
sbit LCD_D2 = P3^2 ;
sbit LCD_D3 = P3^3 ;
sbit LCD_D4 = P3^4 ;
sbit LCD_D5 = P3^5 ;
sbit LCD_D6 = P3^6 ;
sbit LCD_D7 = P3^7;
sbit LCD_RS = P1^0; //LCD1602 的 RS端 ,1-数据,0-指令
sbit LCD_EN = P1^1 ; //LCD1602 的 E端 ,先从低变高,再变低,以确认输入数据或命令
unsigned char bdata LCD1602RAM2; //LCD1602的写入缓冲 ********* 重点留意 bdata 这个数据类型
sbit LCD1602RAM2_D0= LCD1602RAM2^0;
sbit LCD1602RAM2_D1= LCD1602RAM2^1;
sbit LCD1602RAM2_D2= LCD1602RAM2^2;
sbit LCD1602RAM2_D3= LCD1602RAM2^3;
sbit LCD1602RAM2_D4= LCD1602RAM2^4;
sbit LCD1602RAM2_D5= LCD1602RAM2^5;
sbit LCD1602RAM2_D6= LCD1602RAM2^6;
sbit LCD1602RAM2_D7= LCD1602RAM2^7;
//-----------------------------------------------------------------------
//LCD1602数据写入
void LCD1602SZ()
{
LCD_RS=1;
LCD_EN=1;
LCD_D0=LCD1602RAM2_D0;
LCD_D1=LCD1602RAM2_D1;
LCD_D2=LCD1602RAM2_D2;
LCD_D3=LCD1602RAM2_D3;
LCD_D4=LCD1602RAM2_D4;
LCD_D5=LCD1602RAM2_D5;
LCD_D6=LCD1602RAM2_D6;
LCD_D7=LCD1602RAM2_D7;
LCD_EN=0; //E,下降沿,让LCD读取
Delay60us(); //延时80us
}
//LCD1602指令写入
void LCD1602ZL()
{
LCD_RS=0;
LCD_EN=1;
LCD_D0=LCD1602RAM2_D0;
LCD_D1=LCD1602RAM2_D1;
LCD_D2=LCD1602RAM2_D2;
LCD_D3=LCD1602RAM2_D3;
LCD_D4=LCD1602RAM2_D4;
LCD_D5=LCD1602RAM2_D5;
LCD_D6=LCD1602RAM2_D6;
LCD_D7=LCD1602RAM2_D7;
LCD_EN=0; //E,下降沿,让LCD读取
Delay60us(); //延时80us
}
//LCD1602初始化
void LCD1602CCH()
{
LCD1602RAM2=0;
delay_ms(15); //延时15毫秒
LCD1602RAM2=0x38; //;16行*2,5*8
LCD1602ZL(); //写入指令
delay_ms(5); //延时5毫秒
LCD1602RAM2=0x38; //;16行*2,5*8
LCD1602ZL(); //写入指令
delay_ms(5); //延时5毫秒
LCD1602RAM2=0x08; // 关显示
LCD1602ZL(); //写入指令
delay_ms(1); //延时1毫秒
LCD1602RAM2=0x01; //清屏
LCD1602ZL(); //写入指令
delay_ms(5); //延时5毫秒
LCD1602RAM2=0x06; //;地址计数器AC自动加1,光标右移 *******
delay_ms(1); //延时1毫秒
LCD1602RAM2=0x0C; //开显示
LCD1602ZL(); //写入指令
delay_ms(1); //延时1毫秒
}
// LCD1602全屏显示程序,16字*2行
void LCD1602SC()
{
unsigned char i=16; //每行的个数计数
unsigned char x=0; //行数
unsigned char y=0; //列数
LCD1602RAM2=0x80; //这个是LCD第1行的地址
LCD1602ZL(); //以地址/指令形式发送到LCD1602
while(i--)
{
LCD1602RAM2=LCD1602RAM1[0][y];
LCD1602SZ(); //以数据形式发送到LCD1602
y++;
};
LCD1602RAM2=0xC0; //这个是LCD第2行的地址
LCD1602ZL(); //以地址/指令形式发送到LCD1602
i=16 ; //每行的个数计数
y=0; //每行的个数
while(i--)
{
LCD1602RAM2=LCD1602RAM1[1][y];
LCD1602SZ(); //以数据形式发送到LCD1602
y++;
};
}
|
|