|
发表于 2021-11-16 22:50:37
|
显示全部楼层
我也是新手,我用汇编语言的风格写的LCD1602程序
可参考如下
使用说明: 数组 unsigned char xdata LCD1602RAM1[2][16] 就是对应LCD1602两行,每行16字, 对这数组某位写入ASCII码就可以在LCD1602对应位上显示出来
LCD_SC1(); 这个函数就是写入需要显示的数据ASCII码,
LCD1602SC(); 这个函数是把数组 unsigned char xdata LCD1602RAM1[2][16] 的数据逐个写入到LCD1602
//-------------------------------------------
#include<stc8g.h>
#include "intrins.h"
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 xdata LCD1602RAM1[2][16]={
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}, //LCD1602的缓存,初始值是空格20H
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}
};
unsigned char bdata LCD1602RAM2; //LCD1602的写入缓冲
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;
void LCD1602ZL(); //LCD1602指令写入函数
void LCD1602SZ(); //LCD1602数据写入函数
void LCD1602CCH(); //LCD1602初始化函数
void LCD1602SC(); //LCD1602全屏写入函数
void LCD_SC1() //全屏数据显示程序 ,需要显示的数据
#define MAIN_Fosc 11059200L //定义主时钟, 自定义变量 ,L是长整型的意思
void main()
{
LCD1602CCH(); //LCD1602初始化
//主函数//********************
while (1) //下面重复循环
{
LCD1602SC(); //LCD1602全屏写入函数
LCD_SC1(); //全屏数据显示程序 ,需要显示的数据
}
}
//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 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 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++;
};
}
void LCD_SC1() //全屏数据显示程序 ,需要显示的数据
{
LCD1602RAM1[0][0] =ON_DAY10+0X30; //开机时的日十位
LCD1602RAM1[0][1] =ON_DAY1+0X30; //开机时的日个位
LCD1602RAM1[0][2] ='/'; //分隔符
LCD1602RAM1[0][3] =ON_HOUR10+0X30; //开机时的时十位
LCD1602RAM1[0][4] =ON_HOUR1+0X30; //开机时的时个位
LCD1602RAM1[0][5] =':'; //分隔符
LCD1602RAM1[0][6] =ON_MIN10+0X30; //开机时的分十位
LCD1602RAM1[0][7] =ON_MIN1+0X30; //开机时的分个位
LCD1602RAM1[0][8] =0x2d; //符号-
LCD1602RAM1[0][9] =0x7e; //符号 >
LCD1602RAM1[0][10] =OFF_HOUR10+0X30; //停机时的时十位
LCD1602RAM1[0][11] =OFF_HOUR1+0X30; //停机时的时个位
LCD1602RAM1[0][12] =':'; //分隔符
LCD1602RAM1[0][13] =OFF_MIN10+0X30; //停机时的分十位
LCD1602RAM1[0][14] =OFF_MIN1+0X30; //停机时的分个位
LCD1602RAM1[0][15] =0X20; //空格
LCD1602RAM1[1][0] =(RUN1_HOUR/1000%10) +0x30; //保养运行时间的小时千位
LCD1602RAM1[1][1] =(RUN1_HOUR/100%10) +0x30; //保养运行时间的小时百位
LCD1602RAM1[1][2] =(RUN1_HOUR/10%10) +0x30; //保养运行时间的小时十位
LCD1602RAM1[1][3] =(RUN1_HOUR%10) +0x30; //保养运行时间的小时个位
LCD1602RAM1[1][4] = ':'; //分隔符
LCD1602RAM1[1][5] = (RUN1_MIN/10%10)+0x30; //运行时间分钟十位
LCD1602RAM1[1][6] = (RUN1_MIN%10)+0x30; //运行时间分钟个位
LCD1602RAM1[1][7] = '&';
LCD1602RAM1[1][8] = '&';
LCD1602RAM1[1][9] =
LCD1602RAM1[1][10] = (EEPROM_RW[19]/100%10) +0x30; //上次当日运行时间小时百位
LCD1602RAM1[1][11] = (EEPROM_RW[19]/10%10) +0x30; //上次当日运行时间小时十位
LCD1602RAM1[1][12] = (EEPROM_RW[19]%10) +0x30; //上次当日运行时间小时个位
LCD1602RAM1[1][13] = ':'; //分隔符
LCD1602RAM1[1][14] =EEPROM_RW[18]/10%10+0x30; //上次当日运行时间分钟个位
LCD1602RAM1[1][15] =EEPROM_RW[18]%10+0x30; //上次当日运行时间分钟十位
}
//下面是延时函数***********************
void Delay60us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 1;
j = 162;
do
{
while (--j);
} while (--i);
}
void delay_ms(unsigned int ms) //延时函数,ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
{
unsigned int i;
do{
i = MAIN_Fosc / 13000;
while(--i) ; //14T per loop
}while(--ms);
}
|
|