1、单片机 C 语言_1602 液晶显示器上显示 24c02 储存数据/*包含的头文件*/#include#include #define uchar unsigned char#define uint unsigned int/*定义 LCD 端口*/* LCD 的 RS,RW,EN 分别是 P2.6、P2.5、P2.7 端口 */* P0.0-P0.7 端口接 LCD 的数据端口 D0-D7 */* 24c02 的 sda 端和 scl 端分别接 P2.0 和 P2.1*/* 24c02 的 VCC 端接+5V,GND,A0,A1,A2,WP 都接 GND */*/sbit LCD_RS =
2、P26; sbit LCD_RW = P25; sbit LCD_EN = P27;sbit sda=P20;sbit scl=P21;/*/* */* 延时子程序 */* */*/#define delayNOP(); _nop_();_nop_();_nop_();_nop_();void delay2() ; void delay(uchar x) uchar j;while(x-)!=0) for(j=0;j0;a-)for(b=100;b0;b-);/*/* */* 存储芯片 24c02 设置 */* */*/void start() /开始信号sda=1;delay2();scl=
3、1;delay2();sda=0;delay2();void stop() /停止信号sda=0;delay2();scl=1;delay2();sda=1;delay2();void respons() /应答信号uchar i;scl=1;delay2();while(sda=1) /sda 为 1 则应答或 250 个机器周期后默认为应答scl=0;delay2();void init() /24c02 初始化sda=1;delay2();scl=1;delay2();void write_byte(uchar date) /写入 1 byte 数据uchar i,temp;temp=d
4、ate;for(i=0;i8;i+)temp=temp1;scl=0;delay2();sda=CY;delay2();scl=1;delay2();scl=0;delay2();sda=1;delay2();uchar read_byte() /读出 1 byte 数据uchar i,k;scl=0;delay2();sda=1;delay2();for(i=0;i8;i+)scl=1;delay2();k=(k1)|sda;scl=0;delay2();return k;/*在地址 address 处写入数据date*/void write_add(uchar address,uchar
5、date)start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();/*读出 24c02 的地址 address 处的数据*/uchar read_add(uchar address)uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();ret
6、urn date;/*/* */* LCD1602 设置 */* */*/*/*检查 LCD 忙状态 */*lcd_busy 为 1 时,忙,等待。lcd-busy 为 0 时,闲,可写指令与数据 */*/ bit lcd_busy() bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0LCD_EN = 0;return(result); /*/*写指令数据到 LCD */*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */*/void lcd_wcmd(uchar cmd) while(lc
7、d_busy();LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_(); P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0; /*/*写显示数据到 LCD */*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */*/void lcd_wdat(uchar dat) while(lcd_busy();LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0; /*/* LCD 初
8、始化设定 */*/void lcd_init() delay(15); lcd_wcmd(0x38); /16*2 显示,5*7 点阵,8 位数据delay(5);lcd_wcmd(0x38); /重复 delay(5);lcd_wcmd(0x38); /再重复 delay(5);lcd_wcmd(0x0c); /显示开,关光标delay(5);lcd_wcmd(0x06); /移动光标delay(5);lcd_wcmd(0x01); /清除 LCD 的显示内容delay(5);/*/* 写入字符函数 LCD_write_char(x,y,dat) */* 将字符“dat”写入 LCD 的第(
9、x+1)行第(y+1)位 */* 设定第 1 行显示位置:数据指针=80+地址变量 */* 设定第 2 行显示位置:数据指针=c0+地址变量 */*/void LCD_write_char(unsigned char x,unsigned char y,unsigned char dat)if(x=0)lcd_wcmd(0x80+y);elselcd_wcmd(0xc0+y);lcd_wdat(dat);/*/* 写入字符函数 LCD_write_string(x,y,*s) */* 将字符串“*s”写入 LCD 的第(x+1)行第(y+1)位 */*/ /*void LCD_write_st
10、ring(unsigned char x,unsigned char y,unsigned char *s)while(*s)LCD_write_char(x,y,*s);s+; y+;/*/* */* 主程序 */* 将数列 numb 显示在 LCD 上 */* */*/ void main()uchar numb6=3,4,5,6,7,8;/也可以改成其他数字uchar m;uchar temp6;init(); /24c02 初始化lcd_init(); /LCD 初始化for(m=0;m6;m+)write_add(23+m,numbm);delay1(100); /延时,保证芯片的反应时间,可以改短一些for(m=0;m6;m+)tempm=read_add(23+m);delay1(100);LCD_write_char(0,m,tempm+0); /+0表示让LCD 显示 ASCII codewhile(1); / 程序终止,LCD 始终显示 numb