📄 x5045.c
字号:
#include <INTRINS.H>
#include <AT89x51.H>
#define uchar unsigned char
#define unint unsigned int
//*************************************************
uchar idata uestc[]={ 0X55,0X45,0X53,0X54,0X43,0X20,0x20,0X39,0X38,0X31,
0X34,0X31,0Xb0,0x32,0x20,0x20,0x20,0x00};//UESTC__98141-2
uchar idata gongjun[]={ 0X67,0X6f,0X6e,0X67,0X20,0X6a,0x75,0X6e,0X20,
0X47,0X6f,0X6f,0X64,0x21,0x20,0x20,0x20,0x00};//gong_jun_Good!
//*************************************************
bdata uchar Bcc; //定义一个可位寻址的全局变量
sbit a0=Bcc^0; sbit a1=Bcc^1; sbit a2=Bcc^2; sbit a3=Bcc^3;
sbit a4=Bcc^4; sbit a5=Bcc^5; sbit a6=Bcc^6; sbit a7=Bcc^7;
//*************************************************
sbit cs=P2^5; sbit so=P3^4; sbit si=P3^3; sbit sck=P3^2;
//*************************************************
void delay (uchar t) {uchar s;while (t--){ //延时子程序
for (s=0xff;s>0;s--){_nop_();_nop_();} cs=0;cs=1;}} //让看门狗复位
//*************************************************
//en-p27 rs-p24 rw-p23 D0--D7<-->P0--P7 定义液晶的引脚
sbit en=P2^7; sbit rs=P2^4; sbit rw=P2^3;
//*************************************************
void wait(void){ en=0; rs=0; rw=1; //读忙标志,忙则继续等待
do {en=0;en=1;_nop_();Bcc=P0;en=0;} while(a7==1); }
//*************************************************
void command(uchar a){ //向液晶里写入指令、控制字
en=0;rs=0;rw=0;en=1;P0=a;_nop_();en=0;wait();}
//*************************************************
void reset(void){ //液晶模块软件复位
en=0;rs=0;rw=0;en=1;P0=0x38;_nop_();en=0;delay(0x04);
en=0;rs=0;rw=0;en=1;P0=0x38;_nop_();en=0;delay(0x02);command(0x38);}
//置功能 (8位总线宽度、双行显示、5X7点阵显示)
//*************************************************
void lcdstart(void){ //液晶模块初始化
reset(); //液晶模块软件复位
command(0x38); //置功能 (总线宽度、单/双行显示、5X7或5X10显示)
command(0x06); //置输入模式(地址计数器自加减、画面左右移动)
command(0x0c); //显示、光标、光标闪烁的开关
command(0x01);} //清屏幕的显示
//*************************************************
// command(0x02); //光标复位,返回到地址00H处
// command(0x14); //光标或字符左右移位显示
// command(0x40); //置字符发生存储器地址
// command(0x80); //置数据存储器地址
//*************************************************
//void mov(void){ uchar x; for (x=0;x<0xff;x++){
//s command(0x18); delay(0xa0);} }//光标或字符移位
//*************************************************
void display(s) uchar idata *s; //向指定的显示存储器地址写入待显示的字符串
{uchar i=0;while (s[i]!=0x00){en=0;rs=1;rw=0; //写数据方式
en=1;P0=s[i];en=0;wait();i++;_nop_();} } //输出数据
//*************************************************
void word_w(uchar s){ //向指定的显示存储器地址写入待显示的单个字符
en=0;rs=1;rw=0;en=1;P0=s;en=0;wait();} //写数据方式输出数据
//*************************************************
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//*************************************************
void SPI_O(uchar dd){ Bcc=dd;sck=0; //SPI串行总线输出(以MCU为中心)
si=a7;sck=1;_nop_();sck=0;
si=a6;sck=1;_nop_();sck=0;
si=a5;sck=1;_nop_();sck=0;
si=a4;sck=1;_nop_();sck=0;
si=a3;sck=1;_nop_();sck=0;
si=a2;sck=1;_nop_();sck=0;
si=a1;sck=1;_nop_();sck=0;
si=a0;sck=1;_nop_();sck=0;}
//*************************************************
void SPI_I(void){ so=1; //SPI串行总线输入(以MCU为中心)
sck=1;a7=so;sck=0;_nop_();
sck=1;a6=so;sck=0;_nop_();
sck=1;a5=so;sck=0;_nop_();
sck=1;a4=so;sck=0;_nop_();
sck=1;a3=so;sck=0;_nop_();
sck=1;a2=so;sck=0;_nop_();
sck=1;a1=so;sck=0;_nop_();
sck=1;a0=so;sck=0;}
//*************************************************
uchar rdsr(void){uchar a; //读状态寄存器
so=1;sck=0;cs=0;SPI_O(0x05);SPI_I();cs=1;a=Bcc;return(a);}
//*************************************************
void busy(void){ do {Bcc=rdsr();} while(a0);} //读忙信号,等待写周期结束
//*************************************************
void wren(void){ so=1;sck=0;cs=0;SPI_O(0x06);cs=1;}//写使能
//*************************************************
void wrdi(void){ so=1;sck=0;cs=0;SPI_O(0x04);cs=1;}//写禁止
//*************************************************
void wrsr(uchar a){ wren();so=1;sck=0;cs=0;SPI_O(1);SPI_O(a);cs=1;busy();}//写状态寄存器
//*************************************************
uchar read_b(unint a){ so=1;sck=0;cs=0;//读出指定地址的一个字节
if (a>0x00ff) SPI_O(0x0b);else SPI_O(0x03);a=(uchar)a;
SPI_O(a);SPI_I();cs=1;a=Bcc;return(a);}
//*************************************************
void write_b(unint a,uchar b){ wren();so=1;sck=0;cs=0; //写一个字节到指定地址
if (a>0x00ff) SPI_O(0x0a);else SPI_O(0x02);a=(uchar)a;
SPI_O(a);SPI_O(b);cs=1;busy();}
//*************************************************
void write_l(unint a,s) uchar idata *s;
{uchar i=0;wren();so=1;sck=0;cs=0; //写一个字符串到指定地址
if (a>0x00ff) SPI_O(0x0a);else SPI_O(0x02);a=(uchar)a; //输出高位地址
SPI_O(a);for (i=0;i<0x0f;i++){SPI_O(s[i]);}cs=1;busy();}//输出数据
//*************************************************
main(){ uchar a,b;unint c; lcdstart(); //液晶模块初始化
wrdi();wren();rdsr();wrsr(0x10); //EEPROM块不保护、看门狗周期600ms
a=0x41;for (c=0x0000;c<0x000f;c++){write_b(c,a);a++;}//写看门狗的EEPROM
a=0x61;for (c=0x01f0;c<0x01ff;c++){write_b(c,a);a++;}//写看门狗的EEPROM
c=0x0100;write_l(c,gongjun); //写16个字符到看门狗的EEPROM
while(1){ command(0x01); //清屏幕的显示
command(0x80);display(uestc); //从液晶第一行开头显示UESTC 98141-2
command(0xc0);display(gongjun); //从液晶第二行开头显示gong jun Good!
delay(0xff);delay(0xff);delay(0xff);delay(0xff);delay(0xff);
command(0x80);a=0x30;for(b=0;b<16;b++){word_w(a);a++;_nop_();}//1
command(0xc0);a=0x20;for(b=0;b<16;b++){word_w(a);a++;_nop_();}//!
delay(0xff);delay(0xff);delay(0xff);delay(0xff);delay(0xff);
command(0x01); command(0x80); //清屏幕的显示
for (c=0x0000;c<0x0010;c++){ a=read_b(c);word_w(a);_nop_();}
command(0xc0);for (c=0x01f0;c<0x0200;c++){ a=read_b(c);word_w(a);_nop_();}
//读看门狗的EEPROM并显示在液晶模块上面
delay(0xff);delay(0xff);delay(0xff);delay(0xff);delay(0xff);
command(0x01); command(0x80); //清屏幕的显示
for (c=0x0100;c<0x0110;c++){ a=read_b(c);word_w(a);_nop_();}
//读看门狗的EEPROM并显示在液晶模块上面
delay(0xff);delay(0xff);delay(0xff);delay(0xff);delay(0xff);
} }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -