当前位置:文档之家› 12864LCD动态显示

12864LCD动态显示

/*------------------------------------------------------------------------------PC2 PC3 PC4 PC5 PC6 PC7 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7RS R/W E PSB NC RST DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7RS高电平写数据,低电平写指令代码.R/W高电平为读,低电平为写E为使能信号,PSB高电平为并行模式,低电平为串行模式,RST低电平有效显示地址:80H,81H,......86H,87H.第一行显示地址90H,91H,......96H,97H.第二行显示地址88H,89H,......8EH,8FH.第二行显示地址98H,99H,......9EH,9FH.第三行显示地址写指令01H:显示清屏,写指令02H: 位址归位,写指令0CH:开显示(无游标,不反白)写指令30H:基本指令集,写指令80H:设置DDRAM,写指令10H:显示HCGROM------------------------------------------------------------------------------*/#include <iom16v.h>#include <macros.h>#define RS_H DDRC |= (1<<2);PORTC |= (1<<2); //RS设为高电平#define RS_L DDRC |= (1<<2);PORTC &= ~(1<<2); //RS设为低电平#define RW_H DDRC |= (1<<3);PORTC |= (1<<3); //RW设为高电平#define RW_L DDRC |= (1<<3);PORTC &= ~(1<<3); //RW设为低电平#define E_H DDRC |= (1<<4);PORTC |= (1<<4); //E设为高电平#define E_L DDRC |= (1<<4);PORTC &= ~(1<<4); //E设为低电平#define RST_H DDRC |= (1<<7);PORTC |= (1<<7); //RST为高电平unsigned char MainMenu0[] = {"第二课堂胜风电子"};unsigned char MainMenu1[] = {"数据为:"};unsigned char Shuzi[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','+'};/***********************函数功能:LCD延时子程序入口参数:t********************/ void delay(unsigned int t){ unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/***********************函数功能:端口初始化***********************************/ void PORT_init(){ PORTA = 0xFF;DDRA = 0xFF;PORTC = 0xCE;DDRC = 0xCE;}/**********************函数功能:LCD测试忙程序*********************************//**********************RS=L,RW=H,EN=高脉冲,读取忙碌标志DB7(BF)*****************/unsigned char check_busy(){ unsigned char BF; //忙标志BFDDRA = 0X00; //端口A设为输入方式PORTA = 0XFF;delay(1);RS_L; //RS=0(命令)delay(1);RW_H;delay(1);E_H; //EN=1,使能delay(1);BF = PINA; //读取A口数据delay(1);E_L; //EN=0delay(1);DDRA = 0XFF; //端口A设为输出方式BF &= 0x80; //读取lcd_data第八位return (BF); //读取结果返回}/***********************函数功能:写指令数据到lcd子程序入口参数:cmd**********/ /***********************RS=L,RW=L,EN=高脉冲,DB0-DB7=指令码******************/void lcdwc(unsigned char cmd){ while(check_busy()); //判断LCD是否为忙状态RS_L; //RS=0(指令),RW=0(写)RW_L;PORTA = cmd; //向LCD发送指令E_H; //EN=1,使能delay(5);E_L; //EN=0}/***********************函数功能:写入显示数据到lcd子程序入口参数:data*******/ /***********************RS=H,RW=L,EN=高脉冲,DB0-DB7=数据********************/void lcdwd(unsigned char Data){ while(check_busy()); //判断LCD是否为忙状态RS_H; //RS=1(数据),RW=0(写)RW_L;PORTA = Data; //向LCD写数据E_H; //EN=1,使能delay(5);E_L; //EN=0}/***********************函数功能:lcd初始化子程序******************************/ void lcd_init(){ delay(5);lcdwc(0x30); //功能设置8位数据,基本指令delay(5);lcdwc(0x0C); //显示状态ON,游标OFF,反白OFFdelay(5);lcdwc(0x01); //清除显示,并且设定地址指针为00Hdelay(5);lcdwc(0x02); //地址归位delay(5);lcdwc(0x80); //设置DDRAM地址}/**********************函数功能:LCD显示子程序*********************************//**********************入口参数:y是所选择的行号,p为写入的字符串**************/ void Char_Set_XY(unsigned char y, unsigned char *p){if(y == 0){lcdwc((0x80));}if(y == 1){lcdwc((0x90));}if(y == 2){lcdwc((0x88));}if(y == 3){lcdwc((0x98));}while(*p != 0) //没写完就继续写{lcdwd(*p++);}}/**********************函数功能:LCD浮点数显示*********************************//**********************入口参数:M为显示的数据,add为从哪里开始显示数据********/ void display_f(float M,unsigned char add){ unsigned char ledbuf[7]={0,0,0,0,0,0,0};unsigned char i,j,k;unsigned long m;if(M>0) //正实数处理{ ledbuf[0] = 12;m = M;if(M<10000) {m = 10*M;}if(M<1000) {m = 100*M;}if(M<100) {m = 1000*M;}if(M<10) {m = 10000*M;}}if(M<0) //负实数处理{ ledbuf[0] = 11;m = -1*M;if(M>-10000) {m = -10*M;}if(M>-1000) {m = -100*M;}if(M>-100) {m = -1000*M;}if(M>-10) {m = -10000*M;}}ledbuf[1]=m/10000; //万位ledbuf[2]=m%10000/1000; //千位ledbuf[3]=m%1000/100; //百位ledbuf[4]=m%1000%100/10; //十位ledbuf[5]=m%1000%100%10; //个位ledbuf[6]=10; //小数点if(M>=0) //+号处理{ if(M<10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10;}if(M<1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10;}if(M<100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10;}if(M<10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10;}}if(M<0) //-号处理{ if(M>-10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10; }if(M>-1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10; }if(M>-100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10; }if(M>-10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10; }}lcdwc(add);for(k=0;k<7;k++){ i = ledbuf[k];j = Shuzi[i];lcdwd(j);}}/***********************函数功能:主函数***************************************/ void main(void){ float i = 168.88;PORT_init(); //端口初始化lcd_init(); //初始化LCD屏RST_H;Char_Set_XY(0,MainMenu0); //第一行显示Char_Set_XY(1,MainMenu1); ////第二行显示while(1){ //delay(1000);display_f(i,0x94);delay(100);//i += 0.02;//delay(1000);}}。

相关主题