1、公交车 lcd显示/* 描述: * 12864标准字库液晶演示 数据 p0,控制 p2 */#include #include #define uchar unsigned char#define uint unsigned int/* 12864LCD引脚定义 */#define LCD_data P0 /数据口sbit LCD_RS = P26; /寄存器选择输入 sbit LCD_RW = P25; /液晶读/写控制sbit LCD_EN = P27; /液晶使能控制sbit LCD_PSB = P32; /串/并方式控制sbit LCD_RST = P37; /液晶复位端口sbit s
2、1=P30;sbit s2=P31;sbit s3=P33;int s1num=0,i;#define delayNOP(); _nop_();_nop_();_nop_();_nop_();/*/uchar code DIS1 = “东圃客运站“;uchar code DIS2 = “羊城花园“;uchar code DIS3 = “东圃镇 “;uchar code DIS4 = “车陂“;uchar code DIS5=“棠东“;uchar code DIS6=“棠下“;uchar code DIS7=“学院“;uchar code DIS8=“上社“;uchar code DIS9=“华
3、景新城“;uchar code DIS10=“师大暨大“;uchar code DIS11=“岗顶“;uchar code DIS12=“石牌桥“;uchar code DIS13=“终点站“;uchar code DIS14=“车转弯,请坐好附稳“;uchar code DIS15=“请你为有需要的乘客让座,谢谢合作“;/*/*/*/* */* 延时函数 */* */*/void delay(int ms)while(ms-)uchar i;for(i=0;i150;i+) _nop_(); _nop_();_nop_();_nop_();/*/* */* 延时函数 */* */*/void
4、 delay1(int ms)while(ms-)uchar y;for(y=0;y100;y+) ; /*/* */*检查 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
5、lcd_wcmd(uchar cmd) while(lcd_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 =
6、 1;delayNOP();LCD_EN = 0; /*/* */* LCD初始化设定 */* */*/void lcd_init() LCD_PSB = 1; /并口方式LCD_RST = 0; /液晶复位delay(3); LCD_RST = 1; delay(3);lcd_wcmd(0x34); /扩充指令操作delay(5);lcd_wcmd(0x30); /基本指令操作delay(5);lcd_wcmd(0x0C); /显示开,关光标delay(5);lcd_wcmd(0x01); /清除 LCD的显示内容delay(5);/*/* */* 设定显示位置 */* */*/void l
7、cd_pos(uchar X,uchar Y) uchar pos;if (X=1)X=0x80;else if (X=2)X=0x90;else if (X=3)X=0x88;else if (X=4)X=0x98;pos = X+Y ; lcd_wcmd(pos); /显示地址/* * 闪烁函数 * */void lcdflag() lcd_wcmd(0x08); delay(400);lcd_wcmd(0x0c); delay(400);lcd_wcmd(0x08); delay(400);lcd_wcmd(0x0c); delay(400);lcd_wcmd(0x08); delay(
8、200); lcd_wcmd(0x0c); delay(5);lcd_wcmd(0x01); delay(5);/* * 清屏函数 * */void clr_screen()lcd_wcmd(0x34); /扩充指令操作delay(5); lcd_wcmd(0x30); /基本指令操作delay(5); lcd_wcmd(0x01); /清屏 delay(5); /*; 显示字符表代码*/void bytecode()uchar s;clr_screen(); /清屏 lcd_wcmd(0x80); /设置显示位置为第一行 for(s=0;s16;s+)lcd_wdat(0x30+s); lc
9、d_wcmd(0x90); /设置显示位置为第二行 for(s=0;s16;s+)lcd_wdat(0x40+s); lcd_wcmd(0x88); /设置显示位置为第三行 for(s=0;s16;s+)lcd_wdat(0x50+s); lcd_wcmd(0x98); /设置显示位置为第四行 for(s=0;s16;s+)lcd_wdat(0x60+s); /* * 按键 * */void keyscan()if(s1=0)delay(5);if(s1=0)s1num+;while(!s1);switch(s1num)case 1: lcd_pos(1,0);clr_screen(); /设
10、置显示位置为第一行for(i=0;i10;i+)lcd_wdat(DIS1i);delay(30);break;case 2: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i8;i+)lcd_wdat(DIS2i);delay(30);break;case 3: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i6;i+)lcd_wdat(DIS3i);delay(30);break;case 4: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)
11、lcd_wdat(DIS4i);delay(30);break;case 5: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS5i);delay(30);break;case 6: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS6i);delay(30);break;case 7: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS7i);delay(30
12、);break;case 8: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS8i);delay(30);break;case 9: lcd_pos(1,0); clr_screen(); /设置显示位置为第一行for(i=0;i8;i+)lcd_wdat(DIS9i);delay(30);break;case 10: lcd_pos(1,0); clr_screen(); /设置显示位置为第一行for(i=0;i8;i+)lcd_wdat(DIS10i);delay(30);break;case 11: lcd
13、_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS11i);delay(30);break;case 12: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i6;i+)lcd_wdat(DIS12i);delay(30);break;case 13: lcd_pos(1,0); clr_screen(); /设置显示位置为第一行for(i=0;i6;i+)lcd_wdat(DIS13i);delay(30);break;case 14: lcd_pos(1,0);clr_scr
14、een(); /设置显示位置为第一行for(i=0;i6;i+)lcd_wdat(DIS12i);delay(30);break;case 15: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS11i);delay(30);break;case 16: lcd_pos(1,0); clr_screen(); /设置显示位置为第一行for(i=0;i8;i+)lcd_wdat(DIS10i);delay(30);break;case 17: lcd_pos(1,0); clr_screen(); /设置显示位置为第
15、一行for(i=0;i8;i+)lcd_wdat(DIS9i);delay(30);break;case 18: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS8i);delay(30);break;case 19: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS7i);delay(30);break;case 20: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_w
16、dat(DIS6i);delay(30);break;case 21: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS5i);delay(30);break;case 22: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i4;i+)lcd_wdat(DIS4i);delay(30);break;case 23: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i6;i+)lcd_wdat(DIS3i);delay(30);
17、break;case 24: lcd_pos(1,0);clr_screen(); /设置显示位置为第一行for(i=0;i8;i+)lcd_wdat(DIS2i);delay(30);break;case 25: lcd_pos(1,0); /设置显示位置为第一行for(i=0;i10;i+)lcd_wdat(DIS1i);delay(30);break;case 26: s1num=0;break;if(s2=0) clr_screen();lcd_pos(1,0); /设置显示位置为第一行for(i=0;i18;i+)lcd_wdat(DIS14i);delay(30);if(s3=0)
18、 clr_screen();lcd_pos(1,0); /设置显示位置为第一行for(i=0;i32;i+)lcd_wdat(DIS15i);delay(30);/* * 主函数 * */void main()uchar i;delay(100); /上电,等待稳定lcd_init(); /初始化 LCDwhile(1)/*lcd_pos(1,0); /设置显示位置为第一行for(i=0;i10;i+)lcd_wdat(DIS1i);delay(30);lcd_pos(2,0); /设置显示位置为第二行for(i=0;i8;i+)lcd_wdat(DIS2i);delay(30);lcd_pos(3,0); /设置显示位置为第三行for(i=0;i6;i+)lcd_wdat(DIS3i);delay(30);lcd_pos(4,0); /设置显示位置为第四行for(i=0;i4;i+)lcd_wdat(DIS4i);delay(30);delay(1000);*/keyscan();/*/